Begin clean-up

This commit is contained in:
FakeShemp
2016-02-26 10:53:16 +01:00
parent df2e4abb52
commit f220d8088c
3 changed files with 29 additions and 42 deletions
+9 -21
View File
@@ -9,17 +9,12 @@
#include "ShadowPassState.h"
#include "imgui/imgui.h"
#define MAX_SPLITS 3
#define MAX_SPLITS 4
#define MAP_SIZE 216.f
enum NearFar { Near = 0, Far = 1 };
enum LRBT { Left = 0, Right = 1, Bottom = 2, Top = 3 };
struct ShadowCamera{
Camera* camera;
std::array<glm::vec3, 8> frustumCorners;
};
struct Frustum
{
float NearClip;
@@ -28,7 +23,7 @@ struct Frustum
float AspectRatio;
glm::vec3 MiddlePoint;
float Radius;
std::array<float, 4> LRTB;
std::array<float, 4> LRBT;
std::array<glm::vec3, 8> CornerPoint;
};
@@ -45,24 +40,19 @@ public:
void Draw(RenderScene& scene);
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> 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<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; }
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
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; }
private:
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);
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);
float FindRadius(Frustum& frustum);
void PointsToLightspace(Frustum& frustum, glm::mat4 v);
void RadiusToLightspace(Frustum& frustum, glm::mat4 v);
EventBroker* m_EventBroker;
EventBroker* m_EventBroker;
const IRenderer* m_Renderer;
std::array<GLuint, MAX_SPLITS> m_DepthMap;
@@ -77,8 +67,8 @@ private:
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
GLfloat m_LRBT[4] = { -10.f, 10.f, -10.f, 10.f };
GLuint resolutionSizeWidth = 1024 * 2;
GLuint resolutionSizeHeigth = 1024 * 2;
GLuint m_ResolutionSizeWidth = 1024 * 2;
GLuint m_ResolutionSizeHeigth = 1024 * 2;
bool m_ShadowOn = true;
int m_ShadowLevel = 0;
@@ -86,9 +76,7 @@ private:
int m_CurrentNrOfSplits = 3;
float m_SplitWeight = 0.75f;
//std::array<ShadowCamera, MAX_SPLITS> m_shadCams;
Frustum m_MainCamera;
std::array<Frustum, MAX_SPLITS> m_shadFrusta;
std::array<Frustum, MAX_SPLITS> m_shadowFrusta;
};
#endif
+3 -3
View File
@@ -244,9 +244,9 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr<Model
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
//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());
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());
//GLfloat m_NearFarPlane[2] = { -40.f, 30.f };
+17 -18
View File
@@ -11,14 +11,14 @@ ShadowPass::ShadowPass(IRenderer * renderer)
ShadowPass::~ShadowPass()
{
// m_shadCams
}
void ShadowPass::InitializeCameras(RenderScene & scene)
{
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
m_shadFrusta[i].AspectRatio = scene.Camera->AspectRatio();
m_shadFrusta[i].FOV = scene.Camera->FOV();
m_shadowFrusta[i].AspectRatio = scene.Camera->AspectRatio();
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[7] = far_center - up * far_height + right * far_width;
// Alternative way
// Alternative way.
//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),
@@ -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) };
//std::array<glm::vec3, 8> final;
//std::array<glm::vec3, 8> FinalPoints;
//for (int i = 0; i < 8; i++) {
// glm::vec4 anus = glm::inverse(p) * CornerPoint[i];
// anus = anus / anus.w;
// final[i] = glm::vec3(glm::inverse(v) * anus);
// glm::vec4 NDC = glm::inverse(p) * CornerPoint[i];
// NDC = NDC / NDC.w;
// FinalPoints[i] = glm::vec3(glm::inverse(v) * NDC);
//}
}
@@ -111,7 +111,7 @@ void ShadowPass::InitializeFrameBuffers()
for (int i = 0; i < m_CurrentNrOfSplits; 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_MIN_FILTER, GL_LINEAR);
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; }
}
frustum.LRTB = { left, right, bottom, top };
frustum.LRBT = { left, right, bottom, top };
}
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 top =frustum.Radius;
frustum.LRTB = { left, right, bottom, top };
frustum.LRBT = { left, right, bottom, top };
}
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);
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++) {
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]);
ShadowPassState* state = new ShadowPassState(m_DepthBuffer[i].GetHandle());
@@ -197,7 +197,7 @@ void ShadowPass::Draw(RenderScene & scene)
GLuint shaderHandle = m_ShadowProgram->GetHandle();
m_ShadowProgram->Bind();
glViewport(0, 0, resolutionSizeWidth / (1/* + i*/), resolutionSizeHeigth);
glViewport(0, 0, m_ResolutionSizeWidth / (1/* + i*/), m_ResolutionSizeHeigth);
glDisable(GL_TEXTURE_2D);
glCullFace(GL_FRONT);
//state->Disable(GL_CULL_FACE);
@@ -208,11 +208,10 @@ void ShadowPass::Draw(RenderScene & scene)
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
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]);
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_shadFrusta[i].LRTB[Left], m_shadFrusta[i].LRTB[Right], m_shadFrusta[i].LRTB[Bottom], m_shadFrusta[i].LRTB[Top], -0.f, 300.f);
PointsToLightspace(m_shadowFrusta[i], m_LightView[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], -30.f, 30.f);
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]));