Browse Source

support pre-multipled alpha on materials.

Ben Houston 9 years ago
parent
commit
9236121413

+ 2 - 0
src/materials/Material.js

@@ -40,6 +40,8 @@ THREE.Material = function () {
 
 	this.alphaTest = 0;
 
+	this.premultipliedAlpha = false;
+
 	this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer
 
 	this.visible = true;

+ 6 - 0
src/renderers/shaders/ShaderChunk/premultiply_alpha_fragment.glsl

@@ -0,0 +1,6 @@
+#if PREMULTIPLIED_ALPHA
+
+  // Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
+  gl_FragColor.rgb *= gl_FragColor.a;
+
+#endif

+ 1 - 0
src/renderers/shaders/ShaderLib/linedashed_frag.glsl

@@ -30,5 +30,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

+ 1 - 0
src/renderers/shaders/ShaderLib/meshbasic_frag.glsl

@@ -45,5 +45,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

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

@@ -72,5 +72,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

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

@@ -56,5 +56,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

+ 1 - 0
src/renderers/shaders/ShaderLib/meshstandard_frag.glsl

@@ -68,5 +68,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

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

@@ -23,5 +23,6 @@ void main() {
 	gl_FragColor = linearToOutputTexel( vec4( outgoingLight, diffuseColor.a ) );
 
 	#include <fog_fragment>
+	#include <premultiply_alpha_fragment>
 
 }

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

@@ -491,6 +491,8 @@ THREE.WebGLProgram = ( function () {
 				parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
 				parameters.pointLightShadows > 0 ? '#define POINT_LIGHT_SHADOWS' : '',
 
+				parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : ''
+
 				parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
 				parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',