Skip to content

Commit a633443

Browse files
authored
GTAOPass: distance dependent horizon search (#27370)
1 parent f394e71 commit a633443

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

examples/jsm/postprocessing/GTAOPass.js

+7
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ class GTAOPass extends Pass {
241241

242242
}
243243

244+
if ( parameters.distanceFallOff !== undefined ) {
245+
246+
this.gtaoMaterial.uniforms.distanceFallOff.value = parameters.distanceFallOff;
247+
this.gtaoMaterial.needsUpdate = true;
248+
249+
}
250+
244251
if ( parameters.scale !== undefined ) {
245252

246253
this.gtaoMaterial.uniforms.scale.value = parameters.scale;

examples/jsm/shaders/GTAOShader.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const GTAOShader = {
6363
radius: { value: 0.25 },
6464
distanceExponent: { value: 1. },
6565
thickness: { value: 1. },
66+
distanceFallOff: { value: 1. },
6667
scale: { value: 1. },
6768
sceneBoxMin: { value: new Vector3( - 1, - 1, - 1 ) },
6869
sceneBoxMax: { value: new Vector3( 1, 1, 1 ) },
@@ -91,6 +92,7 @@ const GTAOShader = {
9192
uniform float radius;
9293
uniform float distanceExponent;
9394
uniform float thickness;
95+
uniform float distanceFallOff;
9496
uniform float scale;
9597
#if SCENE_CLIP_BOX == 1
9698
uniform vec3 sceneBoxMin;
@@ -224,15 +226,15 @@ const GTAOShader = {
224226
vec3 viewDelta = sampleSceneViewPos - viewPos;
225227
if (abs(viewDelta.z) < thickness) {
226228
float sampleCosHorizon = dot(viewDir, normalize(viewDelta));
227-
cosHorizons.x = max(cosHorizons.x, sampleCosHorizon);
229+
cosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));
228230
}
229231
230232
sampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);
231233
sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);
232234
viewDelta = sampleSceneViewPos - viewPos;
233235
if (abs(viewDelta.z) < thickness) {
234236
float sampleCosHorizon = dot(viewDir, normalize(viewDelta));
235-
cosHorizons.y = max(cosHorizons.y, sampleCosHorizon);
237+
cosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));
236238
}
237239
}
238240
@@ -353,7 +355,7 @@ function generateMagicSquareNoise( size = 5 ) {
353355
data[ inx * 4 ] = ( randomVec.x * 0.5 + 0.5 ) * 255;
354356
data[ inx * 4 + 1 ] = ( randomVec.y * 0.5 + 0.5 ) * 255;
355357
data[ inx * 4 + 2 ] = 127;
356-
data[ inx * 4 + 3 ] = 0;
358+
data[ inx * 4 + 3 ] = 255;
357359

358360
}
359361

Loading

examples/webgl_postprocessing_gtao.html

+2-4
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,7 @@
137137
thickness: 1.,
138138
scale: 1.,
139139
samples: 16,
140-
distanceFallOff: true,
141-
clipRangeCheck: true,
142-
depthRelativeBias: false,
143-
nvAlignedSamples: false,
140+
distanceFallOff: 1.,
144141
screenSpaceRadius: false,
145142
};
146143
const pdParameters = {
@@ -158,6 +155,7 @@
158155
gui.add( aoParameters, 'radius' ).min( 0.01 ).max( 1 ).step( 0.01 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
159156
gui.add( aoParameters, 'distanceExponent' ).min( 1 ).max( 4 ).step( 0.01 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
160157
gui.add( aoParameters, 'thickness' ).min( 0.01 ).max( 10 ).step( 0.01 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
158+
gui.add( aoParameters, 'distanceFallOff' ).min( 0 ).max( 1 ).step( 0.01 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
161159
gui.add( aoParameters, 'scale' ).min( 0.01 ).max( 2.0 ).step( 0.01 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
162160
gui.add( aoParameters, 'samples' ).min( 2 ).max( 32 ).step( 1 ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );
163161
gui.add( aoParameters, 'screenSpaceRadius' ).onChange( () => gtaoPass.updateGtaoMaterial( aoParameters ) );

0 commit comments

Comments
 (0)