Skip to content

Commit c10c3ad

Browse files
committed
poisson noise
1 parent bcbdb8d commit c10c3ad

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

HelloVulkan/HelloVulkan.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
<None Include="..\Shaders\PBRPushConstants.glsl" />
155155
<None Include="..\Shaders\Radiance.glsl" />
156156
<None Include="..\Shaders\ShadowMapping\Depth.frag" />
157+
<None Include="..\Shaders\ShadowMapping\Poisson.glsl" />
157158
<None Include="..\Shaders\SlotBased\Mesh.frag" />
158159
<None Include="..\Shaders\SlotBased\Mesh.vert" />
159160
<None Include="..\Shaders\TangentNormalToWorld.glsl" />

HelloVulkan/HelloVulkan.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@
168168
<None Include="..\Shaders\ShadowMapping\Depth.frag">
169169
<Filter>Shaders\ShadowMapping</Filter>
170170
</None>
171+
<None Include="..\Shaders\ShadowMapping\Poisson.glsl">
172+
<Filter>Shaders\ShadowMapping</Filter>
173+
</None>
171174
</ItemGroup>
172175
<ItemGroup>
173176
<ClInclude Include="Header\Camera.h">

Shaders/ShadowMapping/PCF.glsl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include <ShadowMapping//Poisson.glsl>
2+
13
float ShadowPCF(vec4 shadowCoord, uint cascadeIndex)
24
{
35
vec3 N = normalize(normal);
@@ -13,8 +15,8 @@ float ShadowPCF(vec4 shadowCoord, uint cascadeIndex)
1315

1416
float bias = max(shadowUBO.shadowMaxBias * (1.0 - NoL), shadowUBO.shadowMinBias);
1517

16-
// TODO Find out a better blurring technique concerning multiple shadow maps
17-
const int range = 1;
18+
// PCF
19+
/*const int range = 1;
1820
float shadow = 0.0;
1921
int count = 0;
2022
for (int x = -range; x <= range; x++)
@@ -27,5 +29,15 @@ float ShadowPCF(vec4 shadowCoord, uint cascadeIndex)
2729
count++;
2830
}
2931
}
30-
return shadow / count;
32+
return shadow / count;*/
33+
34+
float shadow = 0.0;
35+
int numSamples = 8;
36+
for (int i = 0; i < numSamples; ++i)
37+
{
38+
vec2 coord = GetPoissonDiskCoord(shadowCoord.xy, i);
39+
float dist = texture(shadowMap, vec3(coord, cascadeIndex)).r;
40+
shadow += (shadowCoord.z - bias) > dist ? 0.1 : 1.0;
41+
}
42+
return shadow / float(numSamples);
3143
}

Shaders/ShadowMapping/Poisson.glsl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const float DISK_RADIUS = 2500;
2+
const int NUM_ELEMENTS_DISK = 16;
3+
4+
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)
21+
);
22+
23+
// Returns a pseudo random number based on a vec3 and an int.
24+
float PseudoRandom(vec3 seed, int i)
25+
{
26+
vec4 seed4 = vec4(seed, i);
27+
float dotValue = dot(seed4, vec4(12.9898, 78.233, 45.164, 94.673));
28+
return fract(sin(dotValue) * 43758.5453);
29+
}
30+
31+
vec2 GetPoissonDiskCoord(vec2 projCoords, int i)
32+
{
33+
int index = int(float(NUM_ELEMENTS_DISK) * PseudoRandom(projCoords.xyy, i)) % NUM_ELEMENTS_DISK;
34+
return projCoords.xy + poissonDisk[index] / DISK_RADIUS;
35+
}

0 commit comments

Comments
 (0)