Просмотр исходного кода

Revert "GTAONode: Fix AO with WebGL backend. (#29588)" (#29590)

This reverts commit 55cf9495d0ff81e53d5792e291bc6de4d8b69839.
Michael Herzog 1 год назад
Родитель
Сommit
322aecea46

+ 13 - 3
examples/jsm/tsl/display/DenoiseNode.js

@@ -1,5 +1,5 @@
 import { Vector2, Vector3 } from 'three';
-import { getViewPosition, convertToTexture, TempNode, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, luminance, vec2, vec3, vec4, uniformArray, int, dot, max, pow, abs, If, textureSize, sin, cos, mat2, PI } from 'three/tsl';
+import { convertToTexture, TempNode, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, luminance, vec2, vec3, vec4, uniformArray, int, dot, max, pow, abs, If, textureSize, sin, cos, mat2, PI } from 'three/tsl';
 
 class DenoiseNode extends TempNode {
 
@@ -49,6 +49,16 @@ class DenoiseNode extends TempNode {
 		const sampleNormal = ( uv ) => this.normalNode.uv( uv );
 		const sampleNoise = ( uv ) => this.noiseNode.uv( uv );
 
+		const getViewPosition = Fn( ( [ screenPosition, depth ] ) => {
+
+			screenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );
+
+			const clipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );
+			const viewSpacePosition = vec4( this.cameraProjectionMatrixInverse.mul( clipSpacePosition ) );
+
+			return viewSpacePosition.xyz.div( viewSpacePosition.w );
+
+		} );
 
 		const denoiseSample = Fn( ( [ center, viewNormal, viewPosition, sampleUv ] ) => {
 
@@ -56,7 +66,7 @@ class DenoiseNode extends TempNode {
 			const depth = sampleDepth( sampleUv );
 			const normal = sampleNormal( sampleUv ).rgb.normalize();
 			const neighborColor = texel.rgb;
-			const viewPos = getViewPosition( sampleUv, depth, this.cameraProjectionMatrixInverse );
+			const viewPos = getViewPosition( sampleUv, depth );
 
 			const normalDiff = dot( viewNormal, normal ).toVar();
 			const normalSimilarity = pow( max( normalDiff, 0 ), this.normalPhi ).toVar();
@@ -85,7 +95,7 @@ class DenoiseNode extends TempNode {
 
 			const center = vec3( texel.rgb );
 
-			const viewPosition = getViewPosition( uvNode, depth, this.cameraProjectionMatrixInverse );
+			const viewPosition = getViewPosition( uvNode, depth );
 
 			const noiseResolution = textureSize( this.noiseNode, 0 );
 			let noiseUv = vec2( uvNode.x, uvNode.y.oneMinus() );

+ 27 - 8
examples/jsm/tsl/display/GTAONode.js

@@ -1,5 +1,5 @@
 import { Color, DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3 } from 'three';
-import { getViewPosition, getSceneUV, QuadMesh, TempNode, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, vec2, vec3, vec4, int, dot, max, pow, abs, If, textureSize, sin, cos, PI, texture, passTexture, mat3, add, normalize, mul, cross, div, mix, sqrt, sub, acos, clamp, NodeMaterial } from 'three/tsl';
+import { QuadMesh, TempNode, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, vec2, vec3, vec4, int, dot, max, pow, abs, If, textureSize, sin, cos, PI, texture, passTexture, mat3, add, normalize, mul, cross, div, mix, sqrt, sub, acos, clamp, NodeMaterial } from 'three/tsl';
 
 const _quadMesh = /*@__PURE__*/ new QuadMesh();
 const _currentClearColor = /*@__PURE__*/ new Color();
@@ -96,13 +96,34 @@ class GTAONode extends TempNode {
 		const sampleDepth = ( uv ) => this.depthNode.uv( uv ).x;
 		const sampleNoise = ( uv ) => this.noiseNode.uv( uv );
 
+		const getSceneUvAndDepth = Fn( ( [ sampleViewPos ] )=> {
+
+			const sampleClipPos = this.cameraProjectionMatrix.mul( vec4( sampleViewPos, 1.0 ) );
+			let sampleUv = sampleClipPos.xy.div( sampleClipPos.w ).mul( 0.5 ).add( 0.5 ).toVar();
+			sampleUv = vec2( sampleUv.x, sampleUv.y.oneMinus() );
+			const sampleSceneDepth = sampleDepth( sampleUv );
+			return vec3( sampleUv, sampleSceneDepth );
+
+		} );
+
+		const getViewPosition = Fn( ( [ screenPosition, depth ] ) => {
+
+			screenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );
+
+			const clipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );
+			const viewSpacePosition = vec4( this.cameraProjectionMatrixInverse.mul( clipSpacePosition ) );
+
+			return viewSpacePosition.xyz.div( viewSpacePosition.w );
+
+		} );
+
 		const ao = Fn( () => {
 
 			const depth = sampleDepth( uvNode );
 
 			depth.greaterThanEqual( 1.0 ).discard();
 
-			const viewPosition = getViewPosition( uvNode, depth, this.cameraProjectionMatrixInverse );
+			const viewPosition = getViewPosition( uvNode, depth );
 			const viewNormal = this.normalNode.rgb.normalize();
 
 			const radiusToUse = this.radius;
@@ -141,9 +162,8 @@ class GTAONode extends TempNode {
 
 					// x
 
-					const sampleSceneUvX = getSceneUV( viewPosition.add( sampleViewOffset ), this.cameraProjectionMatrix ).toVar();
-					const sampleSceneDepthX = sampleDepth( sampleSceneUvX );
-					const sampleSceneViewPositionX = getViewPosition( sampleSceneUvX, sampleSceneDepthX, this.cameraProjectionMatrixInverse );
+					const sampleSceneUvDepthX = getSceneUvAndDepth( viewPosition.add( sampleViewOffset ) );
+					const sampleSceneViewPositionX = getViewPosition( sampleSceneUvDepthX.xy, sampleSceneUvDepthX.z );
 					const viewDeltaX = sampleSceneViewPositionX.sub( viewPosition );
 
 					If( abs( viewDeltaX.z ).lessThan( this.thickness ), () => {
@@ -155,9 +175,8 @@ class GTAONode extends TempNode {
 
 					// y
 
-					const sampleSceneUvY = getSceneUV( viewPosition.sub( sampleViewOffset ), this.cameraProjectionMatrix ).toVar();
-					const sampleSceneDepthY = sampleDepth( sampleSceneUvY );
-					const sampleSceneViewPositionY = getViewPosition( sampleSceneUvY, sampleSceneDepthY, this.cameraProjectionMatrixInverse );
+					const sampleSceneUvDepthY = getSceneUvAndDepth( viewPosition.sub( sampleViewOffset ) );
+					const sampleSceneViewPositionY = getViewPosition( sampleSceneUvDepthY.xy, sampleSceneUvDepthY.z );
 					const viewDeltaY = sampleSceneViewPositionY.sub( viewPosition );
 
 					If( abs( viewDeltaY.z ).lessThan( this.thickness ), () => {

BIN
examples/screenshots/webgpu_postprocessing_ao.jpg


+ 0 - 1
src/nodes/TSL.js

@@ -40,7 +40,6 @@ export * from './utils/Timer.js';
 export * from './utils/TriplanarTexturesNode.js';
 export * from './utils/ReflectorNode.js';
 export * from './utils/RTTNode.js';
-export * from './utils/PostProcessingUtils.js';
 
 // three.js shading language
 export * from './tsl/TSLBase.js';

+ 0 - 38
src/nodes/utils/PostProcessingUtils.js

@@ -1,38 +0,0 @@
-import { Fn, vec2, vec3, vec4 } from '../tsl/TSLBase.js';
-import { WebGPUCoordinateSystem } from '../../constants.js';
-
-export const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionMatrixInverse ], builder ) => {
-
-	let clipSpacePosition;
-
-	if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
-
-		screenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );
-		clipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );
-
-	} else {
-
-		clipSpacePosition = vec4( vec3( screenPosition, depth ).mul( 2.0 ).sub( 1.0 ), 1.0 );
-
-	}
-
-	const viewSpacePosition = vec4( projectionMatrixInverse.mul( clipSpacePosition ) );
-
-	return viewSpacePosition.xyz.div( viewSpacePosition.w );
-
-} );
-
-export const getSceneUV = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ], builder )=> {
-
-	const sampleClipPos = projectionMatrix.mul( vec4( viewPosition, 1.0 ) );
-	let sampleUv = sampleClipPos.xy.div( sampleClipPos.w ).mul( 0.5 ).add( 0.5 ).toVar();
-
-	if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
-
-		sampleUv = vec2( sampleUv.x, sampleUv.y.oneMinus() );
-
-	}
-
-	return vec2( sampleUv );
-
-} );

粤ICP备19079148号