mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-25 21:05:59 +10:00
Fixed bug in lens flare
This commit is contained in:
@@ -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': {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user