begin fixing transparent object's shadows
This commit is contained in:
@@ -29,19 +29,19 @@ struct Frustum
|
|||||||
class ShadowPass
|
class ShadowPass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ShadowPass(IRenderer* renderer);
|
ShadowPass(IRenderer* renderer);
|
||||||
ShadowPass(IRenderer * renderer, int ShadowResX, int ShadowResY);
|
ShadowPass(IRenderer * renderer, int ShadowResX, int ShadowResY);
|
||||||
~ShadowPass();
|
~ShadowPass();
|
||||||
|
|
||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
void InitializeShaderPrograms();
|
void InitializeShaderPrograms();
|
||||||
void ClearBuffer();
|
void ClearBuffer();
|
||||||
void Draw(RenderScene& scene);
|
void Draw(RenderScene& scene);
|
||||||
|
|
||||||
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; }
|
||||||
std::array<float, MAX_SPLITS> FarDistance() const { return { m_shadowFrusta[0].FarClip, m_shadowFrusta[1].FarClip, m_shadowFrusta[2].FarClip, m_shadowFrusta[3].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; }
|
||||||
|
|
||||||
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
|
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
|
||||||
@@ -55,7 +55,7 @@ private:
|
|||||||
|
|
||||||
float FindRadius(Frustum& frustum);
|
float FindRadius(Frustum& frustum);
|
||||||
void RadiusToLightspace(Frustum& frustum);
|
void RadiusToLightspace(Frustum& frustum);
|
||||||
|
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
@@ -66,9 +66,9 @@ private:
|
|||||||
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;
|
||||||
|
|
||||||
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
|
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
|
||||||
GLuint m_ResolutionSizeWidth = 1024 * 2;
|
GLuint m_ResolutionSizeWidth = 1024 * 2;
|
||||||
GLuint m_ResolutionSizeHeight = 1024 * 2;
|
GLuint m_ResolutionSizeHeight = 1024 * 2;
|
||||||
|
|
||||||
int m_CurrentNrOfSplits = 4;
|
int m_CurrentNrOfSplits = 4;
|
||||||
float m_SplitWeight = 0.91f;
|
float m_SplitWeight = 0.91f;
|
||||||
|
|||||||
@@ -569,7 +569,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Core/UnitCube.mesh</Resource>
|
<Resource>Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="0.505882382" B="0" G="1" R="0"/>
|
<Color A="0.2" B="0" G="1" R="0"/>
|
||||||
<Transparent>true</Transparent>
|
<Transparent>true</Transparent>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
|
|||||||
@@ -210,8 +210,8 @@ float CalcShadowValue(vec4 light_space_pos, vec3 normal, vec3 light_dir, sampler
|
|||||||
|
|
||||||
// Various bias methods.
|
// Various bias methods.
|
||||||
|
|
||||||
bias = max(0.05 * (1.0 - dot(normal, light_dir)), bias);
|
//bias = max(0.05 * (1.0 - dot(normal, light_dir)), bias);
|
||||||
//bias = bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
bias = bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
||||||
|
|
||||||
// Calculate coordinates in projection space.
|
// Calculate coordinates in projection space.
|
||||||
|
|
||||||
|
|||||||
@@ -226,6 +226,12 @@ void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<E
|
|||||||
glUniform4fv(glGetUniformLocation(shaderHandle, "FillColor"), 1, glm::value_ptr(job->FillColor));
|
glUniform4fv(glGetUniformLocation(shaderHandle, "FillColor"), 1, glm::value_ptr(job->FillColor));
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), job->FillPercentage);
|
glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), job->FillPercentage);
|
||||||
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
|
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());
|
||||||
|
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,13 +254,6 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr<Model
|
|||||||
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_LRBT[4] = { -40.f, 100.f, -50.f, 50.f };
|
|
||||||
//glm::mat4 m_LightProjection = glm::ortho(m_LRBT[Left], m_LRBT[Right], m_LRBT[Bottom], m_LRBT[Top], m_NearFarPlane[Near], m_NearFarPlane[Far]);
|
|
||||||
//glm::mat4 m_LightView = glm::lookAt(glm::vec3(-20.0f, 20.0f, -20.0f), glm::vec3(0.0f), glm::vec3(1.0));
|
|
||||||
//glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), 1, GL_FALSE, glm::value_ptr(m_LightProjection));
|
|
||||||
//glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), 1, GL_FALSE, glm::value_ptr(m_LightView));
|
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -136,9 +136,6 @@ 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) {
|
|
||||||
m_DrawScreenQuadPass->Draw(m_ShadowPass->DepthMap());
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ImGuiRenderPass->Draw();
|
m_ImGuiRenderPass->Draw();
|
||||||
glfwSwapBuffers(m_Window);
|
glfwSwapBuffers(m_Window);
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void ShadowPass::UpdateSplitDist(std::array<Frustum, MAX_SPLITS>& frusta, float
|
|||||||
|
|
||||||
void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::mat4 p, glm::mat4 v)
|
void ShadowPass::UpdateFrustumPoints(Frustum& 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),
|
||||||
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),
|
||||||
@@ -81,7 +81,7 @@ void ShadowPass::UpdateFrustumPoints(Frustum& frustum, glm::vec3 camera_position
|
|||||||
glm::vec3 near_center = camera_position + glm::normalize(view_dir) * frustum.NearClip;
|
glm::vec3 near_center = camera_position + glm::normalize(view_dir) * frustum.NearClip;
|
||||||
frustum.MiddlePoint = near_center + (far_center - near_center) * 0.5f;
|
frustum.MiddlePoint = near_center + (far_center - near_center) * 0.5f;
|
||||||
|
|
||||||
up = glm::normalize(glm::cross(right, view_dir));
|
up = glm::normalize(glm::cross(right, view_dir));
|
||||||
|
|
||||||
// these heights and widths are half the heights and widths of the near and far plane rectangles.
|
// these heights and widths are half the heights and widths of the near and far plane rectangles.
|
||||||
float near_height = tan(frustum.FOV / 2.f) * frustum.NearClip;
|
float near_height = tan(frustum.FOV / 2.f) * frustum.NearClip;
|
||||||
@@ -118,7 +118,7 @@ float ShadowPass::FindRadius(Frustum& frustum)
|
|||||||
void ShadowPass::InitializeFrameBuffers()
|
void ShadowPass::InitializeFrameBuffers()
|
||||||
{
|
{
|
||||||
// Depth texture
|
// Depth texture
|
||||||
glGenTextures(1, &m_DepthMap);
|
glGenTextures(1, &m_DepthMap);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
||||||
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth, m_ResolutionSizeHeight, m_CurrentNrOfSplits);
|
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth, m_ResolutionSizeHeight, m_CurrentNrOfSplits);
|
||||||
@@ -136,17 +136,17 @@ void ShadowPass::InitializeFrameBuffers()
|
|||||||
m_DepthBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2DArray(&m_DepthMap, GL_DEPTH_ATTACHMENT, m_CurrentNrOfSplits)));
|
m_DepthBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2DArray(&m_DepthMap, GL_DEPTH_ATTACHMENT, m_CurrentNrOfSplits)));
|
||||||
m_DepthBuffer.Generate();
|
m_DepthBuffer.Generate();
|
||||||
|
|
||||||
GLERROR("depthMap failed END");
|
GLERROR("depthMap failed END");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::InitializeShaderPrograms()
|
void ShadowPass::InitializeShaderPrograms()
|
||||||
{
|
{
|
||||||
m_ShadowProgram = ResourceManager::Load<ShaderProgram>("#ShadowProgram");
|
m_ShadowProgram = ResourceManager::Load<ShaderProgram>("#ShadowProgram");
|
||||||
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Shadow.vert.glsl")));
|
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Shadow.vert.glsl")));
|
||||||
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Shadow.frag.glsl")));
|
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Shadow.frag.glsl")));
|
||||||
m_ShadowProgram->Compile();
|
m_ShadowProgram->Compile();
|
||||||
m_ShadowProgram->BindFragDataLocation(0, "ShadowMap");
|
m_ShadowProgram->BindFragDataLocation(0, "ShadowMap");
|
||||||
m_ShadowProgram->Link();
|
m_ShadowProgram->Link();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::ClearBuffer()
|
void ShadowPass::ClearBuffer()
|
||||||
@@ -155,7 +155,7 @@ void ShadowPass::ClearBuffer()
|
|||||||
|
|
||||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ void ShadowPass::RadiusToLightspace(Frustum& frustum)
|
|||||||
float left = -frustum.Radius;
|
float left = -frustum.Radius;
|
||||||
float right = frustum.Radius;
|
float right = frustum.Radius;
|
||||||
float bottom = -frustum.Radius;
|
float bottom = -frustum.Radius;
|
||||||
float top =frustum.Radius;
|
float top = frustum.Radius;
|
||||||
|
|
||||||
frustum.LRBT = { left, right, bottom, top };
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
}
|
}
|
||||||
@@ -198,7 +198,7 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
|
|
||||||
InitializeCameras(scene);
|
InitializeCameras(scene);
|
||||||
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
||||||
|
|
||||||
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
||||||
|
|
||||||
m_ShadowProgram->Bind();
|
m_ShadowProgram->Bind();
|
||||||
@@ -207,9 +207,9 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
|
|
||||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
|
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
|
||||||
|
|
||||||
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.DirectionalLightJobs) {
|
||||||
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||||
|
|
||||||
@@ -235,6 +235,20 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
|
|
||||||
GLERROR("Shadow Draw ERROR");
|
GLERROR("Shadow Draw ERROR");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state->CullFace(GL_BACK);
|
||||||
|
for (auto &objectJob : scene.TransparentObjects) {
|
||||||
|
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)));
|
||||||
|
|
||||||
|
GLERROR("Shadow Draw ERROR");
|
||||||
|
}
|
||||||
|
state->CullFace(GL_FRONT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,16 +2,13 @@
|
|||||||
|
|
||||||
ShadowPassState::ShadowPassState(GLuint frameBuffer)
|
ShadowPassState::ShadowPassState(GLuint frameBuffer)
|
||||||
{
|
{
|
||||||
GLERROR("---2");
|
|
||||||
BindFramebuffer(frameBuffer);
|
BindFramebuffer(frameBuffer);
|
||||||
GLERROR("---3");
|
|
||||||
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(255.f, 128.f, 128.f, 128.f));
|
ClearColor(glm::vec4(0.f, 0.f, 0.f, 0.f));
|
||||||
GLERROR("---4");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShadowPassState::~ShadowPassState()
|
ShadowPassState::~ShadowPassState()
|
||||||
|
|||||||
Reference in New Issue
Block a user