Pārlūkot izejas kodu

WebGLDeferredRenderer: less buggy transparent materials skipping.

Because of deferred materials sharing and MeshFaceMaterials previous solution was causing disappearances of random parts.

There are still some disappearance glitches though if the scene includes some BufferGeometry objects. This was happening also before hiding transparent parts, so seems unrelated, more likely some bug in GL state handling for BufferGeometry rendering.
alteredq 12 gadi atpakaļ
vecāks
revīzija
e53d1bb2c7
1 mainītis faili ar 35 papildinājumiem un 8 dzēšanām
  1. 35 8
      examples/js/renderers/WebGLDeferredRenderer.js

+ 35 - 8
examples/js/renderers/WebGLDeferredRenderer.js

@@ -67,6 +67,10 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 	//
 	//
 
 
+	var invisibleMaterial = new THREE.ShaderMaterial();
+	invisibleMaterial.visible = false;
+
+
 	var defaultNormalDepthMaterial = new THREE.ShaderMaterial( {
 	var defaultNormalDepthMaterial = new THREE.ShaderMaterial( {
 
 
 		uniforms:       THREE.UniformsUtils.clone( normalDepthShader.uniforms ),
 		uniforms:       THREE.UniformsUtils.clone( normalDepthShader.uniforms ),
@@ -94,8 +98,17 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 				var deferredMaterials = createDeferredMaterials( materials[ i ] );
 				var deferredMaterials = createDeferredMaterials( materials[ i ] );
 
 
-				colorMaterials.push( deferredMaterials.colorMaterial );
-				normalDepthMaterials.push( deferredMaterials.normalDepthMaterial );
+				if ( deferredMaterials.transparent ) {
+
+					colorMaterials.push( invisibleMaterial );
+					normalDepthMaterials.push( invisibleMaterial );
+
+				} else {
+
+					colorMaterials.push( deferredMaterials.colorMaterial );
+					normalDepthMaterials.push( deferredMaterials.normalDepthMaterial );
+
+				}
 
 
 			}
 			}
 
 
@@ -108,6 +121,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 			object.properties.colorMaterial = deferredMaterials.colorMaterial;
 			object.properties.colorMaterial = deferredMaterials.colorMaterial;
 			object.properties.normalDepthMaterial = deferredMaterials.normalDepthMaterial;
 			object.properties.normalDepthMaterial = deferredMaterials.normalDepthMaterial;
+			object.properties.transparent = deferredMaterials.transparent;
 
 
 		}
 		}
 
 
@@ -174,7 +188,6 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 		material.alphaTest = originalMaterial.alphaTest;
 		material.alphaTest = originalMaterial.alphaTest;
 		material.wireframe = originalMaterial.wireframe;
 		material.wireframe = originalMaterial.wireframe;
-		material.transparent = originalMaterial.transparent;
 
 
 		// uv repeat and offset setting priorities
 		// uv repeat and offset setting priorities
 		//	1. color map
 		//	1. color map
@@ -272,7 +285,7 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 		}
 		}
 
 
-		deferredMaterials.normalDepthMaterial.transparent = originalMaterial.transparent;
+		deferredMaterials.transparent = originalMaterial.transparent;
 
 
 		return deferredMaterials;
 		return deferredMaterials;
 
 
@@ -471,8 +484,15 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 		if ( object.material ) {
 		if ( object.material ) {
 
 
-			object.material = object.properties.colorMaterial;
-			if ( object.material.transparent ) object.visible = false;
+			if ( object.properties.transparent ) {
+
+				object.material = invisibleMaterial;
+
+			} else {
+
+				object.material = object.properties.colorMaterial;
+
+			}
 
 
 		}
 		}
 
 
@@ -482,8 +502,15 @@ THREE.WebGLDeferredRenderer = function ( parameters ) {
 
 
 		if ( object.material ) {
 		if ( object.material ) {
 
 
-			object.material = object.properties.normalDepthMaterial;
-			if ( object.material.transparent ) object.visible = false;
+			if ( object.properties.transparent ) {
+
+				object.material = invisibleMaterial;
+
+			} else {
+
+				object.material = object.properties.normalDepthMaterial;
+
+			}
 
 
 		}
 		}