Browse Source

SSRPassCorrectReflectorDepth2Pr (#21537)

Vis 4 years ago
parent
commit
1c5ca1d646

+ 8 - 14
examples/jsm/objects/ReflectorForSSRPass.js

@@ -44,7 +44,6 @@ var ReflectorForSSRPass = function ( geometry, options ) {
 	scope.maxDistance = ReflectorForSSRPass.ReflectorShader.uniforms.maxDistance.value;
 	scope.opacity = ReflectorForSSRPass.ReflectorShader.uniforms.opacity.value;
 	scope.color = color;
-	scope.worldYBias = options.worldYBias || 0;
 	scope.resolution = options.resolution || new Vector2( window.innerWidth, window.innerHeight );
 
 
@@ -139,7 +138,6 @@ var ReflectorForSSRPass = function ( geometry, options ) {
 		material.uniforms[ 'maxDistance' ].value = scope.maxDistance;
 		material.uniforms[ 'color' ].value = scope.color;
 		material.uniforms[ 'opacity' ].value = scope.opacity;
-		material.uniforms[ 'worldYBias' ].value = scope.worldYBias;
 
 		vecTemp0.copy( camera.position ).normalize();
 		vecTemp1.copy( vecTemp0 ).reflect( yAxis );
@@ -183,11 +181,11 @@ var ReflectorForSSRPass = function ( geometry, options ) {
 		virtualCamera.updateMatrixWorld();
 		virtualCamera.projectionMatrix.copy( camera.projectionMatrix );
 
-		material.uniforms[ 'virtualCameraNear' ].value = virtualCamera.near;
-		material.uniforms[ 'virtualCameraFar' ].value = virtualCamera.far;
-		material.uniforms[ 'virtualCameraMatrixWorld' ].value= virtualCamera.matrixWorld;
-		material.uniforms[ 'virtualCameraProjectionMatrix' ].value= virtualCamera.projectionMatrix;
-		material.uniforms[ 'virtualCameraInverseProjectionMatrix' ].value= virtualCamera.projectionMatrixInverse;
+		material.uniforms[ 'virtualCameraNear' ].value = camera.near;
+		material.uniforms[ 'virtualCameraFar' ].value = camera.far;
+		material.uniforms[ 'virtualCameraMatrixWorld' ].value = virtualCamera.matrixWorld;
+		material.uniforms[ 'virtualCameraProjectionMatrix' ].value = camera.projectionMatrix;
+		material.uniforms[ 'virtualCameraProjectionMatrixInverse' ].value = camera.projectionMatrixInverse;
 		material.uniforms[ 'resolution' ].value = scope.resolution;
 
 		// Update the texture matrix
@@ -295,12 +293,11 @@ ReflectorForSSRPass.ReflectorShader = {
 		maxDistance: { value: 180 },
 		opacity: { value: 0.5 },
 		fresnelCoe: { value: null },
-		worldYBias: { value: null },
 		virtualCameraNear: { value: null },
 		virtualCameraFar: { value: null },
 		virtualCameraProjectionMatrix: { value: new Matrix4() },
 		virtualCameraMatrixWorld: { value: new Matrix4() },
-		virtualCameraInverseProjectionMatrix: { value: new Matrix4() },
+		virtualCameraProjectionMatrixInverse: { value: new Matrix4() },
 		resolution: { value: new Vector2() },
 
 	},
@@ -325,11 +322,10 @@ ReflectorForSSRPass.ReflectorShader = {
 		uniform float maxDistance;
 		uniform float opacity;
 		uniform float fresnelCoe;
-		uniform float worldYBias;
 		uniform float virtualCameraNear;
 		uniform float virtualCameraFar;
 		uniform mat4 virtualCameraProjectionMatrix;
-		uniform mat4 virtualCameraInverseProjectionMatrix;
+		uniform mat4 virtualCameraProjectionMatrixInverse;
 		uniform mat4 virtualCameraMatrixWorld;
 		uniform vec2 resolution;
 		varying vec4 vUv;
@@ -349,7 +345,7 @@ ReflectorForSSRPass.ReflectorShader = {
 		vec3 getViewPosition( const in vec2 uv, const in float depth/*clip space*/, const in float clipW ) {
 			vec4 clipPosition = vec4( ( vec3( uv, depth ) - 0.5 ) * 2.0, 1.0 );//ndc
 			clipPosition *= clipW; //clip
-			return ( virtualCameraInverseProjectionMatrix * clipPosition ).xyz;//view
+			return ( virtualCameraProjectionMatrixInverse * clipPosition ).xyz;//view
 		}
 		void main() {
 			vec4 base = texture2DProj( tDiffuse, vUv );
@@ -361,8 +357,6 @@ ReflectorForSSRPass.ReflectorShader = {
 				float clipW = virtualCameraProjectionMatrix[2][3] * viewZ+virtualCameraProjectionMatrix[3][3];
 				vec3 viewPosition=getViewPosition( uv, depth, clipW );
 				vec3 worldPosition=(virtualCameraMatrixWorld*vec4(viewPosition,1)).xyz;
-				worldPosition.y+=worldYBias; // TODO: Don't know why not start from zero, temporarily use manually defined bias, need fix afterwards.
-				worldPosition.y=max(0.,worldPosition.y);
 				if(worldPosition.y>maxDistance) discard;
 				float op=opacity;
 				#ifdef DISTANCE_ATTENUATION

+ 0 - 1
examples/webgl_postprocessing_ssr.html

@@ -131,7 +131,6 @@
 			geometry = new THREE.PlaneBufferGeometry( 1, 1 );
 			groundReflector = new ReflectorForSSRPass( geometry, {
 				clipBias: 0,
-				worldYBias: - 0.027450980392156862,
 				textureWidth: window.innerWidth,
 				textureHeight: window.innerHeight,
 				color: 0x888888,