It compiles, but no shadows
This commit is contained in:
@@ -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"];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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,20 +246,35 @@ 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);
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user