ADD: CSM half-working
This commit is contained in:
@@ -8,7 +8,7 @@ layout(location=0) out vec4 outColor;
|
||||
layout(set=1, binding=0) uniform sampler2D posTex;
|
||||
layout(set=1, binding=1) uniform sampler2D normalTex;
|
||||
layout(set=1, binding=2) uniform sampler2D albedoTex;
|
||||
layout(set=2, binding=0) uniform sampler2D shadowTex;
|
||||
layout(set=2, binding=0) uniform sampler2D shadowTex[MAX_CASCADES];
|
||||
|
||||
const float PI = 3.14159265359;
|
||||
|
||||
@@ -31,7 +31,15 @@ const vec2 POISSON_16[16] = vec2[16](
|
||||
|
||||
float calcShadowVisibility(vec3 worldPos, vec3 N, vec3 L)
|
||||
{
|
||||
vec4 lclip = sceneData.lightViewProj * vec4(worldPos, 1.0);
|
||||
// Choose cascade based on view-space depth
|
||||
float viewDepth = - (sceneData.view * vec4(worldPos, 1.0)).z; // positive
|
||||
int ci = 0;
|
||||
if (viewDepth > sceneData.cascadeSplitsView.x) ci = 1;
|
||||
if (viewDepth > sceneData.cascadeSplitsView.y) ci = 2;
|
||||
if (viewDepth > sceneData.cascadeSplitsView.z) ci = 3;
|
||||
ci = clamp(ci, 0, MAX_CASCADES-1);
|
||||
|
||||
vec4 lclip = sceneData.lightViewProjCascades[ci] * vec4(worldPos, 1.0);
|
||||
vec3 ndc = lclip.xyz / lclip.w;
|
||||
vec2 suv = ndc.xy * 0.5 + 0.5;
|
||||
|
||||
@@ -48,7 +56,7 @@ float calcShadowVisibility(vec3 worldPos, vec3 N, vec3 L)
|
||||
float ddz = max(abs(dzdx), abs(dzdy));
|
||||
float bias = slopeBias + ddz * 0.75;
|
||||
|
||||
ivec2 dim = textureSize(shadowTex, 0);
|
||||
ivec2 dim = textureSize(shadowTex[ci], 0);
|
||||
vec2 texelSize = 1.0 / vec2(dim);
|
||||
|
||||
float baseRadius = 1.25;
|
||||
@@ -70,8 +78,9 @@ float calcShadowVisibility(vec3 worldPos, vec3 N, vec3 L)
|
||||
float pr = length(pu);
|
||||
float w = 1.0 - smoothstep(0.0, 0.65, pr);
|
||||
|
||||
float mapD = texture(shadowTex, suv + off).r;
|
||||
float mapD = texture(shadowTex[ci], suv + off).r;
|
||||
|
||||
// Standard depth shadow map: occluded when current > mapD + bias
|
||||
float occ = step(current + bias, mapD);
|
||||
|
||||
occluded += occ * w;
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
// Maximum number of shadow cascades supported in shaders
|
||||
#define MAX_CASCADES 4
|
||||
|
||||
layout(set = 0, binding = 0) uniform SceneData{
|
||||
|
||||
mat4 view;
|
||||
mat4 proj;
|
||||
mat4 viewproj;
|
||||
mat4 lightViewProj;
|
||||
mat4 lightViewProj; // legacy single-shadow for fallback
|
||||
vec4 ambientColor;
|
||||
vec4 sunlightDirection; //w for sun power
|
||||
vec4 sunlightColor;
|
||||
// CSM data
|
||||
mat4 lightViewProjCascades[MAX_CASCADES];
|
||||
vec4 cascadeSplitsView; // positive view-space distances of far plane per cascade
|
||||
} sceneData;
|
||||
|
||||
layout(set = 1, binding = 0) uniform GLTFMaterialData{
|
||||
|
||||
@@ -18,12 +18,14 @@ layout(buffer_reference, std430) readonly buffer VertexBuffer{
|
||||
layout(push_constant) uniform PushConsts {
|
||||
mat4 render_matrix;
|
||||
VertexBuffer vertexBuffer;
|
||||
uint cascadeIndex;
|
||||
} PC;
|
||||
|
||||
void main()
|
||||
{
|
||||
Vertex v = PC.vertexBuffer.vertices[gl_VertexIndex];
|
||||
vec4 worldPos = PC.render_matrix * vec4(v.position, 1.0);
|
||||
gl_Position = sceneData.lightViewProj * worldPos;
|
||||
uint ci = min(PC.cascadeIndex, uint(MAX_CASCADES-1));
|
||||
gl_Position = sceneData.lightViewProjCascades[ci] * worldPos;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user