From 5e68334ce958aa4733ba6f30b49285d5f06aec19 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Mon, 27 Jan 2014 19:10:34 +0100 Subject: [PATCH] PointLight: Use depthbuffer --- data/shaders/pointlight.frag | 3 ++- src/graphics/post_processing.cpp | 3 ++- src/graphics/shaders.cpp | 5 ++++- src/graphics/shaders.hpp | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/shaders/pointlight.frag b/data/shaders/pointlight.frag index 591146695..62c1507b0 100644 --- a/data/shaders/pointlight.frag +++ b/data/shaders/pointlight.frag @@ -1,5 +1,6 @@ #version 130 uniform sampler2D ntex; +uniform sampler2D dtex; uniform vec4 center[16]; uniform vec4 col[16]; @@ -14,7 +15,7 @@ out vec4 Specular; void main() { vec2 texc = uv; - float z = texture(ntex, texc).a; + float z = texture(dtex, texc).x; vec3 norm = texture(ntex, texc).xyz; norm = (norm - 0.5) * 2.0; diff --git a/src/graphics/post_processing.cpp b/src/graphics/post_processing.cpp index 495bf1aaf..72d2c9a06 100644 --- a/src/graphics/post_processing.cpp +++ b/src/graphics/post_processing.cpp @@ -313,7 +313,8 @@ void PostProcessing::renderPointlight(const std::vector &positions, const glBindVertexArray(FullScreenShader::PointLightShader::vao); setTexture(0, static_cast(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH))->getOpenGLTextureName(), GL_NEAREST, GL_NEAREST); - FullScreenShader::PointLightShader::setUniforms(irr_driver->getInvProjMatrix(), irr_driver->getViewMatrix(), positions, colors, energy, 200, 0); + setTexture(1, static_cast(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH))->DepthBufferTexture, GL_NEAREST, GL_NEAREST); + FullScreenShader::PointLightShader::setUniforms(irr_driver->getInvProjMatrix(), irr_driver->getViewMatrix(), positions, colors, energy, 200, 0, 1); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index d7c1c438d..94efe0379 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -1108,6 +1108,7 @@ namespace FullScreenShader GLuint PointLightShader::Program; GLuint PointLightShader::uniform_ntex; + GLuint PointLightShader::uniform_dtex; GLuint PointLightShader::uniform_center; GLuint PointLightShader::uniform_col; GLuint PointLightShader::uniform_energy; @@ -1120,6 +1121,7 @@ namespace FullScreenShader { Program = LoadProgram(file_manager->getAsset("shaders/screenquad.vert").c_str(), file_manager->getAsset("shaders/pointlight.frag").c_str()); uniform_ntex = glGetUniformLocation(Program, "ntex"); + uniform_dtex = glGetUniformLocation(Program, "dtex"); uniform_center = glGetUniformLocation(Program, "center[0]"); uniform_col = glGetUniformLocation(Program, "col[0]"); uniform_energy = glGetUniformLocation(Program, "energy[0]"); @@ -1129,7 +1131,7 @@ namespace FullScreenShader vao = createVAO(Program); } - void PointLightShader::setUniforms(const core::matrix4 &InvProjMatrix, const core::matrix4 &ViewMatrix, const std::vector &positions, const std::vector &colors, const std::vector &energy, unsigned spec, unsigned TU_ntex) + void PointLightShader::setUniforms(const core::matrix4 &InvProjMatrix, const core::matrix4 &ViewMatrix, const std::vector &positions, const std::vector &colors, const std::vector &energy, unsigned spec, unsigned TU_ntex, unsigned TU_dtex) { glUniform4fv(FullScreenShader::PointLightShader::uniform_center, 16, positions.data()); glUniform4fv(FullScreenShader::PointLightShader::uniform_col, 16, colors.data()); @@ -1139,6 +1141,7 @@ namespace FullScreenShader glUniformMatrix4fv(FullScreenShader::PointLightShader::uniform_viewm, 1, GL_FALSE, ViewMatrix.pointer()); glUniform1i(FullScreenShader::PointLightShader::uniform_ntex, TU_ntex); + glUniform1i(FullScreenShader::PointLightShader::uniform_dtex, TU_dtex); } GLuint SunLightShader::Program; diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 025a532d6..15af68d6a 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -323,11 +323,11 @@ class PointLightShader { public: static GLuint Program; - static GLuint uniform_ntex, uniform_center, uniform_col, uniform_energy, uniform_spec, uniform_invproj, uniform_viewm; + static GLuint uniform_ntex, uniform_dtex, uniform_center, uniform_col, uniform_energy, uniform_spec, uniform_invproj, uniform_viewm; static GLuint vao; static void init(); - static void setUniforms(const core::matrix4 &InvProjMatrix, const core::matrix4 &ViewMatrix, const std::vector &positions, const std::vector &colors, const std::vector &energy, unsigned spec, unsigned TU_ntex); + static void setUniforms(const core::matrix4 &InvProjMatrix, const core::matrix4 &ViewMatrix, const std::vector &positions, const std::vector &colors, const std::vector &energy, unsigned spec, unsigned TU_ntex, unsigned TU_dtex); }; class SunLightShader