Begin clean-up
This commit is contained in:
@@ -9,17 +9,12 @@
|
|||||||
#include "ShadowPassState.h"
|
#include "ShadowPassState.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
#define MAX_SPLITS 3
|
#define MAX_SPLITS 4
|
||||||
#define MAP_SIZE 216.f
|
#define MAP_SIZE 216.f
|
||||||
|
|
||||||
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 ShadowCamera{
|
|
||||||
Camera* camera;
|
|
||||||
std::array<glm::vec3, 8> frustumCorners;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Frustum
|
struct Frustum
|
||||||
{
|
{
|
||||||
float NearClip;
|
float NearClip;
|
||||||
@@ -28,7 +23,7 @@ struct Frustum
|
|||||||
float AspectRatio;
|
float AspectRatio;
|
||||||
glm::vec3 MiddlePoint;
|
glm::vec3 MiddlePoint;
|
||||||
float Radius;
|
float Radius;
|
||||||
std::array<float, 4> LRTB;
|
std::array<float, 4> LRBT;
|
||||||
std::array<glm::vec3, 8> CornerPoint;
|
std::array<glm::vec3, 8> CornerPoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,24 +40,19 @@ public:
|
|||||||
void Draw(RenderScene& scene);
|
void Draw(RenderScene& scene);
|
||||||
|
|
||||||
GLuint DepthMap(int level) const { return m_DepthMap[level]; }
|
GLuint DepthMap(int level) const { return m_DepthMap[level]; }
|
||||||
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; }
|
||||||
std::array<float, MAX_SPLITS> farDistance() const { return { m_shadFrusta[0].FarClip, m_shadFrusta[1].FarClip, m_shadFrusta[2].FarClip }; }
|
std::array<float, MAX_SPLITS> FarDistance() const { return { m_shadowFrusta[0].FarClip, m_shadowFrusta[1].FarClip, m_shadowFrusta[2].FarClip, m_shadowFrusta[3].FarClip }; }
|
||||||
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
|
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
|
||||||
private:
|
private:
|
||||||
void UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir, glm::mat4 p, glm::mat4 v);
|
void UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir, glm::mat4 p, glm::mat4 v);
|
||||||
void UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
|
void UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
|
||||||
glm::mat4 ApplyCropMatrix(Frustum& frustum, glm::mat4 m, glm::mat4 v);
|
|
||||||
|
|
||||||
glm::mat4 CalculateFrustum(RenderScene & scene, std::shared_ptr<DirectionalLightJob> directionalLightJob, ShadowCamera shad_cam);
|
|
||||||
glm::mat4 FindNewFrustum(Frustum frustum, glm::mat4 v, glm::mat4 p);
|
|
||||||
void InitializeCameras(RenderScene & scene);
|
void InitializeCameras(RenderScene & scene);
|
||||||
float FindRadius(Frustum& frustum);
|
float FindRadius(Frustum& frustum);
|
||||||
void PointsToLightspace(Frustum& frustum, glm::mat4 v);
|
void PointsToLightspace(Frustum& frustum, glm::mat4 v);
|
||||||
void RadiusToLightspace(Frustum& frustum, glm::mat4 v);
|
void RadiusToLightspace(Frustum& frustum, glm::mat4 v);
|
||||||
|
|
||||||
|
EventBroker* m_EventBroker;
|
||||||
EventBroker* m_EventBroker;
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
std::array<GLuint, MAX_SPLITS> m_DepthMap;
|
std::array<GLuint, MAX_SPLITS> m_DepthMap;
|
||||||
@@ -77,8 +67,8 @@ private:
|
|||||||
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
|
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
|
||||||
GLfloat m_LRBT[4] = { -10.f, 10.f, -10.f, 10.f };
|
GLfloat m_LRBT[4] = { -10.f, 10.f, -10.f, 10.f };
|
||||||
|
|
||||||
GLuint resolutionSizeWidth = 1024 * 2;
|
GLuint m_ResolutionSizeWidth = 1024 * 2;
|
||||||
GLuint resolutionSizeHeigth = 1024 * 2;
|
GLuint m_ResolutionSizeHeigth = 1024 * 2;
|
||||||
|
|
||||||
bool m_ShadowOn = true;
|
bool m_ShadowOn = true;
|
||||||
int m_ShadowLevel = 0;
|
int m_ShadowLevel = 0;
|
||||||
@@ -86,9 +76,7 @@ private:
|
|||||||
int m_CurrentNrOfSplits = 3;
|
int m_CurrentNrOfSplits = 3;
|
||||||
float m_SplitWeight = 0.75f;
|
float m_SplitWeight = 0.75f;
|
||||||
|
|
||||||
//std::array<ShadowCamera, MAX_SPLITS> m_shadCams;
|
std::array<Frustum, MAX_SPLITS> m_shadowFrusta;
|
||||||
Frustum m_MainCamera;
|
|
||||||
std::array<Frustum, MAX_SPLITS> m_shadFrusta;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -244,9 +244,9 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr<Model
|
|||||||
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
|
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
|
||||||
|
|
||||||
//Shadow
|
//Shadow
|
||||||
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());
|
||||||
|
|
||||||
|
|
||||||
//GLfloat m_NearFarPlane[2] = { -40.f, 30.f };
|
//GLfloat m_NearFarPlane[2] = { -40.f, 30.f };
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ ShadowPass::ShadowPass(IRenderer * renderer)
|
|||||||
|
|
||||||
ShadowPass::~ShadowPass()
|
ShadowPass::~ShadowPass()
|
||||||
{
|
{
|
||||||
// m_shadCams
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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++) {
|
||||||
m_shadFrusta[i].AspectRatio = scene.Camera->AspectRatio();
|
m_shadowFrusta[i].AspectRatio = scene.Camera->AspectRatio();
|
||||||
m_shadFrusta[i].FOV = scene.Camera->FOV();
|
m_shadowFrusta[i].FOV = scene.Camera->FOV();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position
|
|||||||
frustum.CornerPoint[6] = far_center + up * far_height + right * far_width;
|
frustum.CornerPoint[6] = far_center + up * far_height + right * far_width;
|
||||||
frustum.CornerPoint[7] = far_center - up * far_height + right * far_width;
|
frustum.CornerPoint[7] = far_center - up * far_height + right * far_width;
|
||||||
|
|
||||||
// Alternative way
|
// Alternative way.
|
||||||
//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),
|
||||||
// glm::vec4(-1.f, 1.f, -1.f, 1.f),
|
// glm::vec4(-1.f, 1.f, -1.f, 1.f),
|
||||||
@@ -80,12 +80,12 @@ void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position
|
|||||||
// glm::vec4(1.f, 1.f, 1.f, 1.f),
|
// glm::vec4(1.f, 1.f, 1.f, 1.f),
|
||||||
// glm::vec4(1.f, -1.f, 1.f, 1.f) };
|
// glm::vec4(1.f, -1.f, 1.f, 1.f) };
|
||||||
|
|
||||||
//std::array<glm::vec3, 8> final;
|
//std::array<glm::vec3, 8> FinalPoints;
|
||||||
|
|
||||||
//for (int i = 0; i < 8; i++) {
|
//for (int i = 0; i < 8; i++) {
|
||||||
// glm::vec4 anus = glm::inverse(p) * CornerPoint[i];
|
// glm::vec4 NDC = glm::inverse(p) * CornerPoint[i];
|
||||||
// anus = anus / anus.w;
|
// NDC = NDC / NDC.w;
|
||||||
// final[i] = glm::vec3(glm::inverse(v) * anus);
|
// FinalPoints[i] = glm::vec3(glm::inverse(v) * NDC);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ void ShadowPass::InitializeFrameBuffers()
|
|||||||
|
|
||||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
glBindTexture(GL_TEXTURE_2D, m_DepthMap[i]);
|
glBindTexture(GL_TEXTURE_2D, m_DepthMap[i]);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, resolutionSizeWidth / (1 /*+ i*/), resolutionSizeHeigth + (1 /*+ i*/), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth / (1 /*+ i*/), m_ResolutionSizeHeigth + (1 /*+ i*/), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
@@ -165,7 +165,7 @@ void ShadowPass::PointsToLightspace(Frustum& frustum, glm::mat4 v)
|
|||||||
if (tempPoint.y > top) { top = tempPoint.y; }
|
if (tempPoint.y > top) { top = tempPoint.y; }
|
||||||
}
|
}
|
||||||
|
|
||||||
frustum.LRTB = { left, right, bottom, top };
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::RadiusToLightspace(Frustum& frustum, glm::mat4 v)
|
void ShadowPass::RadiusToLightspace(Frustum& frustum, glm::mat4 v)
|
||||||
@@ -175,7 +175,7 @@ void ShadowPass::RadiusToLightspace(Frustum& frustum, glm::mat4 v)
|
|||||||
float bottom = -frustum.Radius;
|
float bottom = -frustum.Radius;
|
||||||
float top =frustum.Radius;
|
float top =frustum.Radius;
|
||||||
|
|
||||||
frustum.LRTB = { left, right, bottom, top };
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::Draw(RenderScene & scene)
|
void ShadowPass::Draw(RenderScene & scene)
|
||||||
@@ -186,10 +186,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
ImGui::DragInt("ShadowLevel", &m_ShadowLevel, 0.05f, 0, m_CurrentNrOfSplits - 1);
|
ImGui::DragInt("ShadowLevel", &m_ShadowLevel, 0.05f, 0, m_CurrentNrOfSplits - 1);
|
||||||
|
|
||||||
InitializeCameras(scene);
|
InitializeCameras(scene);
|
||||||
UpdateSplitDist(m_shadFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
||||||
|
|
||||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
UpdateFrustumPoints(m_shadFrusta[i], scene.Camera->Position(), scene.Camera->Forward(), scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix());
|
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward(), scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix());
|
||||||
//float test = FindRadius(m_shadFrusta[i]);
|
//float test = FindRadius(m_shadFrusta[i]);
|
||||||
|
|
||||||
ShadowPassState* state = new ShadowPassState(m_DepthBuffer[i].GetHandle());
|
ShadowPassState* state = new ShadowPassState(m_DepthBuffer[i].GetHandle());
|
||||||
@@ -197,7 +197,7 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
GLuint shaderHandle = m_ShadowProgram->GetHandle();
|
GLuint shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
m_ShadowProgram->Bind();
|
m_ShadowProgram->Bind();
|
||||||
|
|
||||||
glViewport(0, 0, resolutionSizeWidth / (1/* + i*/), resolutionSizeHeigth);
|
glViewport(0, 0, m_ResolutionSizeWidth / (1/* + i*/), m_ResolutionSizeHeigth);
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
glCullFace(GL_FRONT);
|
glCullFace(GL_FRONT);
|
||||||
//state->Disable(GL_CULL_FACE);
|
//state->Disable(GL_CULL_FACE);
|
||||||
@@ -208,11 +208,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||||
|
|
||||||
if (directionalLightJob) {
|
if (directionalLightJob) {
|
||||||
m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadFrusta[i].MiddlePoint, m_shadFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f));
|
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));
|
||||||
|
|
||||||
PointsToLightspace(m_shadFrusta[i], m_LightView[i]);
|
PointsToLightspace(m_shadowFrusta[i], m_LightView[i]);
|
||||||
m_LightProjection[i] = glm::ortho(m_shadFrusta[i].LRTB[Left], m_shadFrusta[i].LRTB[Right], m_shadFrusta[i].LRTB[Bottom], m_shadFrusta[i].LRTB[Top], -30.f, 30.f);
|
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], -30.f, 30.f);
|
||||||
//m_LightProjection[i] = glm::ortho(m_shadFrusta[i].LRTB[Left], m_shadFrusta[i].LRTB[Right], m_shadFrusta[i].LRTB[Bottom], m_shadFrusta[i].LRTB[Top], -0.f, 300.f);
|
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||||
|
|||||||
Reference in New Issue
Block a user