diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 55cd40b..50c820b 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -72,6 +72,8 @@ void Renderer::Initialize() glEnable(GL_DEPTH_TEST); LoadContent(); + + FrameBufferTextures(); } void Renderer::LoadContent() @@ -110,6 +112,11 @@ void Renderer::LoadContent() m_ShaderProgramSkybox.Compile(); m_ShaderProgramSkybox.Link(); + m_FirstPassProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/First_pass.vert.glsl"))); + m_FirstPassProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/First_pass.frag.glsl"))); + m_FirstPassProgram.Compile(); + m_FirstPassProgram.Link(); + m_Skybox = std::make_shared("Textures/Skybox/Sunset", "jpg"); m_DebugAABB = CreateAABB(); @@ -147,43 +154,17 @@ void Renderer::Draw(double dt) { glDisable(GL_BLEND); - DrawSkybox(); - DrawShadowMap(); - DrawScene(); - -#ifdef DEBUG - // Draw bounding boxes - if (m_DrawBounds) - { - glEnable(GL_BLEND); - glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); - m_ShaderProgramDebugAABB.Bind(); - for (auto tuple : AABBsToRender) - { - glm::mat4 modelMatrix; - bool colliding; - std::tie(modelMatrix, colliding) = tuple; - // Model matrix - glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); - glm::mat4 MVP = cameraMatrix * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramDebugAABB.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); - // Color - glm::vec4 color(1.f, 1.f, 1.f, 0.f); - if (colliding) - color = glm::vec4(1.f, 0.f, 0.f, 0.f); - glUniform4fv(glGetUniformLocation(m_ShaderProgramDebugAABB.GetHandle(), "Color"), 1, glm::value_ptr(color)); - glBindVertexArray(m_DebugAABB); - glDrawArrays(GL_LINES, 0, 24); - } - } - - DrawDebugShadowMap(); -#endif + DrawFBO(); ClearStuff(); glfwSwapBuffers(m_Window); } +#pragma region TempRegion + + + + void Renderer::DrawSkybox() { glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -199,8 +180,8 @@ void Renderer::DrawSkybox() void Renderer::DrawScene() { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0, 0, WIDTH, HEIGHT); +// glBindFramebuffer(GL_FRAMEBUFFER, 0); +// glViewport(0, 0, WIDTH, HEIGHT); glClear(GL_DEPTH_BUFFER_BIT); //glClearColor(1.0f, 1.0f, 0.0f, 1.0f); @@ -537,6 +518,7 @@ GLuint Renderer::CreateSkybox() return vao; } + void Renderer::ClearStuff() { AABBsToRender.clear(); @@ -549,4 +531,144 @@ void Renderer::ClearStuff() Light_quadraticAttenuation.clear(); Light_spotExponent.clear(); Lights = 0; -} \ No newline at end of file +} + +#pragma endregion + +void Renderer::FrameBufferTextures() +{ + m_fb = 0; + + glGenFramebuffers(1, &m_fb); + GLERROR("GLERROR: Failed to generate frame buffer"); + glGenTextures(1, &m_fb_PositionTexture); + GLERROR("GLERROR: Failed to generate Position texture"); + glBindTexture(GL_TEXTURE_2D, m_fb_PositionTexture); + GLERROR("GLERROR: Failed to bind Position texture"); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGB16F, + WIDTH, + HEIGHT, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL + ); + GLERROR("GLERROR: Failed to generate Position texture image"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + GLERROR("GLERROR: Failed to generate Position Parameters"); + + glGenTextures(1, &m_fb_NormalsTexture); + GLERROR("GLERROR: Failed to generate Normal texture"); + glBindTexture(GL_TEXTURE_2D, m_fb_NormalsTexture); + GLERROR("GLERROR: Failed to bind Normal texture"); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGB16F, + WIDTH, + HEIGHT, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL + ); + GLERROR("GLERROR: Failed to generate Normal texture image"); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + GLERROR("GLERROR: Failed to generate Normals Parameters"); + + glBindFramebuffer(GL_FRAMEBUFFER, m_fb); + GLERROR("GLERROR: Failed to bind framebuffer"); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_fb_PositionTexture, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_fb_NormalsTexture, 0); + GLERROR("GLERROR: Failed to FrameBufferTexture2D"); + + m_rb = 0; + glGenRenderbuffers(1, &m_rb); + GLERROR("GLERROR: Failed to generate RenderBuffer"); + glBindRenderbuffer(GL_RENDERBUFFER, m_rb); + GLERROR("GLERROR: Failed to bind RenderBuffer"); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WIDTH, HEIGHT); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rb); + + draw_bufs[1] = GL_COLOR_ATTACHMENT0; + draw_bufs[2] = GL_COLOR_ATTACHMENT1; + + +} + +void Renderer::DrawFBO() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glBindFramebuffer(GL_FRAMEBUFFER, m_fb); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); +#ifdef DEBUG + glDisable(GL_CULL_FACE); + glPolygonMode(GL_BACK, GL_LINE); +#endif + + // Draw models + glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate(-m_Camera->Position() * glm::vec3(1, 0, 0)); + glm::mat4 depthCamera = m_SunProjection * depthViewMatrix; + glm::mat4 biasMatrix( + 0.5, 0.0, 0.0, 0.0, + 0.0, 0.5, 0.0, 0.0, + 0.0, 0.0, 0.5, 0.0, + 0.5, 0.5, 0.5, 1.0 + ); + + m_ShaderProgram.Bind(); + if (m_DrawWireframe) + { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } + glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); + glm::mat4 depthCameraMatrix = biasMatrix * depthCamera; + glm::mat4 MVP; + glm::mat4 depthMVP; + for (auto tuple : ModelsToRender) + { + Model* model; + glm::mat4 modelMatrix; + bool visible; + std::tie(model, modelMatrix, visible, std::ignore) = tuple; + if (!visible) + continue; + + MVP = cameraMatrix * modelMatrix; + depthMVP = depthCameraMatrix * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr( m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); + glBindVertexArray(model->VAO); +// for (auto texGroup : model->TextureGroups) +// { +// glActiveTexture(GL_TEXTURE0); +// glBindTexture(GL_TEXTURE_2D, *texGroup.Texture); +// glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1); +// } + } + +#ifdef DEBUG + // Debug draw model normals + if (m_DrawNormals) + { + m_ShaderProgramNormals.Bind(); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + DrawModels(m_ShaderProgramNormals); + } +#endif + + //glDrawBuffers(2, draw_bufs); +} + diff --git a/src/Renderer.h b/src/Renderer.h index 8d0da1f..3243eef 100755 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -88,9 +88,16 @@ private: GLuint m_ShadowFrameBuffer; GLuint m_ShadowDepthTexture; + GLuint m_fb_PositionTexture; + GLuint m_fb_NormalsTexture; + GLuint m_fb; + GLuint m_rb; + GLenum draw_bufs[2]; + std::shared_ptr m_Camera; ShaderProgram m_ShaderProgram; + ShaderProgram m_FirstPassProgram; ShaderProgram m_ShaderProgramNormals; ShaderProgram m_ShaderProgramShadows; ShaderProgram m_ShaderProgramShadowsDrawDepth; @@ -102,6 +109,9 @@ private: void DrawModels(ShaderProgram &shader); void DrawShadowMap(); void CreateShadowMap(int resolution); + void FrameBufferTextures(); + void DrawFBO(); + GLuint CreateQuad(); void DrawDebugShadowMap(); GLuint CreateAABB(); diff --git a/src/Shaders/First_pass.frag.glsl b/src/Shaders/First_pass.frag.glsl new file mode 100644 index 0000000..df66547 --- /dev/null +++ b/src/Shaders/First_pass.frag.glsl @@ -0,0 +1,12 @@ +#version 400 + +in vec3 p_eye; +in vec3 n_eye; + +layout (location = 0) out vec4 def_p; // "go to GL_COLOR_ATTACHMENT0" +layout (location = 1) out vec4 def_n; // "go to GL_COLOR_ATTACHMENT1" + +void main () { + def_p = vec4(p_eye, 1.0); + def_n = vec4(n_eye, 1.0); +} \ No newline at end of file diff --git a/src/Shaders/First_pass.vert.glsl b/src/Shaders/First_pass.vert.glsl new file mode 100644 index 0000000..f6cd49c --- /dev/null +++ b/src/Shaders/First_pass.vert.glsl @@ -0,0 +1,16 @@ +#version 400 + +layout(location = 0) in vec3 vp; +layout(location = 1) in vec3 vn; +layout(location = 2) in vec2 TextureCoord; + +uniform mat4 P, V, M; + +out vec3 p_eye; +out vec3 n_eye; + +void main () { + p_eye = (V * M * vec4 (vp, 1.0)).xyz; + n_eye = (V * M * vec4 (vn, 0.0)).xyz; + gl_Position = P * vec4 (p_eye, 1.0); +} \ No newline at end of file diff --git a/src/Shaders/Second_pass.frag.glsl b/src/Shaders/Second_pass.frag.glsl new file mode 100644 index 0000000..5792748 --- /dev/null +++ b/src/Shaders/Second_pass.frag.glsl @@ -0,0 +1,24 @@ +#version 430 + +uniform sampler2D tDiffuse; +uniform sampler2D tPosition; +uniform sampler2D tNormals; +uniform vec3 cameraPosition; + +void main( void ) +{ + vec4 image = texture2D( tDiffuse, gl_TexCoord[0].xy ); + vec4 position = texture2D( tPosition, gl_TexCoord[0].xy ); + vec4 normal = texture2D( tNormals, gl_TexCoord[0].xy ); + + vec3 light = vec3(50,100,50); + vec3 lightDir = light - position.xyz ; + + normal = normalize(normal); + lightDir = normalize(lightDir); + + vec3 eyeDir = normalize(cameraPosition-position.xyz); + vec3 vHalfVector = normalize(lightDir.xyz+eyeDir); + + gl_FragColor = max(dot(normal,lightDir),0) * image + pow(max(dot(normal,vHalfVector),0.0), 100) * 1.5; +} diff --git a/src/Shaders/Second_pass.vert.glsl b/src/Shaders/Second_pass.vert.glsl new file mode 100644 index 0000000..23a3280 --- /dev/null +++ b/src/Shaders/Second_pass.vert.glsl @@ -0,0 +1,9 @@ +#version 430 + +void main( void ) +{ + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_TexCoord[0] = gl_MultiTexCoord0; + + gl_FrontColor = vec4(1.0, 1.0, 1.0, 1.0); +} diff --git a/src/Shaders/geometry_pass.frag.glsl b/src/Shaders/geometry_pass.frag.glsl deleted file mode 100644 index 4fe34ba..0000000 --- a/src/Shaders/geometry_pass.frag.glsl +++ /dev/null @@ -1,20 +0,0 @@ -#version 430 - -in vec2 TexCoord0; -in vec3 Normal0; -in vec3 WorldPos0; - -layout (location = 0) out vec3 WorldPosOut; -layout (location = 1) out vec3 DiffuseOut; -layout (location = 2) out vec3 NormalOut; -layout (location = 3) out vec3 TexCoordOut; - -uniform sampler2D gColorMap; - -void main() -{ - WorldPosOut = WorldPos0; - DiffuseOut = texture(gColorMap, TexCoord0).xyz; - NormalOut = normalize(Normal0); - TexCoordOut = vec3(TexCoord0, 0.0); -} \ No newline at end of file diff --git a/src/Shaders/geometry_pass.vert.glsl b/src/Shaders/geometry_pass.vert.glsl deleted file mode 100644 index c431ba9..0000000 --- a/src/Shaders/geometry_pass.vert.glsl +++ /dev/null @@ -1,20 +0,0 @@ -#version 430 - -layout (location = 0) in vec3 Position; -layout (location = 1) in vec2 TexCoord; -layout (location = 2) in vec3 Normal; - -uniform mat4 gWVP; -uniform mat4 gWorld; - -out vec2 TexCoord0; -out vec3 Normal0; -out vec3 WorldPos0; - -void main() -{ - gl_Position = gWVP * vec4(Position, 1.0); - TexCoord0 = TexCoord; - Normal0 = (gWorld * vec4(Normal, 0.0)).xyz; - WorldPos0 = (gWorld * vec4(Position, 1.0)).xyz; -} \ No newline at end of file diff --git a/src/Util/defferedUtil.h b/src/Util/defferedUtil.h new file mode 100644 index 0000000..d362fac --- /dev/null +++ b/src/Util/defferedUtil.h @@ -0,0 +1,28 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include +#include + +#define ZERO_MEM(a) memset(a, 0, sizeof(a)) + +#define ARRAY_SIZE_IN_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) + +#define INVALID_OGL_VALUE 0xFFFFFFFF + +#define SAFE_DELETE(p) if (p) { delete p; p = NULL; } + +#define GLExitIfError() \ +{ \ + GLenum Error = glGetError(); \ + \ + if (Error != GL_NO_ERROR) { \ + printf("OpenGL error in %s:%d: 0x%x\n", __FILE__, __LINE__, Error); \ + exit(0); \ + } \ +} + +#define GLCheckError() (glGetError() == GL_NO_ERROR) + +#endif /* UTIL_H */ diff --git a/src/gBuffer.cpp b/src/gBuffer.cpp deleted file mode 100644 index 5acf690..0000000 --- a/src/gBuffer.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "PrecompiledHeader.h" -#include "gBuffer.h" - -bool GBuffer::Init(unsigned int WindowWidth, unsigned int WindowHeight) -{ - // Create the FBO - glGenFramebuffers(1, &m_fbo); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo); - - // Create the gbuffer textures - glGenTextures(ARRAY_SIZE_IN_ELEMENTS(m_textures), m_textures); - glGenTextures(1, &m_depthTexture); - - for (unsigned int i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(m_textures) ; i++) { - glBindTexture(GL_TEXTURE_2D, m_textures[i]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL); - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0); - } - - // depth - glBindTexture(GL_TEXTURE_2D, m_depthTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, WindowWidth, WindowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, - NULL); - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0); - - GLenum DrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; - glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers); - - GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - if (Status != GL_FRAMEBUFFER_COMPLETE) { - printf("FB error, status: 0x%x\n", Status); - return false; - } - - // restore default FBO - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - - return true; -} \ No newline at end of file diff --git a/src/gBuffer.h b/src/gBuffer.h deleted file mode 100644 index 721eb15..0000000 --- a/src/gBuffer.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef gBuffer_h__ -#define gBuffer_h__ - -#include - -class GBuffer -{ -public: - - enum GBUFFER_TEXTURE_TYPE { - GBUFFER_TEXTURE_TYPE_POSITION, - GBUFFER_TEXTURE_TYPE_DIFFUSE, - GBUFFER_TEXTURE_TYPE_NORMAL, - GBUFFER_TEXTURE_TYPE_TEXCOORD, - GBUFFER_NUM_TEXTURES - }; - - GBuffer(); - - ~GBuffer(); - - bool Init(unsigned int WindowWidth, unsigned int WindowHeight); - - void BindForWriting(); - - void BindForReading(); - -private: - - GLuint m_fbo; - GLuint m_textures[GBUFFER_NUM_TEXTURES]; - GLuint m_depthTexture; -}; - -#endif //gBuffer_h__ \ No newline at end of file diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 4726981..46c68eb 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -156,15 +156,33 @@ + + + + + true + + + + + + + + + true + + + true + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 672e8dd..0186e7f 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -214,6 +214,9 @@ + + Util + @@ -249,5 +252,17 @@ Shaders + + Shaders + + + Shaders + + + Shaders + + + Shaders + \ No newline at end of file