Sfoglia il codice sorgente

Fixed bug in lens flare

Mikael Emtinger 14 anni fa
parent
commit
2c8b6b35fe
2 ha cambiato i file con 126 aggiunte e 12 eliminazioni
  1. 73 9
      src/renderers/WebGLRenderer.js
  2. 53 3
      src/renderers/WebGLShaders.js

+ 73 - 9
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 ) {

+ 53 - 3
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': {