From c4c1158364005030f0ae5dc2fa58eb7e0e012d84 Mon Sep 17 00:00:00 2001 From: tleety Date: Thu, 10 Sep 2015 23:48:45 +0200 Subject: [PATCH] Working lights and deferred rendering --- include/Core/Engine.h | 54 +++++++++++++------ src/game/Core/Renderer.cpp | 2 +- .../Core/Shaders/Deferred/3/Fragment.glsl | 3 +- src/game/Core/Shaders/Forward/Fragment.glsl | 4 +- 4 files changed, 43 insertions(+), 20 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 6b1250e..0199d78 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -85,7 +85,7 @@ public: { auto t_BrickWall = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_BrickWall); - transform->Position = glm::vec3(-2.f, 0.f, -10.f); + transform->Position = glm::vec3(0.f, 0.f, -10.f); auto sprite = m_World->AddComponent(t_BrickWall); //TODO: Rename SpriteFile to DiffuseTexture or similar. sprite->SpriteFile = "Textures/Test/Brick_Diffuse.png"; @@ -93,18 +93,10 @@ public: sprite->SpecularTexture = "Textures/Test/Brick_Specular.png"; } - { - auto t_Light = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_Light); - transform->Position = glm::vec3(-1.f, 0.f, -9.f); - auto plight = m_World->AddComponent(t_Light); - plight->Radius = 10.f; - } - { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.f, 0.f, -10.f); + transform->Position = glm::vec3(0.f, 0.f, -9.5f); std::shared_ptr sprite = m_World->AddComponent(ent); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; @@ -114,6 +106,9 @@ public: std::shared_ptr physics = m_World->AddComponent(ent); physics->Static = false; + auto plight = m_World->AddComponent(ent); + plight->Radius = 2.f; + m_World->CommitEntity(ent); } @@ -121,7 +116,7 @@ public: { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.f, -3.f, -9.f); + transform->Position = glm::vec3(0.f, -3.f, -10.f); transform->Scale = glm::vec3(2.f, 0.5f, 1.f); //transform->Orientation = glm::rotate(transform->Orientation, glm::radians(45.f), glm::vec3(0, 0, -1)); @@ -212,12 +207,34 @@ public: //TODO: Add LightLoadShit + auto pointLightComponent = m_World->GetComponent(entity); + if (pointLightComponent) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + EnqueuePointLight(absoluteTransform.Position, + pointLightComponent->Diffuse, + pointLightComponent->Specular, + pointLightComponent->Radius); + } + + auto spriteComponent = m_World->GetComponent(entity); if (spriteComponent) { + + std::string normal = spriteComponent->NormalTexture; + std::string spec = spriteComponent->SpecularTexture; + + if (normal.empty()) { + normal = "Textures/Core/NeutralNormalMap.png"; + } + if (spec.empty()) { + spec = "Textures/Core/NeutralSpecularMap.png"; + } auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); - auto texturenorm = ResourceManager::Load(spriteComponent->NormalTexture); - auto texturespec = ResourceManager::Load(spriteComponent->SpecularTexture); + auto texturenorm = ResourceManager::Load(normal); + auto texturespec = ResourceManager::Load(spec); + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); glm::quat orientation2D = glm::angleAxis(glm::eulerAngles(absoluteTransform.Orientation).z, glm::vec3(0, 0, -1)); @@ -263,13 +280,18 @@ public: job.ModelMatrix = modelMatrix; job.Color = color; - m_RendererQueue.Forward.Add(job); + m_RendererQueue.Deferred.Add(job); } - void EnQueuePointLight(glm::vec3* position) + void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) { PointLightJob job; - job.Position = *position; + job.Position = position; + job.DiffuseColor = diffuseColor; + job.SpecularColor = specularColor; + job.Radius = radius; + + m_RendererQueue.Lights.Add(job); } diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 48e2afc..59c08b1 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -265,7 +265,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred3->Bind(); - glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.3f))); + glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GDiffuse); glActiveTexture(GL_TEXTURE1); diff --git a/src/game/Core/Shaders/Deferred/3/Fragment.glsl b/src/game/Core/Shaders/Deferred/3/Fragment.glsl index 08b7f08..27e9c62 100755 --- a/src/game/Core/Shaders/Deferred/3/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/3/Fragment.glsl @@ -38,6 +38,7 @@ void main() //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) * (vec4(LightingTexel.rgb, 0.0) + vec4(LightingTexel.a, LightingTexel.a, LightingTexel.a, 0.0))); //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) + LightingTexel); - frag_Diffuse = DiffuseTexel; + frag_Diffuse = DiffuseTexel * (vec4(1.f, 1.f, 1.f, 0.0) + LightingTexel); + //frag_Diffuse = DiffuseTexel; //frag_Diffuse = vec4(LightingTexel.r, LightingTexel.g, LightingTexel.b, 1.0); } \ No newline at end of file diff --git a/src/game/Core/Shaders/Forward/Fragment.glsl b/src/game/Core/Shaders/Forward/Fragment.glsl index 83279c0..144062f 100755 --- a/src/game/Core/Shaders/Forward/Fragment.glsl +++ b/src/game/Core/Shaders/Forward/Fragment.glsl @@ -84,6 +84,6 @@ void main() vec4 diffuseTexel = texture(DiffuseTexture, Input.TextureCoord); - //FragmentColor = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); - FragmentColor = diffuseTexel; + FragmentColor = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); + //FragmentColor = diffuseTexel; } \ No newline at end of file