Browse Source

WebGLRenderer: Ignore map alpha in opaque materials.

Mr.doob 5 years ago
parent
commit
84c16ed8e1

+ 2 - 0
src/renderers/shaders/ShaderChunk.js

@@ -84,6 +84,7 @@ import skinning_vertex from './ShaderChunk/skinning_vertex.glsl.js';
 import skinnormal_vertex from './ShaderChunk/skinnormal_vertex.glsl.js';
 import specularmap_fragment from './ShaderChunk/specularmap_fragment.glsl.js';
 import specularmap_pars_fragment from './ShaderChunk/specularmap_pars_fragment.glsl.js';
+import transparent_fragment from './ShaderChunk/transparent_fragment.glsl.js';
 import tonemapping_fragment from './ShaderChunk/tonemapping_fragment.glsl.js';
 import tonemapping_pars_fragment from './ShaderChunk/tonemapping_pars_fragment.glsl.js';
 import uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl.js';
@@ -214,6 +215,7 @@ export var ShaderChunk = {
 	skinnormal_vertex: skinnormal_vertex,
 	specularmap_fragment: specularmap_fragment,
 	specularmap_pars_fragment: specularmap_pars_fragment,
+	transparent_fragment: transparent_fragment,
 	tonemapping_fragment: tonemapping_fragment,
 	tonemapping_pars_fragment: tonemapping_pars_fragment,
 	uv_pars_fragment: uv_pars_fragment,

+ 0 - 1
src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js

@@ -2,7 +2,6 @@ export default /* glsl */`
 #ifdef ALPHATEST
 
 	if ( diffuseColor.a < ALPHATEST ) discard;
-	diffuseColor.a = 1.0;
 
 #endif
 `;

+ 7 - 0
src/renderers/shaders/ShaderChunk/transparent_fragment.glsl.js

@@ -0,0 +1,7 @@
+export default /* glsl */`
+#ifndef TRANSPARENT
+
+	diffuseColor.a = 1.0;
+
+#endif
+`;

+ 2 - 1
src/renderers/shaders/ShaderLib/meshbasic_frag.glsl.js

@@ -35,13 +35,14 @@ void main() {
 	#include <color_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <specularmap_fragment>
 
 	ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
 
 	// accumulation (baked indirect lighting only)
 	#ifdef USE_LIGHTMAP
-	
+
 		vec4 lightMapTexel= texture2D( lightMap, vUv2 );
 		reflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;
 

+ 1 - 0
src/renderers/shaders/ShaderLib/meshlambert_frag.glsl.js

@@ -48,6 +48,7 @@ void main() {
 	#include <color_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <specularmap_fragment>
 	#include <emissivemap_fragment>
 

+ 1 - 0
src/renderers/shaders/ShaderLib/meshmatcap_frag.glsl.js

@@ -34,6 +34,7 @@ void main() {
 	#include <map_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <normal_fragment_begin>
 	#include <normal_fragment_maps>
 

+ 1 - 0
src/renderers/shaders/ShaderLib/meshphong_frag.glsl.js

@@ -45,6 +45,7 @@ void main() {
 	#include <color_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <specularmap_fragment>
 	#include <normal_fragment_begin>
 	#include <normal_fragment_maps>

+ 1 - 0
src/renderers/shaders/ShaderLib/meshphysical_frag.glsl.js

@@ -85,6 +85,7 @@ void main() {
 	#include <color_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <roughnessmap_fragment>
 	#include <metalnessmap_fragment>
 	#include <normal_fragment_begin>

+ 1 - 0
src/renderers/shaders/ShaderLib/meshtoon_frag.glsl.js

@@ -43,6 +43,7 @@ void main() {
 	#include <color_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 	#include <specularmap_fragment>
 	#include <normal_fragment_begin>
 	#include <normal_fragment_maps>

+ 1 - 0
src/renderers/shaders/ShaderLib/points_frag.glsl.js

@@ -20,6 +20,7 @@ void main() {
 	#include <map_particle_fragment>
 	#include <color_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 
 	outgoingLight = diffuseColor.rgb;
 

+ 1 - 0
src/renderers/shaders/ShaderLib/sprite_frag.glsl.js

@@ -21,6 +21,7 @@ void main() {
 	#include <map_fragment>
 	#include <alphamap_fragment>
 	#include <alphatest_fragment>
+	#include <transparent_fragment>
 
 	outgoingLight = diffuseColor.rgb;
 

+ 1 - 0
src/renderers/webgl/WebGLProgram.js

@@ -625,6 +625,7 @@ function WebGLProgram( renderer, cacheKey, parameters ) {
 			( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',
 
 			parameters.dithering ? '#define DITHERING' : '',
+			parameters.transparent ? '#define TRANSPARENT' : '',
 
 			( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding || parameters.lightMapEncoding ) ?
 				ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below

+ 2 - 1
src/renderers/webgl/WebGLPrograms.js

@@ -49,7 +49,7 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 		"numDirLightShadows", "numPointLightShadows", "numSpotLightShadows",
 		"shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights',
 		"alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering",
-		"sheen"
+		"sheen", "transparent"
 	];
 
 	function getShaderObject( material, shaderID ) {
@@ -262,6 +262,7 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 			numClipIntersection: nClipIntersection,
 
 			dithering: material.dithering,
+			transparent: material.transparent,
 
 			shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,
 			shadowMapType: renderer.shadowMap.type,