Rewritten. Works as a charm now.

This commit is contained in:
FakeShemp
2016-03-03 03:28:21 +01:00
parent 28e9ba1208
commit 7ea26d10ee
19 changed files with 224 additions and 199 deletions
@@ -15,17 +15,16 @@ struct DirectionalLightJob : RenderJob
DirectionalLightJob(ComponentWrapper transformComponent, ComponentWrapper directionalLightComponent, World* m_World) DirectionalLightJob(ComponentWrapper transformComponent, ComponentWrapper directionalLightComponent, World* m_World)
: RenderJob() : RenderJob()
{ {
Orientation = Transform::AbsoluteOrientation(m_World, transformComponent.EntityID);
Direction = glm::vec4(0,0,-1,0) * glm::inverse(Orientation); Direction = glm::vec4(0,0,-1,0) * glm::inverse(Transform::AbsoluteOrientation(m_World, transformComponent.EntityID));
//Direction = glm::vec4((glm::vec3)directionalLightComponent["Direction"], 0.f);
Color = (glm::vec4)directionalLightComponent["Color"]; Color = (glm::vec4)directionalLightComponent["Color"];
Intensity = (double)directionalLightComponent["Intensity"]; Intensity = (double)directionalLightComponent["Intensity"];
}; };
glm::quat Orientation;
glm::vec4 Direction; glm::vec4 Direction;
glm::vec4 Color; glm::vec4 Color;
float Intensity; float Intensity;
bool TextureAlphaShadows = false;
void CalculateHash() override void CalculateHash() override
{ {
+1 -1
View File
@@ -64,9 +64,9 @@ private:
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
const LightCullingPass* m_LightCullingPass; const LightCullingPass* m_LightCullingPass;
const ShadowPass* m_ShadowPass;
const CubeMapPass* m_CubeMapPass; const CubeMapPass* m_CubeMapPass;
const SSAOPass* m_SSAOPass; const SSAOPass* m_SSAOPass;
const ShadowPass* m_ShadowPass;
ShaderProgram* m_ForwardPlusProgram; ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectProgram;
+2 -2
View File
@@ -24,9 +24,9 @@
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "imgui/imgui.h" #include "imgui/imgui.h"
#include "TextPass.h" #include "TextPass.h"
#include "ShadowPass.h"
#include "Util/CommonFunctions.h" #include "Util/CommonFunctions.h"
#include "Core/PerformanceTimer.h" #include "Core/PerformanceTimer.h"
#include "ShadowPass.h"
class Renderer : public IRenderer class Renderer : public IRenderer
{ {
@@ -74,9 +74,9 @@ private:
DrawScreenQuadPass* m_DrawScreenQuadPass; DrawScreenQuadPass* m_DrawScreenQuadPass;
DrawBloomPass* m_DrawBloomPass; DrawBloomPass* m_DrawBloomPass;
DrawColorCorrectionPass* m_DrawColorCorrectionPass; DrawColorCorrectionPass* m_DrawColorCorrectionPass;
ShadowPass* m_ShadowPass;
SSAOPass* m_SSAOPass; SSAOPass* m_SSAOPass;
CubeMapPass* m_CubeMapPass; CubeMapPass* m_CubeMapPass;
ShadowPass* m_ShadowPass;
//----------------------Functions----------------------// //----------------------Functions----------------------//
void InitializeWindow(); void InitializeWindow();
+9 -4
View File
@@ -1,5 +1,5 @@
#ifndef ShadowPass_h_ #ifndef ShadowPass_h__
#define ShadowPass_h_ #define ShadowPass_h__
#include "IRenderer.h" #include "IRenderer.h"
#include "FrameBuffer.h" #include "FrameBuffer.h"
@@ -38,6 +38,8 @@ public:
void ClearBuffer(); void ClearBuffer();
void Draw(RenderScene& scene); void Draw(RenderScene& scene);
void DebugGUI();
GLuint DepthMap() const { return m_DepthMap; } GLuint DepthMap() const { return m_DepthMap; }
std::array<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; } std::array<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; }
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; } std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
@@ -62,7 +64,6 @@ private:
GLuint m_DepthMap; GLuint m_DepthMap;
FrameBuffer m_DepthBuffer; FrameBuffer m_DepthBuffer;
ShaderProgram* m_ShadowProgram; ShaderProgram* m_ShadowProgram;
//ShaderProgram* m_TransparentShadowProgram;
std::array<glm::mat4, MAX_SPLITS> m_LightProjection; std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
std::array<glm::mat4, MAX_SPLITS> m_LightView; std::array<glm::mat4, MAX_SPLITS> m_LightView;
@@ -71,8 +72,12 @@ private:
GLuint m_ResolutionSizeWidth = 1024 * 2; GLuint m_ResolutionSizeWidth = 1024 * 2;
GLuint m_ResolutionSizeHeight = 1024 * 2; GLuint m_ResolutionSizeHeight = 1024 * 2;
bool m_TransparentObjects = false;
bool m_TexturedShadows = false;
bool m_EnableShadows = true;
int m_CurrentNrOfSplits = 4; int m_CurrentNrOfSplits = 4;
float m_SplitWeight = 0.91f; float m_SplitWeight = 0.962f;
std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta; std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta;
+2 -2
View File
@@ -6,8 +6,8 @@
class ShadowPassState : public RenderState class ShadowPassState : public RenderState
{ {
public: public:
ShadowPassState(GLuint frameBuffer); ShadowPassState(GLuint frameBuffer);
~ShadowPassState(); ~ShadowPassState();
private: private:
}; };
+67 -68
View File
@@ -1,7 +1,7 @@
#version 430 #version 430
#define MAX_SPLITS 4
#define MIN_AMBIENT_LIGHT 0.3 #define MIN_AMBIENT_LIGHT 0.3
#define MAX_SPLITS 4
uniform mat4 M; uniform mat4 M;
uniform mat4 V; uniform mat4 V;
@@ -12,22 +12,22 @@ uniform vec2 ScreenDimensions;
uniform vec4 FillColor; uniform vec4 FillColor;
uniform vec4 AmbientColor; uniform vec4 AmbientColor;
uniform float FillPercentage; uniform float FillPercentage;
uniform float FarDistance[MAX_SPLITS];
uniform float GlowIntensity = 10; uniform float GlowIntensity = 10;
uniform vec3 CameraPosition; uniform vec3 CameraPosition;
uniform int SSAOQuality; uniform int SSAOQuality;
uniform float FarDistance[MAX_SPLITS];
uniform vec2 DiffuseUVRepeat; uniform vec2 DiffuseUVRepeat;
uniform vec2 NormalUVRepeat; uniform vec2 NormalUVRepeat;
uniform vec2 SpecularUVRepeat; uniform vec2 SpecularUVRepeat;
uniform vec2 GlowUVRepeat; uniform vec2 GlowUVRepeat;
layout (binding = 0) uniform sampler2D AOTexture; layout (binding = 0) uniform sampler2D AOTexture;
layout (binding = 6) uniform sampler2DArrayShadow DepthMap;
layout (binding = 1) uniform sampler2D DiffuseTexture; layout (binding = 1) uniform sampler2D DiffuseTexture;
layout (binding = 2) uniform sampler2D NormalMapTexture; layout (binding = 2) uniform sampler2D NormalMapTexture;
layout (binding = 3) uniform sampler2D SpecularMapTexture; layout (binding = 3) uniform sampler2D SpecularMapTexture;
layout (binding = 4) uniform sampler2D GlowMapTexture; layout (binding = 4) uniform sampler2D GlowMapTexture;
layout (binding = 5) uniform samplerCube CubeMap; layout (binding = 5) uniform samplerCube CubeMap;
layout (binding = 13) uniform sampler2DArrayShadow DepthMap;
#define TILE_SIZE 16 #define TILE_SIZE 16
@@ -62,7 +62,6 @@ layout (std430, binding = 4) buffer LightIndexBuffer
float LightIndex[]; float LightIndex[];
}; };
in VertexData{ in VertexData{
vec3 Position; vec3 Position;
vec3 Normal; vec3 Normal;
@@ -155,6 +154,62 @@ float Random(vec3 seed, int i)
return fract(sin(dot_product) * 43758.5453); return fract(sin(dot_product) * 43758.5453);
} }
int getShadowIndex(float far_distance[1])
{
return 0;
}
int getShadowIndex(float far_distance[2])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 1;
if ( depth < far_distance[0] )
{
index = 0;
}
return index;
}
int getShadowIndex(float far_distance[3])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 2;
if ( depth < far_distance[0] )
{
index = 0;
}
else if ( depth < far_distance[1] && depth > far_distance[0] )
{
index = 1;
}
return index;
}
int getShadowIndex(float far_distance[4])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 3;
if ( depth < far_distance[0] )
{
index = 0;
}
else if ( depth < far_distance[1] && depth > far_distance[0] )
{
index = 1;
}
else if ( depth < far_distance[2] && depth > far_distance[1] )
{
index = 2;
}
return index;
}
// Standard hardware-calculated PCF method // Standard hardware-calculated PCF method
float PCFShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index) float PCFShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index)
{ {
@@ -237,62 +292,6 @@ float CalcShadowValue(vec4 light_space_pos, vec3 normal, vec3 light_dir, sampler
shadowMapDepth = SoftwarePCF(depth_texture_array, projCoords, layer_index, bias); shadowMapDepth = SoftwarePCF(depth_texture_array, projCoords, layer_index, bias);
return shadowMapDepth; return shadowMapDepth;
}
int getShadowIndex(float far_distance[1])
{
return 0;
}
int getShadowIndex(float far_distance[2])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 1;
if ( depth < far_distance[0] )
{
index = 0;
}
return index;
}
int getShadowIndex(float far_distance[3])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 2;
if ( depth < far_distance[0] )
{
index = 0;
}
else if ( depth < far_distance[1] && depth > far_distance[0] )
{
index = 1;
}
return index;
}
int getShadowIndex(float far_distance[4])
{
float depth = gl_FragCoord.z / gl_FragCoord.w;
int index = 3;
if ( depth < far_distance[0] )
{
index = 0;
}
else if ( depth < far_distance[1] && depth > far_distance[0] )
{
index = 1;
}
else if ( depth < far_distance[2] && depth > far_distance[1] )
{
index = 2;
}
return index;
} }
void main() void main()
@@ -322,14 +321,14 @@ void main()
int start = int(LightGrids.Data[currentTile].Start); int start = int(LightGrids.Data[currentTile].Start);
int amount = int(LightGrids.Data[currentTile].Amount); int amount = int(LightGrids.Data[currentTile].Amount);
float shadowFactor = 0.0;
float shadowFactor = 0.0;
for(int i = start; i < start + amount; i++) { for(int i = start; i < start + amount; i++) {
int l = int(LightIndex[i]); int l = int(LightIndex[i]);
LightSource light = LightSources.List[l]; LightSource light = LightSources.List[l];
LightResult light_result; LightResult light_result;
//These if statements should be removed. //These if statements should be removed.
if(light.Type == 1) { // point if(light.Type == 1) { // point
@@ -342,17 +341,17 @@ void main()
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a); totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a); totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
} }
totalLighting.Diffuse *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0); totalLighting.Diffuse *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
totalLighting.Specular *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0); totalLighting.Specular *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
//LightResult getInformation;
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed); vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)); color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
float specularResult = (specularTexel.r + specularTexel.g + specularTexel.b)/3.0; float specularResult = (specularTexel.r + specularTexel.g + specularTexel.b)/3.0;
vec4 reflectionTotal = reflectionColor * (1-specularTexel.a) * color_result.a; vec4 reflectionTotal = reflectionColor * (1-specularTexel.a) * color_result.a;
color_result = color_result * clamp(1/specularTexel.a, 0, 1) + reflectionTotal; color_result = color_result * clamp(1/specularTexel.a, 0, 1) + reflectionTotal;
//vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color;
float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0;
@@ -1,6 +1,7 @@
#version 430 #version 430
#define MIN_AMBIENT_LIGHT 0.3 #define MIN_AMBIENT_LIGHT 0.3
#define MAX_SPLITS 4
uniform mat4 M; uniform mat4 M;
uniform mat4 V; uniform mat4 V;
@@ -69,6 +70,7 @@ in VertexData{
vec2 TextureCoordinate; vec2 TextureCoordinate;
vec4 ExplosionColor; vec4 ExplosionColor;
float ExplosionPercentageElapsed; float ExplosionPercentageElapsed;
vec4 PositionLightSpace[MAX_SPLITS];
}Input; }Input;
out vec4 sceneColor; out vec4 sceneColor;
@@ -1,9 +1,13 @@
#version 430 #version 430
#define MAX_SPLITS 4
uniform mat4 M; uniform mat4 M;
uniform mat4 V; uniform mat4 V;
uniform mat4 P; uniform mat4 P;
uniform mat4 Bones[100]; uniform mat4 Bones[100];
uniform mat4 LightV[MAX_SPLITS];
uniform mat4 LightP[MAX_SPLITS];
layout(location = 0) in vec3 Position; layout(location = 0) in vec3 Position;
layout(location = 1) in vec3 Normal; layout(location = 1) in vec3 Normal;
@@ -44,5 +48,9 @@ void main()
Output.BiTangent = vec3(M * vec4(BiTangent, 0.0)); Output.BiTangent = vec3(M * vec4(BiTangent, 0.0));
Output.ExplosionColor = vec4(1.0); Output.ExplosionColor = vec4(1.0);
Output.ExplosionPercentageElapsed = 0.0; Output.ExplosionPercentageElapsed = 0.0;
Output.PositionLightSpace = boneTransform * vec4(Position, 1.0);
for(int i = 0; i < MAX_SPLITS; i++)
{
Output.PositionLightSpace[i] = LightP[i] * LightV[i] * M * boneTransform * vec4(Position, 1.0);
}
} }
@@ -1,5 +1,7 @@
#version 430 #version 430
#define MAX_SPLITS 4
uniform mat4 M; uniform mat4 M;
uniform mat4 V; uniform mat4 V;
uniform mat4 P; uniform mat4 P;
@@ -95,6 +97,7 @@ in VertexData{
vec2 TextureCoordinate; vec2 TextureCoordinate;
vec4 ExplosionColor; vec4 ExplosionColor;
float ExplosionPercentageElapsed; float ExplosionPercentageElapsed;
vec4 PositionLightSpace[MAX_SPLITS];
}Input; }Input;
out vec4 sceneColor; out vec4 sceneColor;
@@ -1,6 +1,7 @@
#version 430 #version 430
#define MIN_AMBIENT_LIGHT 0.3 #define MIN_AMBIENT_LIGHT 0.3
#define MAX_SPLITS 4
uniform mat4 M; uniform mat4 M;
uniform mat4 V; uniform mat4 V;
+1 -3
View File
@@ -19,6 +19,4 @@ void main()
{ {
discard; discard;
} }
} }
+1 -1
View File
@@ -7,7 +7,7 @@ EditorRenderSystem::EditorRenderSystem(SystemParams params, IRenderer* renderer,
{ {
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &EditorRenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &EditorRenderSystem::OnSetCamera);
auto resolution = Rectangle::Rectangle(1280, 720); auto resolution = Rectangle::Rectangle(1280, 720);
m_EditorCamera = new Camera((float)resolution.Width / resolution.Height, glm::radians(45.f), 0.01f, 500.f); m_EditorCamera = new Camera((float)resolution.Width / resolution.Height, glm::radians(45.f), 0.01f, 5000.f);
} }
void EditorRenderSystem::Update(double dt) void EditorRenderSystem::Update(double dt)
+1 -4
View File
@@ -17,10 +17,7 @@ EditorSystem::EditorSystem(SystemParams params, IRenderer* renderer, RenderFrame
m_EditorCamera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml"); m_EditorCamera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml");
m_ActualCamera = m_EditorCamera; m_ActualCamera = m_EditorCamera;
m_EditorWorld->AttachComponent(m_EditorCamera.ID, "Transform"); m_EditorWorld->AttachComponent(m_EditorCamera.ID, "Transform");
auto cCamera = m_EditorWorld->AttachComponent(m_EditorCamera.ID, "Camera"); m_EditorWorld->AttachComponent(m_EditorCamera.ID, "Camera");
// TOBIAS TVINGADE MIG ATT HÅRDKODA
(double&)cCamera["FarClip"] = 400.0;
m_EditorCameraInputController = new EditorCameraInputController<EditorSystem>(m_EventBroker, -1); m_EditorCameraInputController = new EditorCameraInputController<EditorSystem>(m_EventBroker, -1);
m_EditorGUI = new EditorGUI(m_World, m_EventBroker); m_EditorGUI = new EditorGUI(m_World, m_EventBroker);
+7 -9
View File
@@ -4,10 +4,10 @@ DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCulling
, m_LightCullingPass(lightCullingPass) , m_LightCullingPass(lightCullingPass)
, m_CubeMapPass(cubeMapPass) , m_CubeMapPass(cubeMapPass)
, m_SSAOPass(ssaoPass) , m_SSAOPass(ssaoPass)
, m_ShadowPass(shadowPass)
{ {
//TODO: Make sure that uniforms are not sent into shader if not needed. //TODO: Make sure that uniforms are not sent into shader if not needed.
m_ShieldPixelRate = 8; m_ShieldPixelRate = 8;
m_ShadowPass = shadowPass;
InitializeTextures(); InitializeTextures();
InitializeShaderPrograms(); InitializeShaderPrograms();
InitializeFrameBuffers(); InitializeFrameBuffers();
@@ -343,7 +343,8 @@ void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>&
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_SSAOPass->SSAOTexture()); glBindTexture(GL_TEXTURE_2D, m_SSAOPass->SSAOTexture());
glActiveTexture(GL_TEXTURE6);
glActiveTexture(GL_TEXTURE13);
if (m_ShadowPass->DepthMap() != NULL) { if (m_ShadowPass->DepthMap() != NULL) {
glBindTexture(GL_TEXTURE_2D_ARRAY, m_ShadowPass->DepthMap()); glBindTexture(GL_TEXTURE_2D_ARRAY, m_ShadowPass->DepthMap());
} }
@@ -1091,10 +1092,10 @@ void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<E
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
GLERROR("Bind 20 uniform"); GLERROR("Bind 20 uniform");
glUniform1f(glGetUniformLocation(shaderHandle, "GlowIntensity"), job->GlowIntensity); glUniform1f(glGetUniformLocation(shaderHandle, "GlowIntensity"), job->GlowIntensity);
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data())); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data()));
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data())); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data()));
glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data()); glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data());
GLERROR("END"); GLERROR("END");
} }
@@ -1133,12 +1134,10 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr<Model
GLERROR("Bind 10 uniform"); GLERROR("Bind 10 uniform");
GLint Location_GlowIntensity = glGetUniformLocation(shaderHandle, "GlowIntensity"); GLint Location_GlowIntensity = glGetUniformLocation(shaderHandle, "GlowIntensity");
glUniform1f(Location_GlowIntensity, job->GlowIntensity);
glUniform1f(Location_GlowIntensity, job->GlowIntensity); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data()));
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data()));
//Shadow
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data()));
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data()));
glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data()); glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data());
GLERROR("END"); GLERROR("END");
@@ -1309,7 +1308,6 @@ void DrawFinalPass::BindModelTextures(GLuint shaderHandle, std::shared_ptr<Model
glBindTexture(GL_TEXTURE_2D, m_BlackTexture->m_Texture); glBindTexture(GL_TEXTURE_2D, m_BlackTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "GlowUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); glUniform2fv(glGetUniformLocation(shaderHandle, "GlowUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
} }
break; break;
} }
case RawModel::MaterialType::SplatMapping: case RawModel::MaterialType::SplatMapping:
+16 -16
View File
@@ -16,6 +16,7 @@ Texture2D::~Texture2D()
} }
} }
RenderBuffer::~RenderBuffer() RenderBuffer::~RenderBuffer()
{ {
if (m_ResourceHandle != 0) { if (m_ResourceHandle != 0) {
@@ -51,7 +52,6 @@ void FrameBuffer::Generate()
switch ((*it)->m_ResourceType) { switch ((*it)->m_ResourceType) {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
attachments.push_back((*it)->m_Attachment);
GLERROR("FrameBuffer generate: glFramebufferTexture2D"); GLERROR("FrameBuffer generate: glFramebufferTexture2D");
break; break;
case GL_RENDERBUFFER: case GL_RENDERBUFFER:
@@ -60,13 +60,13 @@ void FrameBuffer::Generate()
break; break;
case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_2D_ARRAY:
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0); glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0);
attachments.push_back((*it)->m_Attachment); GLERROR("FrameBuffer generate: glFramebufferTexture2DArray");
GLERROR("FrameBuffer generate: GL_TEXTURE_2D_ARRAY");
break; break;
} }
GLERROR("2"); GLERROR("2");
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT && (*it)->m_Attachment != GL_STENCIL_ATTACHMENT && (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) { // Need GL_DEPTH_ATTACHMENT for shadows
if (/*(*it)->m_Attachment != GL_DEPTH_ATTACHMENT &&*/ (*it)->m_Attachment != GL_STENCIL_ATTACHMENT && (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
attachments.push_back((*it)->m_Attachment); attachments.push_back((*it)->m_Attachment);
} }
GLERROR("Attachment"); GLERROR("Attachment");
@@ -74,19 +74,19 @@ void FrameBuffer::Generate()
} }
GLERROR("3"); GLERROR("3");
GLenum* bufferTextures = &attachments[0]; GLenum* bufferTextures = &attachments[0];
glDrawBuffers(attachments.size(), bufferTextures); glDrawBuffers(attachments.size(), bufferTextures);
if (GLERROR("GLBufferAttachement error")) { if (GLERROR("GLBufferAttachement error")) {
printf(": AttachmentSize %i", attachments.size()); printf(": AttachmentSize %i", attachments.size());
} }
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
GLERROR("Framebuffer incomplete");
//LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
exit(EXIT_FAILURE);
}
GLERROR("END");
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
GLERROR("Framebuffer incomplete");
//LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
exit(EXIT_FAILURE);
}
GLERROR("END");
}
} }
void FrameBuffer::Bind() void FrameBuffer::Bind()
+1 -1
View File
@@ -12,7 +12,7 @@ RenderSystem::RenderSystem(SystemParams params, const IRenderer* renderer, Rende
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand);
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &RenderSystem::OnPlayerSpawned); EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &RenderSystem::OnPlayerSpawned);
m_Camera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 300.f); m_Camera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f);
} }
RenderSystem::~RenderSystem() RenderSystem::~RenderSystem()
+12 -4
View File
@@ -86,6 +86,11 @@ void Renderer::InitializeShaders()
{ {
m_BasicForwardProgram = ResourceManager::Load<ShaderProgram>("#m_BasicForwardProgram"); m_BasicForwardProgram = ResourceManager::Load<ShaderProgram>("#m_BasicForwardProgram");
m_ExplosionEffectProgram = ResourceManager::Load<ShaderProgram>("#ExplosionEffectProgram"); m_ExplosionEffectProgram = ResourceManager::Load<ShaderProgram>("#ExplosionEffectProgram");
//m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ExplosionEffect.vert.glsl")));
//m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new GeometryShader("Shaders/ExplosionEffect.geom.glsl")));
//m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/ExplosionEffect.frag.glsl")));
//m_ExplosionEffectProgram->Compile();
//m_ExplosionEffectProgram->Link();
} }
void Renderer::InputUpdate(double dt) void Renderer::InputUpdate(double dt)
@@ -127,8 +132,9 @@ void Renderer::Draw(RenderFrame& frame)
m_PickingPass->ClearPicking(); m_PickingPass->ClearPicking();
m_DrawFinalPass->ClearBuffer(); m_DrawFinalPass->ClearBuffer();
m_DrawBloomPass->ClearBuffer(); m_DrawBloomPass->ClearBuffer();
m_ShadowPass->ClearBuffer();
m_SSAOPass->ClearBuffer(); m_SSAOPass->ClearBuffer();
m_ShadowPass->ClearBuffer();
m_ShadowPass->DebugGUI();
PerformanceTimer::StopTimer("Renderer-ClearBuffers"); PerformanceTimer::StopTimer("Renderer-ClearBuffers");
GLERROR("ClearBuffers"); GLERROR("ClearBuffers");
for (auto scene : frame.RenderScenes) { for (auto scene : frame.RenderScenes) {
@@ -144,7 +150,9 @@ void Renderer::Draw(RenderFrame& frame)
PerformanceTimer::StartTimer("Renderer-Depth"); PerformanceTimer::StartTimer("Renderer-Depth");
SortRenderJobsByDepth(*scene); SortRenderJobsByDepth(*scene);
GLERROR("SortByDepth"); GLERROR("SortByDepth");
m_ShadowPass->Draw(*scene); PerformanceTimer::StartTimerAndStopPrevious("Draw shadow maps");
m_ShadowPass->Draw(*scene);
GLERROR("Draw shadow maps");
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Generate Frustrums"); PerformanceTimer::StartTimerAndStopPrevious("Renderer-Generate Frustrums");
m_LightCullingPass->GenerateNewFrustum(*scene); m_LightCullingPass->GenerateNewFrustum(*scene);
GLERROR("Generate frustums"); GLERROR("Generate frustums");
@@ -187,7 +195,7 @@ void Renderer::Draw(RenderFrame& frame)
} }
if (m_DebugTextureToDraw == 4) { if (m_DebugTextureToDraw == 4) {
m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture()); m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture());
} }
if (m_DebugTextureToDraw == 5) { if (m_DebugTextureToDraw == 5) {
m_DrawScreenQuadPass->Draw(m_SSAOPass->SSAOTexture()); m_DrawScreenQuadPass->Draw(m_SSAOPass->SSAOTexture());
} }
@@ -239,9 +247,9 @@ void Renderer::InitializeRenderPasses()
{ {
m_PickingPass = new PickingPass(this, m_EventBroker); m_PickingPass = new PickingPass(this, m_EventBroker);
m_LightCullingPass = new LightCullingPass(this); m_LightCullingPass = new LightCullingPass(this);
m_ShadowPass = new ShadowPass(this);
m_CubeMapPass = new CubeMapPass(this); m_CubeMapPass = new CubeMapPass(this);
m_SSAOPass = new SSAOPass(this, m_Config); m_SSAOPass = new SSAOPass(this, m_Config);
m_ShadowPass = new ShadowPass(this);
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass); m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass);
m_DrawScreenQuadPass = new DrawScreenQuadPass(this); m_DrawScreenQuadPass = new DrawScreenQuadPass(this);
m_DrawBloomPass = new DrawBloomPass(this, m_Config); m_DrawBloomPass = new DrawBloomPass(this, m_Config);
+82 -75
View File
@@ -1,6 +1,5 @@
#include "Rendering/ShadowPass.h" #include "Rendering/ShadowPass.h"
ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y) ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y)
{ {
m_Renderer = renderer; m_Renderer = renderer;
@@ -24,6 +23,15 @@ ShadowPass::~ShadowPass()
} }
void ShadowPass::DebugGUI()
{
ImGui::Checkbox("EnableShadows", &m_EnableShadows);
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f);
ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f);
ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects);
ImGui::Checkbox("ShadowOnTextureAlphas", &m_TexturedShadows);
}
void ShadowPass::InitializeCameras(RenderScene & scene) void ShadowPass::InitializeCameras(RenderScene & scene)
{ {
for (int i = 0; i < m_CurrentNrOfSplits; i++) { for (int i = 0; i < m_CurrentNrOfSplits; i++) {
@@ -198,101 +206,100 @@ void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum)
void ShadowPass::Draw(RenderScene & scene) void ShadowPass::Draw(RenderScene & scene)
{ {
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f); if (m_EnableShadows) {
ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f); InitializeCameras(scene);
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
InitializeCameras(scene); ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle()); m_ShadowProgram->Bind();
GLuint shaderHandle = m_ShadowProgram->GetHandle();
glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight);
m_ShadowProgram->Bind(); for (int i = 0; i < m_CurrentNrOfSplits; i++) {
GLuint shaderHandle = m_ShadowProgram->GetHandle(); UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight);
for (int i = 0; i < m_CurrentNrOfSplits; i++) { glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); for (auto &job : scene.Jobs.DirectionalLight) {
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
for (auto &job : scene.Jobs.DirectionalLight) { if (directionalLightJob) {
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job); m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f));
if (directionalLightJob) { PointsToLightspace(m_shadowFrusta[i], m_LightView[i]);
m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f)); //FindRadius(m_shadowFrusta[i]);
//RadiusToLightspace(m_shadowFrusta[i]);
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
PointsToLightspace(m_shadowFrusta[i], m_LightView[i]); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
//FindRadius(m_shadowFrusta[i]); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
//RadiusToLightspace(m_shadowFrusta[i]);
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i])); GLERROR("ShadowLight ERROR");
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
GLERROR("ShadowLight ERROR"); for (auto &objectJob : scene.Jobs.OpaqueObjects) {
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
for (auto &objectJob : scene.Jobs.OpaqueObjects) { glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
{
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); glBindVertexArray(modelJob->Model->VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
glBindVertexArray(modelJob->Model->VAO); GLERROR("Shadow Draw ERROR");
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); }
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
GLERROR("Shadow Draw ERROR");
} }
} if (m_TransparentObjects) {
state->CullFace(GL_BACK);
for (auto &objectJob : scene.Jobs.TransparentObjects) {
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
state->CullFace(GL_BACK); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
for (auto &objectJob : scene.Jobs.TransparentObjects) { glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob))
{
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); if (m_TexturedShadows) {
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); switch (modelJob->Type) {
case RawModel::MaterialType::SingleTextures:
if (directionalLightJob->TextureAlphaShadows) { case RawModel::MaterialType::Basic:
switch (modelJob->Type) { {
case RawModel::MaterialType::SingleTextures: glActiveTexture(GL_TEXTURE24);
case RawModel::MaterialType::Basic: if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) {
{ glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture);
glActiveTexture(GL_TEXTURE24); glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat));
if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) { }
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture); else {
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat)); glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
}
break;
}
case RawModel::MaterialType::SplatMapping:
{
glActiveTexture(GL_TEXTURE24);
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
break;
}
}
} }
else {
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); glBindVertexArray(modelJob->Model->VAO);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
} glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
break;
} GLERROR("Shadow Draw ERROR");
case RawModel::MaterialType::SplatMapping:
{
glActiveTexture(GL_TEXTURE24);
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
break;
}
} }
} }
state->CullFace(GL_FRONT);
glBindVertexArray(modelJob->Model->VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
GLERROR("Shadow Draw ERROR");
} }
} }
state->CullFace(GL_FRONT);
} }
} }
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
m_DepthBuffer.Unbind();
delete state;
} }
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); }
m_DepthBuffer.Unbind();
delete state;
}
+4 -4
View File
@@ -2,10 +2,10 @@
ShadowPassState::ShadowPassState(GLuint frameBuffer) ShadowPassState::ShadowPassState(GLuint frameBuffer)
{ {
BindFramebuffer(frameBuffer); BindFramebuffer(frameBuffer);
Enable(GL_DEPTH_TEST); Enable(GL_DEPTH_TEST);
Enable(GL_CULL_FACE); Enable(GL_CULL_FACE);
Disable(GL_BLEND); Disable(GL_BLEND);
Disable(GL_TEXTURE_2D); Disable(GL_TEXTURE_2D);
CullFace(GL_FRONT); CullFace(GL_FRONT);
ClearColor(glm::vec4(0.f, 0.f, 0.f, 0.f)); ClearColor(glm::vec4(0.f, 0.f, 0.f, 0.f));