Răsfoiți Sursa

transparent texture blending support

Mu Daosheng 11 ani în urmă
părinte
comite
5bd0cf8fa9
1 a modificat fișierele cu 20 adăugiri și 4 ștergeri
  1. 20 4
      examples/js/renderers/SoftwareRenderer.js

+ 20 - 4
examples/js/renderers/SoftwareRenderer.js

@@ -2,6 +2,7 @@
  * @author mrdoob / http://mrdoob.com/
  * @author ryg / http://farbrausch.de/~fg
  * @author mraleph / http://mrale.ph/
+ * @author daoshengmu / http://dsmu.me/
  */
 
 THREE.SoftwareRenderer = function ( parameters ) {
@@ -248,13 +249,28 @@ THREE.SoftwareRenderer = function ( parameters ) {
                      
                     string = [
                             'var tdim = material.texture.width;',
+                            'var isTransparent = material.transparent',
                             'var tbound = tdim - 1;',
                             'var tdata = material.texture.data;',
                             'var texel = tdata[((v * tdim) & tbound) * tdim + ((u * tdim) & tbound)];',
-                            'buffer[ offset ] = (texel & 0xff0000) >> 16;',
-                            'buffer[ offset + 1 ] = (texel & 0xff00) >> 8;',
-                            'buffer[ offset + 2 ] = (texel & 0xff);',
-                            'buffer[ offset + 3 ] = material.opacity * 255;',
+                            'if ( !isTransparent ) {',
+                            '  buffer[ offset ] = (texel & 0xff0000) >> 16;',
+                            '  buffer[ offset + 1 ] = (texel & 0xff00) >> 8;',
+                            '  buffer[ offset + 2 ] = (texel & 0xff);',
+                            '  buffer[ offset + 3 ] = material.opacity * 255;',
+                            '} else { ',
+                            '  var opaci = ((texel >> 24) & 0xff) * material.opacity;',
+                            '  if(opaci > 250) { ',
+                            '    zbuf[pix] = z; ',
+							'  } else {',
+                            '    var backColor = buffer[ offset ] << 24 + buffer[ offset + 1 ] << 16 + buffer[ offset + 2 ] << 8 ',
+                            '    texel = texel * opaci + backcolor * (1-opaci); ',                            
+                            '  }',
+                            '  buffer[ offset ] = (texel & 0xff0000) >> 16;',
+                            '  buffer[ offset + 1 ] = (texel & 0xff00) >> 8;',
+                            '  buffer[ offset + 2 ] = (texel & 0xff);',
+                            '  buffer[ offset + 3 ] = material.opacity * 255;',
+                            '}'
                         ].join('\n');
                     
                 } else {