diff --git a/src/Components/PointLight.h b/src/Components/PointLight.h index 29da989..ef6eec5 100755 --- a/src/Components/PointLight.h +++ b/src/Components/PointLight.h @@ -9,15 +9,20 @@ namespace Components struct PointLight : Component { - float Intensity; - float MaxRange; + PointLight() + : Specular(1.0f, 1.0f, 1.0f) + , Diffuse(0.4f, 0.4f, 0.4f) + , specularExponent(50.0f) + , Scale(10.0f) + { } + float constantAttenuation, linearAttenuation, quadraticAttenuation; - float spotExponent; Color color; glm::vec3 Specular; glm::vec3 Diffuse; float specularExponent; + float Scale; }; } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 3002e6b..f703c76 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -224,15 +224,13 @@ void GameWorld::Initialize() CommitEntity(car); } */ - for(int i = 0; i < 6; i++) + for(int i = 0; i < 20; i++) { auto Light = CreateEntity(); auto transform = AddComponent(Light, "Transform"); - transform->Position = glm::vec3(20+ 10*cos(i), 3, 0 + 10*sin(i)); + transform->Position = glm::vec3(i*cos(i), 3, 0 + i*sin(i)); auto light = AddComponent(Light, "PointLight"); - light->Diffuse = glm::vec3(0.5f, 0.5f, 1.0f); - light->Specular = glm::vec3(1.0f, 1.0f, 1.0f); - light->specularExponent = 1.0f; + //light->Specular = glm::vec3(1.0f, 1.0f, 1.0f); auto model = AddComponent(Light, "Model"); model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj"; } diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 8e6c999..82ac29a 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -18,7 +18,7 @@ Renderer::Renderer() m_SunPosition = glm::vec3(0, 3.5f, 10); m_SunTarget = glm::vec3(0, 0, 0); m_SunProjection = glm::ortho(-100, 100, -100, 100, -100, 100); - Lights = 0; +/* Lights = 0;*/ } void Renderer::Initialize() @@ -132,7 +132,7 @@ void Renderer::LoadContent() m_FinalPassProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/FinalPass.frag.glsl"))); m_FinalPassProgram.Compile(); m_FinalPassProgram.Link(); - + Gamma = 1; m_ScreenQuad = CreateQuad(); FrameBufferTextures(); @@ -150,6 +150,17 @@ void Renderer::Draw(double dt) m_QuadView = true; } + if(glfwGetKey(m_Window, GLFW_KEY_KP_1)) + { + Gamma -= 0.3f * dt; + LOG_INFO("Gamma_UP: %f", Gamma); + } + if(glfwGetKey(m_Window, GLFW_KEY_KP_4)) + { + Gamma += 0.3f * dt; + LOG_INFO("Gamma_DOWN: %f", Gamma); + } + glDisable(GL_BLEND); DrawFBO(); @@ -200,14 +211,14 @@ void Renderer::DrawScene() ); m_ShaderProgram.Bind(); - glUniform1i(glGetUniformLocation(m_ShaderProgram.GetHandle(), "numberOfLights"), Lights); + glUniform1i(glGetUniformLocation(m_ShaderProgram.GetHandle(), "numberOfLights"), Lights.size()); // glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "position"), Lights, Light_position.data()); // glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "specular"), Lights, Light_specular.data()); // glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "diffuse"), Lights, Light_diffuse.data()); - glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "constantAttenuation"), Lights, Light_constantAttenuation.data()); - glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights, Light_linearAttenuation.data()); - glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights, Light_quadraticAttenuation.data()); - glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights, Light_spotExponent.data()); + glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "constantAttenuation"), Lights.size(), Light_constantAttenuation.data()); + glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights.size(), Light_linearAttenuation.data()); + glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights.size(), Light_quadraticAttenuation.data()); + glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights.size(), Light_spotExponent.data()); if (m_DrawWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -361,30 +372,18 @@ void Renderer::AddPointLightToDraw( glm::vec3 _position, glm::vec3 _specular, glm::vec3 _diffuse, - float _specularExponent + float _specularExponent, + float _scale ) { - Light_position.push_back(_position); - Light_specular.push_back(_specular); - Light_diffuse.push_back(_diffuse); - Light_specularExponent.push_back(_specularExponent); - Lights = Light_position.size(); - CreateLightMatrix(); - -// Light_position.push_back(_position.x); -// Light_position.push_back(_position.y); -// Light_position.push_back(_position.z); -// Light_specular.push_back(_specular.x); -// Light_specular.push_back(_specular.y); -// Light_specular.push_back(_specular.z); -// Light_diffuse.push_back(_diffuse.x); -// Light_diffuse.push_back(_diffuse.y); -// Light_diffuse.push_back(_diffuse.z); -// Light_constantAttenuation.push_back(_constantAttenuation); -// Light_linearAttenuation.push_back(_linearAttenuation); -// Light_quadraticAttenuation.push_back(_quadraticAttenuation); -// Light_spotExponent.push_back(_spotExponent); -// Lights = Light_constantAttenuation.size(); + Light light; + light.Position = _position; + light.Diffuse = _diffuse; + light.Specular = _specular; + light.Scale = _scale; + light.SpecularExponent = _specularExponent; + light.SphereModelMatrix = CreateLightMatrix(light); + Lights.push_back(light); } void Renderer::AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding) @@ -522,15 +521,7 @@ void Renderer::ClearStuff() { AABBsToRender.clear(); ModelsToRender.clear(); - Light_position.clear(); - Light_specular.clear(); - Light_diffuse.clear(); - Light_constantAttenuation.clear(); - Light_linearAttenuation.clear(); - Light_quadraticAttenuation.clear(); - Light_spotExponent.clear(); - Light_specularExponent.clear(); - Lights = 0; + Lights.clear(); } #pragma endregion @@ -663,6 +654,7 @@ void Renderer::DrawFBO() // Ambient light glUniform3fv(glGetUniformLocation(m_FinalPassProgram.GetHandle(), "La"), 1, glm::value_ptr(glm::vec3(0.3f, 0.3f, 0.3f))); + glUniform1f(glGetUniformLocation(m_FinalPassProgram.GetHandle(), "Gamma"), Gamma); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_fDiffuseTexture); @@ -719,22 +711,21 @@ void Renderer::DrawLightScene() glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); glm::mat4 MVP; - for(int i = 0; i < Lights; i++) + for (auto &light : Lights) { - MVP = cameraMatrix * lM[i]; + MVP = cameraMatrix * light.SphereModelMatrix; glUniform2fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "ViewportSize"), 1,glm::value_ptr(glm::vec2(WIDTH, HEIGHT))); glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); - glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(lM[i])); - glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "la"), 1, glm::value_ptr(glm::vec3(0.3f, 0.3f, 0.3f))); - glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "ls"), 1, glm::value_ptr(Light_specular[i])); - glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "ld"), 1, glm::value_ptr(Light_diffuse[i])); - glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "lp"), 1, glm::value_ptr(Light_position[i])); - glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "LightRadius"), 5.0f); + glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(light.SphereModelMatrix)); + glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "ls"), 1, glm::value_ptr(light.Specular)); + glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "ld"), 1, glm::value_ptr(light.Diffuse)); + glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "lp"), 1, glm::value_ptr(light.Position)); + glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "LightRadius"), light.Scale/2.f); glUniform3f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "CameraPosition"), m_Camera->Position().x, m_Camera->Position().y, m_Camera->Position().z); - //glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "speculatExponent"), Light_specularExponent[i]); + glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "specularExponent"), light.SpecularExponent); glDrawArrays(GL_TRIANGLES, 0, m_sphereModel->Vertices.size()); }; glEnable (GL_DEPTH_TEST); @@ -747,16 +738,11 @@ void Renderer::SetSphereModel( Model* _model ) m_sphereModel = _model; } -void Renderer::CreateLightMatrix() +glm::mat4 Renderer::CreateLightMatrix(Light &_light) { - for(int i = 0; i < Lights; i++) - { - const float scale = 10.0f; - glm::mat4 model; - model *= glm::translate(Light_position[i]); - model *= glm::scale(glm::vec3(scale)); - lM[i] = model; - } - + glm::mat4 model; + model *= glm::translate(_light.Position); + model *= glm::scale(glm::vec3(_light.Scale)); + return model; } diff --git a/src/Renderer.h b/src/Renderer.h index 6754701..0a8bc12 100755 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -24,13 +24,7 @@ public: int HEIGHT, WIDTH; std::list> ModelsToRender; - int Lights; - std::vector Light_position; - std::vector Light_specular; - std::vector Light_diffuse; - std::vector Light_specularExponent; - - + std::vector Light_constantAttenuation; std::vector Light_linearAttenuation; std::vector Light_quadraticAttenuation; @@ -50,7 +44,8 @@ public: glm::vec3 _position, glm::vec3 _specular, glm::vec3 _diffuse, - float _specularExponent + float _specularExponent, + float _scale ); void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding); @@ -72,6 +67,21 @@ public: private: + + struct Light + { + glm::vec3 Position; + glm::vec3 Specular; + glm::vec3 Diffuse; + float SpecularExponent; + float Scale; + glm::mat4 SphereModelMatrix; + }; + + float Gamma; + + std::list Lights; + GLFWwindow* m_Window; GLint m_glVersion[2]; GLchar* m_glVendor; @@ -101,7 +111,6 @@ private: GLuint m_fDepthBuffer; GLenum draw_bufs[2]; - glm::mat4 lM[5]; GLuint m_ScreenQuad; Model* m_sphereModel; @@ -133,7 +142,7 @@ private: void DrawFBOScene(); void DrawLightScene(); void BindFragDataLocation(); - void CreateLightMatrix(); + glm::mat4 CreateLightMatrix(Light &_light); GLuint CreateQuad(); void DrawDebugShadowMap(); diff --git a/src/Shaders/FinalPass.frag.glsl b/src/Shaders/FinalPass.frag.glsl index 8509ea8..c6b9257 100644 --- a/src/Shaders/FinalPass.frag.glsl +++ b/src/Shaders/FinalPass.frag.glsl @@ -1,6 +1,7 @@ #version 430 uniform vec3 La; +uniform float Gamma; layout (binding=0) uniform sampler2D DiffuseTexture; layout (binding=1) uniform sampler2D LightingTexture; @@ -18,5 +19,6 @@ void main() vec4 DiffuseTexel = texture(DiffuseTexture, Input.TextureCoord); vec4 LightingTexel = texture(LightingTexture, Input.TextureCoord); - FragmentColor = DiffuseTexel * vec4(La, 1.0) + LightingTexel; + vec4 _FragmentColor = DiffuseTexel * vec4(La, 1.0) + LightingTexel; + FragmentColor = vec4(pow(_FragmentColor.rgb, vec3(1.0 / Gamma)), _FragmentColor.a); } \ No newline at end of file diff --git a/src/Shaders/Fragment2.glsl b/src/Shaders/Fragment2.glsl index 4dde49f..2467d35 100644 --- a/src/Shaders/Fragment2.glsl +++ b/src/Shaders/Fragment2.glsl @@ -13,11 +13,11 @@ uniform vec3 ls; uniform vec3 ld; uniform vec3 lp; uniform float LightRadius; -const float specularExponent = 50.0; +uniform float specularExponent; uniform vec3 CameraPosition; -const vec3 ks = vec3(1.0, 0.0, 0.0); -const vec3 kd = vec3(0.8, 0.8, 0.8); +const vec3 ks = vec3(1.0, 1.0, 1.0); +const vec3 kd = vec3(1.0, 1.0, 1.0); const vec3 ka = vec3(1.0, 1.0, 1.0); const float kshine = 1.0; diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp index 2dc4116..47bc389 100755 --- a/src/Systems/RenderSystem.cpp +++ b/src/Systems/RenderSystem.cpp @@ -38,7 +38,8 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa position, pointLightComponent->Specular, pointLightComponent->Diffuse, - pointLightComponent->specularExponent + pointLightComponent->specularExponent, + pointLightComponent->Scale ); }