It compiles, but no shadows

This commit is contained in:
FakeShemp
2016-02-29 18:20:32 +01:00
parent 20468cba1b
commit 70374fa10e
6 changed files with 68 additions and 51 deletions
@@ -17,7 +17,6 @@ struct DirectionalLightJob : RenderJob
{ {
Orientation = Transform::AbsoluteOrientation(m_World, transformComponent.EntityID); 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(Orientation);
//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"];
}; };
+8 -8
View File
@@ -14,7 +14,7 @@
enum NearFar { NEAR = 0, FAR = 1 }; enum NearFar { NEAR = 0, FAR = 1 };
enum LRBT { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3 }; enum LRBT { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3 };
struct Frustum struct ShadowFrustum
{ {
float NearClip; float NearClip;
float FarClip; float FarClip;
@@ -47,14 +47,14 @@ public:
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; }; void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
private: private:
void InitializeCameras(RenderScene & scene); void InitializeCameras(RenderScene & scene);
void UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float near_distance, float far_distance); void UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
void UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir); void UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir);
void UpdateFrustumPoints(Frustum& frustum, glm::mat4 p, glm::mat4 v); void UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v);
void PointsToLightspace(Frustum& frustum, glm::mat4 v); void PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v);
float FindRadius(Frustum& frustum); float FindRadius(ShadowFrustum& frustum);
void RadiusToLightspace(Frustum& frustum); void RadiusToLightspace(ShadowFrustum& frustum);
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
@@ -74,7 +74,7 @@ private:
int m_CurrentNrOfSplits = 4; int m_CurrentNrOfSplits = 4;
float m_SplitWeight = 0.91f; float m_SplitWeight = 0.91f;
std::array<Frustum, MAX_SPLITS> m_shadowFrusta; std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta;
Texture* m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/White.png"); Texture* m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/White.png");
}; };
@@ -21,6 +21,7 @@ out VertexData{
vec2 TextureCoordinate; vec2 TextureCoordinate;
vec4 ExplosionColor; vec4 ExplosionColor;
float ExplosionPercentageElapsed; float ExplosionPercentageElapsed;
vec4 PositionLightSpace[MAX_SPLITS];
}Output; }Output;
void main() void main()
@@ -43,4 +44,5 @@ 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);
} }
@@ -82,6 +82,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;
+28 -28
View File
@@ -61,45 +61,45 @@ void FrameBuffer::Generate()
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle); glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
GLERROR("1"); GLERROR("1");
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) { for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
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); attachments.push_back((*it)->m_Attachment);
GLERROR("FrameBuffer generate: glFramebufferTexture2D"); GLERROR("FrameBuffer generate: glFramebufferTexture2D");
break; break;
case GL_RENDERBUFFER: case GL_RENDERBUFFER:
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle); glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer"); GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
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); attachments.push_back((*it)->m_Attachment);
GLERROR("FrameBuffer generate: GL_TEXTURE_2D_ARRAY"); 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) { if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT && (*it)->m_Attachment != GL_STENCIL_ATTACHMENT && (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
GLERROR("Attachment"); GLERROR("Attachment");
} }
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()
+28 -13
View File
@@ -34,7 +34,7 @@ void ShadowPass::InitializeCameras(RenderScene & scene)
// UpdateSplitDist computes the near and far distances for every frustum slice // UpdateSplitDist computes the near and far distances for every frustum slice
// in camera eye space - that is, at what distance does a slice start and end // in camera eye space - that is, at what distance does a slice start and end
void ShadowPass::UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float near_distance, float far_distance) void ShadowPass::UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance)
{ {
float lambda = m_SplitWeight; float lambda = m_SplitWeight;
float ratio = far_distance / near_distance; float ratio = far_distance / near_distance;
@@ -51,7 +51,7 @@ void ShadowPass::UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float
frusta[m_CurrentNrOfSplits - 1].FarClip = far_distance; frusta[m_CurrentNrOfSplits - 1].FarClip = far_distance;
} }
void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::mat4 p, glm::mat4 v) void ShadowPass::UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v)
{ {
std::array<glm::vec4, 8> CornerPoint = { std::array<glm::vec4, 8> CornerPoint = {
glm::vec4(-1.f, -1.f, -1.f, 1.f), glm::vec4(-1.f, -1.f, -1.f, 1.f),
@@ -72,7 +72,7 @@ void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::mat4 p, glm::mat4 v)
} }
// Compute the 8 corner points of the current view frustum in world space // Compute the 8 corner points of the current view frustum in world space
void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir) void ShadowPass::UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir)
{ {
glm::vec3 up = glm::vec3(0.f, 1.f, 0.f); glm::vec3 up = glm::vec3(0.f, 1.f, 0.f);
glm::vec3 right = glm::normalize(glm::cross(view_dir, up)); glm::vec3 right = glm::normalize(glm::cross(view_dir, up));
@@ -100,7 +100,7 @@ void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position
frustum.CornerPoint[7] = far_center - up * far_height + right * far_width; frustum.CornerPoint[7] = far_center - up * far_height + right * far_width;
} }
float ShadowPass::FindRadius(Frustum& frustum) float ShadowPass::FindRadius(ShadowFrustum& frustum)
{ {
float radius = 0.f; float radius = 0.f;
@@ -164,7 +164,7 @@ void ShadowPass::ClearBuffer()
m_DepthBuffer.Unbind(); m_DepthBuffer.Unbind();
} }
void ShadowPass::PointsToLightspace(Frustum& frustum, glm::mat4 v) void ShadowPass::PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v)
{ {
float left = INFINITY; float left = INFINITY;
float right = -INFINITY; float right = -INFINITY;
@@ -184,7 +184,7 @@ void ShadowPass::PointsToLightspace(Frustum& frustum, glm::mat4 v)
frustum.LRBT = { left, right, bottom, top }; frustum.LRBT = { left, right, bottom, top };
} }
void ShadowPass::RadiusToLightspace(Frustum& frustum) void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum)
{ {
float quantizationStep = 1.0f / m_ResolutionSizeHeight; float quantizationStep = 1.0f / m_ResolutionSizeHeight;
@@ -214,7 +214,7 @@ void ShadowPass::Draw(RenderScene & scene)
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
for (auto &job : scene.DirectionalLightJobs) { for (auto &job : scene.Jobs.DirectionalLight) {
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job); auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
if (directionalLightJob) { if (directionalLightJob) {
@@ -230,7 +230,7 @@ void ShadowPass::Draw(RenderScene & scene)
GLERROR("ShadowLight ERROR"); GLERROR("ShadowLight ERROR");
for (auto &objectJob : scene.OpaqueObjects) { for (auto &objectJob : scene.Jobs.OpaqueObjects) {
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob))
{ {
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob); auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
@@ -246,7 +246,7 @@ void ShadowPass::Draw(RenderScene & scene)
} }
state->CullFace(GL_BACK); state->CullFace(GL_BACK);
for (auto &objectJob : scene.TransparentObjects) { for (auto &objectJob : scene.Jobs.TransparentObjects) {
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob))
{ {
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob); auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
@@ -254,12 +254,27 @@ void ShadowPass::Draw(RenderScene & scene)
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
glActiveTexture(GL_TEXTURE24); switch (modelJob->Type) {
if (modelJob->DiffuseTexture != nullptr) { case RawModel::MaterialType::SingleTextures:
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); case RawModel::MaterialType::Basic:
{
glActiveTexture(GL_TEXTURE24);
if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) {
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat));
}
else {
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
}
break;
} }
else { case RawModel::MaterialType::SplatMapping:
{
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
break;
}
} }
glBindVertexArray(modelJob->Model->VAO); glBindVertexArray(modelJob->Model->VAO);