提交 2c8b6b35 编写于 作者: M Mikael Emtinger

Fixed bug in lens flare

上级 f70aaed1
......@@ -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 ) {
......
......@@ -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': {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册