Fixed lights and added a bad gamma correction

This commit is contained in:
Tleety
2014-05-10 19:51:48 +02:00
parent d00ff3c2ed
commit c1c30b0019
7 changed files with 81 additions and 80 deletions
+8 -3
View File
@@ -9,15 +9,20 @@ namespace Components
struct PointLight : Component struct PointLight : Component
{ {
float Intensity; PointLight()
float MaxRange; : 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 constantAttenuation, linearAttenuation, quadraticAttenuation;
float spotExponent;
Color color; Color color;
glm::vec3 Specular; glm::vec3 Specular;
glm::vec3 Diffuse; glm::vec3 Diffuse;
float specularExponent; float specularExponent;
float Scale;
}; };
} }
+3 -5
View File
@@ -224,15 +224,13 @@ void GameWorld::Initialize()
CommitEntity(car); CommitEntity(car);
} }
*/ */
for(int i = 0; i < 6; i++) for(int i = 0; i < 20; i++)
{ {
auto Light = CreateEntity(); auto Light = CreateEntity();
auto transform = AddComponent<Components::Transform>(Light, "Transform"); auto transform = AddComponent<Components::Transform>(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<Components::PointLight>(Light, "PointLight"); auto light = AddComponent<Components::PointLight>(Light, "PointLight");
light->Diffuse = glm::vec3(0.5f, 0.5f, 1.0f); //light->Specular = glm::vec3(1.0f, 1.0f, 1.0f);
light->Specular = glm::vec3(1.0f, 1.0f, 1.0f);
light->specularExponent = 1.0f;
auto model = AddComponent<Components::Model>(Light, "Model"); auto model = AddComponent<Components::Model>(Light, "Model");
model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj"; model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj";
} }
+43 -57
View File
@@ -18,7 +18,7 @@ Renderer::Renderer()
m_SunPosition = glm::vec3(0, 3.5f, 10); m_SunPosition = glm::vec3(0, 3.5f, 10);
m_SunTarget = glm::vec3(0, 0, 0); m_SunTarget = glm::vec3(0, 0, 0);
m_SunProjection = glm::ortho<float>(-100, 100, -100, 100, -100, 100); m_SunProjection = glm::ortho<float>(-100, 100, -100, 100, -100, 100);
Lights = 0; /* Lights = 0;*/
} }
void Renderer::Initialize() void Renderer::Initialize()
@@ -132,7 +132,7 @@ void Renderer::LoadContent()
m_FinalPassProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/FinalPass.frag.glsl"))); m_FinalPassProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/FinalPass.frag.glsl")));
m_FinalPassProgram.Compile(); m_FinalPassProgram.Compile();
m_FinalPassProgram.Link(); m_FinalPassProgram.Link();
Gamma = 1;
m_ScreenQuad = CreateQuad(); m_ScreenQuad = CreateQuad();
FrameBufferTextures(); FrameBufferTextures();
@@ -150,6 +150,17 @@ void Renderer::Draw(double dt)
m_QuadView = true; 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); glDisable(GL_BLEND);
DrawFBO(); DrawFBO();
@@ -200,14 +211,14 @@ void Renderer::DrawScene()
); );
m_ShaderProgram.Bind(); 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(), "position"), Lights, Light_position.data());
// glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "specular"), Lights, Light_specular.data()); // glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "specular"), Lights, Light_specular.data());
// glUniform3fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "diffuse"), Lights, Light_diffuse.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(), "constantAttenuation"), Lights.size(), Light_constantAttenuation.data());
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights, Light_linearAttenuation.data()); glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights.size(), Light_linearAttenuation.data());
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights, Light_quadraticAttenuation.data()); glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights.size(), Light_quadraticAttenuation.data());
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights, Light_spotExponent.data()); glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights.size(), Light_spotExponent.data());
if (m_DrawWireframe) if (m_DrawWireframe)
{ {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -361,30 +372,18 @@ void Renderer::AddPointLightToDraw(
glm::vec3 _position, glm::vec3 _position,
glm::vec3 _specular, glm::vec3 _specular,
glm::vec3 _diffuse, glm::vec3 _diffuse,
float _specularExponent float _specularExponent,
float _scale
) )
{ {
Light_position.push_back(_position); Light light;
Light_specular.push_back(_specular); light.Position = _position;
Light_diffuse.push_back(_diffuse); light.Diffuse = _diffuse;
Light_specularExponent.push_back(_specularExponent); light.Specular = _specular;
Lights = Light_position.size(); light.Scale = _scale;
CreateLightMatrix(); light.SpecularExponent = _specularExponent;
light.SphereModelMatrix = CreateLightMatrix(light);
// Light_position.push_back(_position.x); Lights.push_back(light);
// 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();
} }
void Renderer::AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding) void Renderer::AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding)
@@ -522,15 +521,7 @@ void Renderer::ClearStuff()
{ {
AABBsToRender.clear(); AABBsToRender.clear();
ModelsToRender.clear(); ModelsToRender.clear();
Light_position.clear(); Lights.clear();
Light_specular.clear();
Light_diffuse.clear();
Light_constantAttenuation.clear();
Light_linearAttenuation.clear();
Light_quadraticAttenuation.clear();
Light_spotExponent.clear();
Light_specularExponent.clear();
Lights = 0;
} }
#pragma endregion #pragma endregion
@@ -663,6 +654,7 @@ void Renderer::DrawFBO()
// Ambient light // Ambient light
glUniform3fv(glGetUniformLocation(m_FinalPassProgram.GetHandle(), "La"), 1, glm::value_ptr(glm::vec3(0.3f, 0.3f, 0.3f))); 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); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_fDiffuseTexture); glBindTexture(GL_TEXTURE_2D, m_fDiffuseTexture);
@@ -719,22 +711,21 @@ void Renderer::DrawLightScene()
glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix();
glm::mat4 MVP; 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))); 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(), "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(), "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(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix()));
glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(lM[i])); glUniformMatrix4fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(light.SphereModelMatrix));
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));
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));
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));
glUniform3fv(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "lp"), 1, glm::value_ptr(Light_position[i])); glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "LightRadius"), light.Scale/2.f);
glUniform1f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "LightRadius"), 5.0f);
glUniform3f(glGetUniformLocation(m_SecondPassProgram.GetHandle(), "CameraPosition"), m_Camera->Position().x, m_Camera->Position().y, m_Camera->Position().z); 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()); glDrawArrays(GL_TRIANGLES, 0, m_sphereModel->Vertices.size());
}; };
glEnable (GL_DEPTH_TEST); glEnable (GL_DEPTH_TEST);
@@ -747,16 +738,11 @@ void Renderer::SetSphereModel( Model* _model )
m_sphereModel = _model; m_sphereModel = _model;
} }
void Renderer::CreateLightMatrix() glm::mat4 Renderer::CreateLightMatrix(Light &_light)
{ {
for(int i = 0; i < Lights; i++) glm::mat4 model;
{ model *= glm::translate(_light.Position);
const float scale = 10.0f; model *= glm::scale(glm::vec3(_light.Scale));
glm::mat4 model; return model;
model *= glm::translate(Light_position[i]);
model *= glm::scale(glm::vec3(scale));
lM[i] = model;
}
} }
+18 -9
View File
@@ -24,12 +24,6 @@ public:
int HEIGHT, WIDTH; int HEIGHT, WIDTH;
std::list<std::tuple<Model*, glm::mat4, bool, bool>> ModelsToRender; std::list<std::tuple<Model*, glm::mat4, bool, bool>> ModelsToRender;
int Lights;
std::vector<glm::vec3> Light_position;
std::vector<glm::vec3> Light_specular;
std::vector<glm::vec3> Light_diffuse;
std::vector<float> Light_specularExponent;
std::vector<float> Light_constantAttenuation; std::vector<float> Light_constantAttenuation;
std::vector<float> Light_linearAttenuation; std::vector<float> Light_linearAttenuation;
@@ -50,7 +44,8 @@ public:
glm::vec3 _position, glm::vec3 _position,
glm::vec3 _specular, glm::vec3 _specular,
glm::vec3 _diffuse, glm::vec3 _diffuse,
float _specularExponent float _specularExponent,
float _scale
); );
void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding); void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding);
@@ -72,6 +67,21 @@ public:
private: private:
struct Light
{
glm::vec3 Position;
glm::vec3 Specular;
glm::vec3 Diffuse;
float SpecularExponent;
float Scale;
glm::mat4 SphereModelMatrix;
};
float Gamma;
std::list<Light> Lights;
GLFWwindow* m_Window; GLFWwindow* m_Window;
GLint m_glVersion[2]; GLint m_glVersion[2];
GLchar* m_glVendor; GLchar* m_glVendor;
@@ -101,7 +111,6 @@ private:
GLuint m_fDepthBuffer; GLuint m_fDepthBuffer;
GLenum draw_bufs[2]; GLenum draw_bufs[2];
glm::mat4 lM[5];
GLuint m_ScreenQuad; GLuint m_ScreenQuad;
Model* m_sphereModel; Model* m_sphereModel;
@@ -133,7 +142,7 @@ private:
void DrawFBOScene(); void DrawFBOScene();
void DrawLightScene(); void DrawLightScene();
void BindFragDataLocation(); void BindFragDataLocation();
void CreateLightMatrix(); glm::mat4 CreateLightMatrix(Light &_light);
GLuint CreateQuad(); GLuint CreateQuad();
void DrawDebugShadowMap(); void DrawDebugShadowMap();
+3 -1
View File
@@ -1,6 +1,7 @@
#version 430 #version 430
uniform vec3 La; uniform vec3 La;
uniform float Gamma;
layout (binding=0) uniform sampler2D DiffuseTexture; layout (binding=0) uniform sampler2D DiffuseTexture;
layout (binding=1) uniform sampler2D LightingTexture; layout (binding=1) uniform sampler2D LightingTexture;
@@ -18,5 +19,6 @@ void main()
vec4 DiffuseTexel = texture(DiffuseTexture, Input.TextureCoord); vec4 DiffuseTexel = texture(DiffuseTexture, Input.TextureCoord);
vec4 LightingTexel = texture(LightingTexture, 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);
} }
+3 -3
View File
@@ -13,11 +13,11 @@ uniform vec3 ls;
uniform vec3 ld; uniform vec3 ld;
uniform vec3 lp; uniform vec3 lp;
uniform float LightRadius; uniform float LightRadius;
const float specularExponent = 50.0; uniform float specularExponent;
uniform vec3 CameraPosition; uniform vec3 CameraPosition;
const vec3 ks = vec3(1.0, 0.0, 0.0); const vec3 ks = vec3(1.0, 1.0, 1.0);
const vec3 kd = vec3(0.8, 0.8, 0.8); const vec3 kd = vec3(1.0, 1.0, 1.0);
const vec3 ka = vec3(1.0, 1.0, 1.0); const vec3 ka = vec3(1.0, 1.0, 1.0);
const float kshine = 1.0; const float kshine = 1.0;
+2 -1
View File
@@ -38,7 +38,8 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
position, position,
pointLightComponent->Specular, pointLightComponent->Specular,
pointLightComponent->Diffuse, pointLightComponent->Diffuse,
pointLightComponent->specularExponent pointLightComponent->specularExponent,
pointLightComponent->Scale
); );
} }