Skip to content

Commit a67d61a

Browse files
committed
adjustable poisson kernel
1 parent c10c3ad commit a67d61a

File tree

6 files changed

+83
-35
lines changed

6 files changed

+83
-35
lines changed

HelloVulkan/Header/Configs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace CameraConfig
3232
constexpr float Zoom = 45.0f;
3333

3434
constexpr float Near = 0.1f;
35-
constexpr float Far = 100.0f;
35+
constexpr float Far = 50.0f;
3636
}
3737

3838
namespace ClusterForwardConfig

HelloVulkan/Header/UBOs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct ShadowMapUBO
4141
alignas(4)
4242
float cameraFarPlane;
4343
alignas(4)
44-
float pcfScale;
44+
float poissonSize;
4545
};
4646

4747
// Per model transformation matrix

HelloVulkan/Source/Apps/AppPBRShadow.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,11 @@ void AppPBRShadow::UpdateUI()
169169
};
170170
static ShadowMapUBO staticShadowUBO =
171171
{
172-
.shadowMinBias = 0.001f,
173-
.shadowMaxBias = 0.001f,
172+
.shadowMinBias = 0.002f,
173+
.shadowMaxBias = 0.002f,
174174
.cameraNearPlane = CameraConfig::Near,
175175
.cameraFarPlane = CameraConfig::Far,
176-
.pcfScale = 0.5f
176+
.poissonSize = 5.f
177177
};
178178
static float staticLightPos[3] = { -5.f, 30.0f, 5.0f};
179179

@@ -189,7 +189,7 @@ void AppPBRShadow::UpdateUI()
189189
ImGui::SeparatorText("Shadow mapping");
190190
ImGui::SliderFloat("Min Bias", &staticShadowUBO.shadowMinBias, 0.00001f, 0.01f);
191191
ImGui::SliderFloat("Max Bias", &staticShadowUBO.shadowMaxBias, 0.001f, 0.1f);
192-
ImGui::SliderFloat("PCF Scale", &staticShadowUBO.pcfScale, 0.1f, 3.0f);
192+
ImGui::SliderFloat("Poisson Kernel", &staticShadowUBO.poissonSize, 1.f, 10.f);
193193

194194
ImGui::SeparatorText("Light position");
195195
ImGui::SliderFloat("X", &(staticLightPos[0]), -10.0f, 10.0f);
@@ -206,7 +206,7 @@ void AppPBRShadow::UpdateUI()
206206

207207
shadowUBO_.shadowMinBias = staticShadowUBO.shadowMinBias;
208208
shadowUBO_.shadowMaxBias = staticShadowUBO.shadowMaxBias;
209-
shadowUBO_.pcfScale = staticShadowUBO.pcfScale;
209+
shadowUBO_.poissonSize = staticShadowUBO.poissonSize;
210210
}
211211

212212
// This is called from main.cpp

Shaders/ShadowMapping/PCF.glsl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ float ShadowPCF(vec4 shadowCoord, uint cascadeIndex)
66
vec3 L = normalize(shadowUBO.lightPosition.xyz - worldPos);
77
float NoL = dot(N, L);
88

9-
ivec2 texDim = textureSize(shadowMap, 0).xy;
9+
float bias = max(shadowUBO.shadowMaxBias * (1.0 - NoL), shadowUBO.shadowMinBias);
1010

11+
// PCF
12+
/*
1113
// (1.0 - NoL) allows more blur for vertical surfaces
1214
float scale = shadowUBO.pcfScale + (1.0 - NoL);
15+
ivec2 texDim = textureSize(shadowMap, 0).xy;
1316
float dx = scale * 1.0 / float(texDim.x);
1417
float dy = scale * 1.0 / float(texDim.y);
15-
16-
float bias = max(shadowUBO.shadowMaxBias * (1.0 - NoL), shadowUBO.shadowMinBias);
17-
18-
// PCF
19-
/*const int range = 1;
18+
19+
const int range = 1;
2020
float shadow = 0.0;
2121
int count = 0;
2222
for (int x = -range; x <= range; x++)
@@ -31,11 +31,12 @@ float ShadowPCF(vec4 shadowCoord, uint cascadeIndex)
3131
}
3232
return shadow / count;*/
3333

34+
float poissonRadius = 1000.0 * shadowUBO.poissonSize;
3435
float shadow = 0.0;
3536
int numSamples = 8;
3637
for (int i = 0; i < numSamples; ++i)
3738
{
38-
vec2 coord = GetPoissonDiskCoord(shadowCoord.xy, i);
39+
vec2 coord = GetPoissonDiskCoord(shadowCoord.xy, i, poissonRadius);
3940
float dist = texture(shadowMap, vec3(coord, cascadeIndex)).r;
4041
shadow += (shadowCoord.z - bias) > dist ? 0.1 : 1.0;
4142
}

Shaders/ShadowMapping/Poisson.glsl

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,70 @@
1-
const float DISK_RADIUS = 2500;
2-
const int NUM_ELEMENTS_DISK = 16;
1+
const int NUM_ELEMENTS_DISK = 64;
32

