Shadow WIP stage 2
- Soft shadow
This commit is contained in:
@@ -32,8 +32,8 @@ public:
|
||||
glm::mat4 lightSpaceMatrix() const { return m_LightSpaceMatrix; }
|
||||
glm::mat4 lightP() const { return m_LightProjection; }
|
||||
glm::mat4 lightV() const { return m_LightView; }
|
||||
//glm::mat4 lightV() const { return m_LightProjection; } //swapped m_P -> m_V
|
||||
//glm::mat4 lightP() const { return m_LightView; } // swapped m_V -> m_P
|
||||
|
||||
void setResolution(GLuint width, GLuint height) { resolutionSizeWidth = width; resolutionSizeHeigth = height; }
|
||||
|
||||
private:
|
||||
|
||||
@@ -57,6 +57,10 @@ private:
|
||||
glm::mat4 m_LightProjection;
|
||||
glm::mat4 m_LightView;
|
||||
glm::mat4 m_LightSpaceMatrix;
|
||||
|
||||
GLuint resolutionSizeWidth = 2048;
|
||||
GLuint resolutionSizeHeigth = 2048;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -114,6 +114,13 @@ vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textu
|
||||
return vec4(TBN * normalize(NormalMap), 0.0);
|
||||
}
|
||||
|
||||
vec2 poissonDisk[4] = vec2[](
|
||||
vec2( -0.94201624, -0.39906216 ),
|
||||
vec2( 0.94558609, -0.76890725 ),
|
||||
vec2( -0.094184101, -0.92938870 ),
|
||||
vec2( 0.34495938, 0.29387760 )
|
||||
);
|
||||
|
||||
float CalcShadowValue(vec4 positionLightSpace, vec4 normal, vec4 lightDir, sampler2D depthTexture)
|
||||
{
|
||||
|
||||
@@ -129,9 +136,22 @@ float CalcShadowValue(vec4 positionLightSpace, vec4 normal, vec4 lightDir, sampl
|
||||
//float currentDepth = positionLightSpace.z;
|
||||
float currentDepth = projCoords.z;
|
||||
// Check whether current frag pos is in shadow
|
||||
float shadow = currentDepth /*- bias*/ > closestDepth ? 1.0 : 0.0;
|
||||
//float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;
|
||||
// float shadow = currentDepth > closestDepth ? 1.0 : 0.0;
|
||||
|
||||
float shadow = 0.0;
|
||||
//soft shadow - using percentage-closer filtering (PCF) is to simply sample the surrounding texels of the depth map and average the results:
|
||||
vec2 texelSize = 1.0 / textureSize(depthTexture, 0);
|
||||
for(int x = -1; x <= 1; ++x)
|
||||
{
|
||||
for(int y = -1; y <= 1; ++y)
|
||||
{
|
||||
float pcfDepth = texture(depthTexture, projCoords.xy + vec2(x, y) * texelSize).r;
|
||||
shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;
|
||||
}
|
||||
}
|
||||
shadow /= 9.0;
|
||||
|
||||
return shadow;
|
||||
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ void ShadowPass::InitializeFrameBuffers()
|
||||
// Depth texture
|
||||
glGenTextures(1, &m_DepthMap);
|
||||
glBindTexture(GL_TEXTURE_2D, m_DepthMap);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, resolutionSizeWidth, resolutionSizeHeigth, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
|
||||
//glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, 0, GL_RGB, GL_FLOAT, 0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
@@ -65,9 +65,9 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
GLuint shaderHandle = m_ShadowProgram->GetHandle();
|
||||
m_ShadowProgram->Bind();
|
||||
|
||||
//if (scene.ClearDepth) {
|
||||
// glClear(GL_COLOR_BUFFER_BIT);
|
||||
//}
|
||||
glViewport(0, 0, resolutionSizeWidth, resolutionSizeHeigth);
|
||||
glCullFace(GL_FRONT);
|
||||
|
||||
|
||||
ImGui::DragFloat4("ShadowMapCam", m_LRBT, 1.f, -1000.f, 1000.f);
|
||||
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f);
|
||||
@@ -111,8 +111,9 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
|
||||
|
||||
|
||||
|
||||
//m_ShadowProgram->Unbind();
|
||||
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
glCullFace(GL_BACK);
|
||||
m_ShadowProgram->Unbind();
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user