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
{
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;
};
}
+3 -5
View File
@@ -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<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");
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<Components::Model>(Light, "Model");
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_SunTarget = glm::vec3(0, 0, 0);
m_SunProjection = glm::ortho<float>(-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<Shader>(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;
}
+19 -10
View File
@@ -24,13 +24,7 @@ public:
int HEIGHT, WIDTH;
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_linearAttenuation;
std::vector<float> 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<Light> 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();
+3 -1
View File
@@ -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);
}
+3 -3
View File
@@ -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;
+2 -1
View File
@@ -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
);
}