43
const vec2 poissonDisk[NUM_ELEMENTS_DISK] = vec2[](
5-
vec2(-0.94201624, -0.39906216),
6-
vec2(0.94558609, -0.76890725),
7-
vec2(-0.094184101, -0.92938870),
8-
vec2(0.34495938, 0.29387760),
9-
vec2(-0.91588581, 0.45771432),
10-
vec2(-0.81544232, -0.87912464),
11-
vec2(-0.38277543, 0.27676845),
12-
vec2(0.97484398, 0.75648379),
13-
vec2(0.44323325, -0.97511554),
14-
vec2(0.53742981, -0.47373420),
15-
vec2(-0.26496911, -0.41893023),
16-
vec2(0.79197514, 0.19090188),
17-
vec2(-0.24188840, 0.99706507),
18-
vec2(-0.81409955, 0.91437590),
19-
vec2(0.19984126, 0.78641367),
20-
vec2(0.14383161, -0.14100790)
4+
vec2(-0.5119625f, -0.4827938f),
5+
vec2(-0.2171264f, -0.4768726f),
6+
vec2(-0.7552931f, -0.2426507f),
7+
vec2(-0.7136765f, -0.4496614f),
8+
vec2(-0.5938849f, -0.6895654f),
9+
vec2(-0.3148003f, -0.7047654f),
10+
vec2(-0.42215f, -0.2024607f),
11+
vec2(-0.9466816f, -0.2014508f),
12+
vec2(-0.8409063f, -0.03465778f),
13+
vec2(-0.6517572f, -0.07476326f),
14+
vec2(-0.1041822f, -0.02521214f),
15+
vec2(-0.3042712f, -0.02195431f),
16+
vec2(-0.5082307f, 0.1079806f),
17+
vec2(-0.08429877f, -0.2316298f),
18+
vec2(-0.9879128f, 0.1113683f),
19+
vec2(-0.3859636f, 0.3363545f),
20+
vec2(-0.1925334f, 0.1787288f),
21+
vec2(0.003256182f, 0.138135f),
22+
vec2(-0.8706837f, 0.3010679f),
23+
vec2(-0.6982038f, 0.1904326f),
24+
vec2(0.1975043f, 0.2221317f),
25+
vec2(0.1507788f, 0.4204168f),
26+
vec2(0.3514056f, 0.09865579f),
27+
vec2(0.1558783f, -0.08460935f),
28+
vec2(-0.0684978f, 0.4461993f),
29+
vec2(0.3780522f, 0.3478679f),
30+
vec2(0.3956799f, -0.1469177f),
31+
vec2(0.5838975f, 0.1054943f),
32+
vec2(0.6155105f, 0.3245716f),
33+
vec2(0.3928624f, -0.4417621f),
34+
vec2(0.1749884f, -0.4202175f),
35+
vec2(0.6813727f, -0.2424808f),
36+
vec2(-0.6707711f, 0.4912741f),
37+
vec2(0.0005130528f, -0.8058334f),
38+
vec2(0.02703013f, -0.6010728f),
39+
vec2(-0.1658188f, -0.9695674f),
40+
vec2(0.4060591f, -0.7100726f),
41+
vec2(0.7713396f, -0.4713659f),
42+
vec2(0.573212f, -0.51544f),
43+
vec2(-0.3448896f, -0.9046497f),
44+
vec2(0.1268544f, -0.9874692f),
45+
vec2(0.7418533f, -0.6667366f),
46+
vec2(0.3492522f, 0.5924662f),
47+
vec2(0.5679897f, 0.5343465f),
48+
vec2(0.5663417f, 0.7708698f),
49+
vec2(0.7375497f, 0.6691415f),
50+
vec2(0.2271994f, -0.6163502f),
51+
vec2(0.2312844f, 0.8725659f),
52+
vec2(0.4216993f, 0.9002838f),
53+
vec2(0.4262091f, -0.9013284f),
54+
vec2(0.2001408f, -0.808381f),
55+
vec2(0.149394f, 0.6650763f),
56+
vec2(-0.09640376f, 0.9843736f),
57+
vec2(0.7682328f, -0.07273844f),
58+
vec2(0.04146584f, 0.8313184f),
59+
vec2(0.9705266f, -0.1143304f),
60+
vec2(0.9670017f, 0.1293385f),
61+
vec2(0.9015037f, -0.3306949f),
62+
vec2(-0.5085648f, 0.7534177f),
63+
vec2(0.9055501f, 0.3758393f),
64+
vec2(0.7599946f, 0.1809109f),
65+
vec2(-0.2483695f, 0.7942952f),
66+
vec2(-0.4241052f, 0.5581087f),
67+
vec2(-0.1020106f, 0.6724468f)
2168
);
2269

2370
// Returns a pseudo random number based on a vec3 and an int.
@@ -28,8 +75,8 @@ float PseudoRandom(vec3 seed, int i)
2875
return fract(sin(dotValue) * 43758.5453);
2976
}
3077

31-
vec2 GetPoissonDiskCoord(vec2 projCoords, int i)
78+
vec2 GetPoissonDiskCoord(vec2 projCoords, int i, float radius)
3279
{
3380
int index = int(float(NUM_ELEMENTS_DISK) * PseudoRandom(projCoords.xyy, i)) % NUM_ELEMENTS_DISK;
34-
return projCoords.xy + poissonDisk[index] / DISK_RADIUS;
81+
return projCoords.xy + poissonDisk[index] / radius;
3582
}

Shaders/ShadowMapping/UBO.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ struct ShadowUBO
99
float shadowMaxBias;
1010
float cameraNear;
1111
float cameraFar;
12-
float pcfScale;
12+
float poissonSize;
1313
};

0 commit comments

Comments
 (0)