|
@@ -27,12 +27,12 @@ float noise(const in vec2 coords) {
|
|
|
float b = 78.233;
|
|
|
float c = 43758.5453;
|
|
|
float dt = dot(coords, vec2(a,b));
|
|
|
- float sn = mod(dt, 3.14159);
|
|
|
+ float sn = mod(dt, PI);
|
|
|
return abs(fract(sin(sn) * c)); // is abs necessary?
|
|
|
}
|
|
|
|
|
|
vec2 getNoiseVec2(const in vec2 coords) {
|
|
|
- return vec2(noise(coords), noise(coords) + 2.71828);
|
|
|
+ return vec2(noise(coords), noise(coords + vec2(PI, 2.71828)));
|
|
|
}
|
|
|
|
|
|
bool isBackground(const in float depth) {
|
|
@@ -53,8 +53,10 @@ vec3 normalFromDepth(const in float depth, const in float depth1, const in float
|
|
|
return normalize(normal);
|
|
|
}
|
|
|
|
|
|
+// StarCraft II Ambient Occlusion by [Filion and McNaughton 2008]
|
|
|
void main(void) {
|
|
|
- vec2 selfCoords = gl_FragCoord.xy / uTexSize;
|
|
|
+ vec2 invTexSize = 1.0 / uTexSize;
|
|
|
+ vec2 selfCoords = gl_FragCoord.xy * invTexSize;
|
|
|
|
|
|
float selfDepth = getDepth(selfCoords);
|
|
|
vec2 selfPackedDepth = packUnitIntervalToRG(selfDepth);
|
|
@@ -64,8 +66,8 @@ void main(void) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- vec2 offset1 = vec2(0.0, 0.001);
|
|
|
- vec2 offset2 = vec2(0.001, 0.0);
|
|
|
+ vec2 offset1 = vec2(0.0, invTexSize.y);
|
|
|
+ vec2 offset2 = vec2(invTexSize.x, 0.0);
|
|
|
|
|
|
float selfDepth1 = getDepth(selfCoords + offset1);
|
|
|
float selfDepth2 = getDepth(selfCoords + offset2);
|
|
@@ -89,8 +91,7 @@ void main(void) {
|
|
|
offset.xyz /= offset.w;
|
|
|
offset.xyz = offset.xyz * 0.5 + 0.5;
|
|
|
|
|
|
- float sampleDepth = getDepth(offset.xy);
|
|
|
- float sampleViewZ = screenSpaceToViewSpace(vec3(offset.xy, sampleDepth), uInvProjection).z;
|
|
|
+ float sampleViewZ = screenSpaceToViewSpace(vec3(offset.xy, getDepth(offset.xy)), uInvProjection).z;
|
|
|
|
|
|
occlusion += (sampleViewZ >= sampleViewPos.z + uBias ? 1.0 : 0.0) * smootherstep(0.0, 1.0, uRadius / abs(selfViewPos.z - sampleViewZ));
|
|
|
}
|