Started on deferred rendering framework.

This commit is contained in:
Tleety
2014-04-24 00:11:16 +02:00
parent f9a7425249
commit 6d75336496
13 changed files with 289 additions and 150 deletions
+157 -35
View File
@@ -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<Shader>(new VertexShader("Shaders/First_pass.vert.glsl")));
m_FirstPassProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/First_pass.frag.glsl")));
m_FirstPassProgram.Compile();
m_FirstPassProgram.Link();
m_Skybox = std::make_shared<Skybox>("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;
}
}
#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);
}
+10
View File
@@ -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<Camera> 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();
+12
View File
@@ -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);
}
+16
View File
@@ -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);
}
+24
View File
@@ -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;
}
+9
View File
@@ -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);
}
-20
View File
@@ -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);
}
-20
View File
@@ -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;
}
+28
View File
@@ -0,0 +1,28 @@
#ifndef UTIL_H
#define UTIL_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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 */
-40
View File
@@ -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;
}
-35
View File
@@ -1,35 +0,0 @@
#ifndef gBuffer_h__
#define gBuffer_h__
#include <stdio.h>
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__
+18
View File
@@ -156,15 +156,33 @@
<ClInclude Include="..\..\src\Systems\SoundSystem.h" />
<ClInclude Include="..\..\src\Systems\TransformSystem.h" />
<ClInclude Include="..\..\src\Texture.h" />
<ClInclude Include="..\..\src\Util\defferedUtil.h" />
<ClInclude Include="..\..\src\Util\GLError.h" />
<ClInclude Include="..\..\src\Util\Logging.h" />
<ClInclude Include="..\..\src\World.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\Shaders\AABB.frag.glsl" />
<None Include="..\..\src\Shaders\First_pass.frag.glsl">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</None>
<None Include="..\..\src\Shaders\First_pass.vert.glsl">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</ExcludedFromBuild>
</None>
<None Include="..\..\src\Shaders\Fragment.glsl" />
<None Include="..\..\src\Shaders\Normals.frag.glsl" />
<None Include="..\..\src\Shaders\Normals.geo.glsl" />
<None Include="..\..\src\Shaders\Second_pass.frag.glsl">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</None>
<None Include="..\..\src\Shaders\Second_pass.vert.glsl">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</None>
<None Include="..\..\src\Shaders\ShadowMap.frag.glsl" />
<None Include="..\..\src\Shaders\ShadowMap.vert.glsl" />
<None Include="..\..\src\Shaders\Skybox.frag.glsl" />
@@ -214,6 +214,9 @@
</ClInclude>
<ClInclude Include="..\..\src\Components\Box.h" />
<ClInclude Include="..\..\src\Components\Sphere.h" />
<ClInclude Include="..\..\src\Util\defferedUtil.h">
<Filter>Util</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\Shaders\AABB.frag.glsl">
@@ -249,5 +252,17 @@
<None Include="..\..\src\Shaders\VisualizeDepth.vert.glsl">
<Filter>Shaders</Filter>
</None>
<None Include="..\..\src\Shaders\First_pass.frag.glsl">
<Filter>Shaders</Filter>
</None>
<None Include="..\..\src\Shaders\First_pass.vert.glsl">
<Filter>Shaders</Filter>
</None>
<None Include="..\..\src\Shaders\Second_pass.frag.glsl">
<Filter>Shaders</Filter>
</None>
<None Include="..\..\src\Shaders\Second_pass.vert.glsl">
<Filter>Shaders</Filter>
</None>
</ItemGroup>
</Project>