diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 8d99b9713ad651398ad42fad0c82bd650bfcb59d..6e4c2bf7dcc4a1d8bee36e70ba5d99497ec96533 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -142,7 +142,6 @@ THREE.WebGLRenderer = function ( parameters ) { _lensFlare.vertices = new Float32Array( 8 + 8 ); _lensFlare.faces = new Uint16Array( 6 ); - _lensFlare.transparency = 0.5; i = 0; _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = -1; // vertex @@ -204,8 +203,6 @@ THREE.WebGLRenderer = function ( parameters ) { } - - _lensFlare.attributes = {}; _lensFlare.uniforms = {}; _lensFlare.attributes.vertex = _gl.getAttribLocation ( _lensFlare.program, "position" ); @@ -219,6 +216,57 @@ THREE.WebGLRenderer = function ( parameters ) { _lensFlare.uniforms.screenPosition = _gl.getUniformLocation( _lensFlare.program, "screenPosition" ); + // prepare sprites + + _sprite = {}; + + _sprite.vertices = new Float32Array( 8 + 8 ); + _sprite.faces = new Uint16Array( 6 ); + + i = 0; + _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = -1; // vertex + _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 0; // uv... etc. + _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = -1; + _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 0; + _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1; + _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1; + _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = 1; + _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 1; + + i = 0; + _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 1; _sprite.faces[ i++ ] = 2; + _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 2; _sprite.faces[ i++ ] = 3; + + _sprite.vertexBuffer = _gl.createBuffer(); + _sprite.elementBuffer = _gl.createBuffer(); + + _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); + _gl.bufferData( _gl.ARRAY_BUFFER, _sprite.vertices, _gl.STATIC_DRAW ); + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer ); + _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _sprite.faces, _gl.STATIC_DRAW ); + + + _sprite.program = _gl.createProgram(); + _gl.attachShader( _sprite.program, getShader( "fragment", THREE.ShaderLib.sprite.fragmentShader )); + _gl.attachShader( _sprite.program, getShader( "vertex", THREE.ShaderLib.sprite.vertexShader )); + _gl.linkProgram( _sprite.program ); + + _sprite.attributes = {}; + _sprite.uniforms = {}; + _sprite.attributes.vertex = _gl.getAttribLocation ( _sprite.program, "position" ); + _sprite.attributes.uv = _gl.getAttribLocation ( _sprite.program, "UV" ); + _sprite.uniforms.map = _gl.getUniformLocation( _sprite.program, "map" ); + _sprite.uniforms.opacity = _gl.getUniformLocation( _sprite.program, "opacity" ); + _sprite.uniforms.scale = _gl.getUniformLocation( _sprite.program, "scale" ); + _sprite.uniforms.rotation = _gl.getUniformLocation( _sprite.program, "rotation" ); + _sprite.uniforms.screenPosition = _gl.getUniformLocation( _sprite.program, "screenPosition" ); + + + + + + this.setSize = function ( width, height ) { _canvas.width = width; @@ -3078,6 +3126,14 @@ THREE.WebGLRenderer = function ( parameters ) { } + // render 2d + + if ( scene.__webglSprites.length ) { + + renderSprites( scene ); + + } + // render stencil shadows if ( stencil && scene.__webglShadowVolumes.length && scene.lights.length ) { @@ -3301,7 +3357,6 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); _gl.activeTexture( _gl.TEXTURE1 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); for ( o = 0; o < ol; o ++ ) { @@ -3326,20 +3381,20 @@ THREE.WebGLRenderer = function ( parameters ) { screenPositionPixels[ 1 ] = screenPosition[ 1 ] * halfViewportHeight + halfViewportHeight; - // screen cull or go on if vertex texture + // screen cull - if( _lensFlare.hasVertexTexture || - ( screenPositionPixels[ 0 ] > 0 && + if( screenPositionPixels[ 0 ] > 0 && screenPositionPixels[ 0 ] < _viewportWidth && screenPositionPixels[ 1 ] > 0 && - screenPositionPixels[ 1 ] < _viewportHeight )) { + screenPositionPixels[ 1 ] < _viewportHeight ) { // save current RGB to temp texture _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); _gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); - + _gl.finish(); + // render pink quad @@ -3351,12 +3406,14 @@ THREE.WebGLRenderer = function ( parameters ) { _gl.enable( _gl.DEPTH_TEST ); _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); + _gl.finish(); // copy result to occlusionMap _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); _gl.copyTexSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, screenPositionPixels[ 0 ] - 8, screenPositionPixels[ 1 ] - 8, 16, 16 ); + _gl.finish(); // restore graphics @@ -3447,6 +3504,7 @@ THREE.WebGLRenderer = function ( parameters ) { scene.__webglObjectsImmediate = []; scene.__webglShadowVolumes = []; scene.__webglLensFlares = []; + scene.__webglSprites = []; } while ( scene.__objectsAdded.length ) { @@ -3483,6 +3541,12 @@ THREE.WebGLRenderer = function ( parameters ) { } + for ( var o = 0, ol = scene.__webglSprites.length; o < ol; o ++ ) { + + updateObject( scene.__webglSprites[ o ].object, scene ); + + } + }; function addObject( object, scene ) { diff --git a/src/renderers/WebGLShaders.js b/src/renderers/WebGLShaders.js index 3a5b08f90d8bcbd01b19cf306332f17fd4091608..3372794299c6a56b74f69f98f2d2d8e74c959176 100644 --- a/src/renderers/WebGLShaders.js +++ b/src/renderers/WebGLShaders.js @@ -602,11 +602,13 @@ THREE.ShaderLib = { "texture2D( occlusionMap, vec2( 0.1, 0.9 )) +", "texture2D( occlusionMap, vec2( 0.1, 0.5 )) +", "texture2D( occlusionMap, vec2( 0.5, 0.5 ));", - +/* "vVisibility = ( visibility.r / 9.0 ) *", "( 1.0 - visibility.g / 9.0 ) *", "( visibility.b / 9.0 ) *", "( 1.0 - visibility.a / 9.0 );", +*/ + "vVisibility = ( 1.0 - visibility.a / 9.0 );", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", @@ -636,7 +638,7 @@ THREE.ShaderLib = { "if( renderType == 0 ) {", - "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", // restore @@ -708,7 +710,7 @@ THREE.ShaderLib = { "if( renderType == 0 ) {", - "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", // restore @@ -736,6 +738,54 @@ THREE.ShaderLib = { }, + 'sprite': { + + vertexShader: [ + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "attribute vec2 position;", + "attribute vec2 UV;", + + "varying vec2 vUV;", + + "void main(void)", + "{", + "vUV = UV;", + + "vec2 pos;", + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "gl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "#ifdef GL_ES", + "precision highp float;", + "#endif", + + "uniform sampler2D map;", + "uniform float opacity;", + + "varying vec2 vUV;", + + "void main( void )", + "{", + "vec4 color = texture2D( map, vUV );", + "color.a *= opacity;", + "gl_FragColor = color;", + "}" + ].join( "\n" ) + + }, + + 'shadowPost': {