|
@@ -7,7 +7,7 @@ THREE.MSAAPass = function ( scene, camera, params, clearColor, clearAlpha ) {
|
|
|
this.scene = scene;
|
|
|
this.camera = camera;
|
|
|
|
|
|
- this.currentSampleLevel = 4;
|
|
|
+ this.sampleLevel = 4;
|
|
|
|
|
|
this.params = params || { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
|
|
|
this.params.minFilter = THREE.NearestFilter;
|
|
@@ -23,14 +23,18 @@ THREE.MSAAPass = function ( scene, camera, params, clearColor, clearAlpha ) {
|
|
|
this.clear = false;
|
|
|
this.needsSwap = true;
|
|
|
|
|
|
- var msaaShader = THREE.MSAA4Shader;
|
|
|
- this.uniforms = THREE.UniformsUtils.clone( msaaShader.uniforms );
|
|
|
+ if ( THREE.CompositeShader === undefined ) {
|
|
|
+ console.error( "THREE.MSAAPass relies on THREE.CompositeShader" );
|
|
|
+ }
|
|
|
|
|
|
- this.materialMSAA = new THREE.ShaderMaterial({
|
|
|
- shaderID: msaaShader.shaderID,
|
|
|
- uniforms: this.uniforms,
|
|
|
- vertexShader: msaaShader.vertexShader,
|
|
|
- fragmentShader: msaaShader.fragmentShader,
|
|
|
+ var compositeShader = THREE.CompositeShader;
|
|
|
+ this.uniforms = THREE.UniformsUtils.clone( compositeShader.uniforms );
|
|
|
+
|
|
|
+ this.materialComposite = new THREE.ShaderMaterial( {
|
|
|
+
|
|
|
+ uniforms: this.uniforms,
|
|
|
+ vertexShader: compositeShader.vertexShader,
|
|
|
+ fragmentShader: compositeShader.fragmentShader,
|
|
|
transparent: true,
|
|
|
blending: THREE.CustomBlending,
|
|
|
blendSrc: THREE.OneFactor,
|
|
@@ -38,133 +42,83 @@ THREE.MSAAPass = function ( scene, camera, params, clearColor, clearAlpha ) {
|
|
|
blendEquation: THREE.AddEquation,
|
|
|
depthTest: false,
|
|
|
depthWrite: false
|
|
|
- });
|
|
|
+
|
|
|
+ } );
|
|
|
|
|
|
this.camera2 = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );
|
|
|
this.scene2 = new THREE.Scene();
|
|
|
-
|
|
|
- this.quad2 = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null );
|
|
|
+ this.quad2 = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), this.materialComposite );
|
|
|
this.scene2.add( this.quad2 );
|
|
|
|
|
|
- this.devicePixelRatio = 1;
|
|
|
-
|
|
|
};
|
|
|
|
|
|
THREE.MSAAPass.prototype = {
|
|
|
|
|
|
dispose: function() {
|
|
|
|
|
|
- if( this.renderTargets ) {
|
|
|
- for( var i = 0; i < this.renderTargets.length; i ++ ) {
|
|
|
- this.renderTargets[i].dispose();
|
|
|
- }
|
|
|
- this.renderTargets = null;
|
|
|
- }
|
|
|
-
|
|
|
- },
|
|
|
+ if( this.sampleRenderTarget ) {
|
|
|
|
|
|
- render: function ( renderer, writeBuffer, readBuffer, delta ) {
|
|
|
+ this.sampleRenderTarget.dispose();
|
|
|
+ this.sampleRenderTarget = null;
|
|
|
|
|
|
- if( ! this.renderTargets ) {
|
|
|
- this.renderTargets = [];
|
|
|
- for( var i = 0; i < 2; i ++ ) {
|
|
|
- this.renderTargets.push( new THREE.WebGLRenderTarget( readBuffer.width, readBuffer.height, this.params, "msaa.renderTarget" + i ) );
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- var camera = ( this.camera || this.scene.camera );
|
|
|
-
|
|
|
- var currentSampleOffsets = THREE.MSAAPass.JitterVectors[ Math.max( 0, Math.min( this.currentSampleLevel, 5 ) ) ];
|
|
|
-
|
|
|
- if( ! currentSampleOffsets ) {
|
|
|
+ },
|
|
|
|
|
|
- renderer.render( this.scene, camera, this.renderTargets[0], true );
|
|
|
+ render: function ( renderer, writeBuffer, readBuffer, delta ) {
|
|
|
|
|
|
- this.uniforms[ "tBackground" ].value = readBuffer;
|
|
|
- this.uniforms[ "scale" ].value = 1.0;
|
|
|
- for( var k = 0; k < this.renderTargets.length; k ++ ) {
|
|
|
- this.uniforms[ "tSample" + k ].value = this.renderTargets[0];
|
|
|
- }
|
|
|
- this.quad2.material = this.materialMSAA;
|
|
|
+ if( ! this.sampleRenderTarget ) {
|
|
|
|
|
|
- renderer.render( this.scene2, this.camera2, writeBuffer, true );
|
|
|
+ this.sampleRenderTarget = new THREE.WebGLRenderTarget( readBuffer.width, readBuffer.height, this.params, "msaa.renderTarget0" );
|
|
|
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
- this.scene.overrideMaterial = null;
|
|
|
-
|
|
|
- this.oldClearColor.copy( renderer.getClearColor() );
|
|
|
- this.oldClearAlpha = renderer.getClearAlpha();
|
|
|
-
|
|
|
- renderer.setClearColor( new THREE.Color( 0, 0, 0 ), 0 );
|
|
|
-
|
|
|
- for( var j = 0; j < currentSampleOffsets.length; j += this.renderTargets.length ) {
|
|
|
-
|
|
|
- this.uniforms[ "tBackground" ].value = readBuffer;
|
|
|
- this.uniforms[ "scale" ].value = 1.0 / currentSampleOffsets.length;
|
|
|
- for( var k = 0; k < this.renderTargets.length; k ++ ) {
|
|
|
- this.uniforms[ "tSample" + k ].value = this.renderTargets[k];
|
|
|
- }
|
|
|
- this.quad2.material = this.materialMSAA;
|
|
|
-
|
|
|
- for( var k = 0; k < Math.min( currentSampleOffsets.length - j, this.renderTargets.length ); k ++ ) {
|
|
|
- var i = j + k;
|
|
|
+ var camera = ( this.camera || this.scene.camera );
|
|
|
|
|
|
- if( camera.setViewOffset ) {
|
|
|
+ var jitterOffsets = THREE.MSAAPass.JitterVectors[ Math.max( 0, Math.min( this.sampleLevel, 5 ) ) ];
|
|
|
|
|
|
- camera.setViewOffset( readBuffer.width, readBuffer.height, currentSampleOffsets[i].x, currentSampleOffsets[i].y, readBuffer.width, readBuffer.height );
|
|
|
+ this.uniforms[ "tForeground" ].value = this.sampleRenderTarget;
|
|
|
+ this.uniforms[ "scale" ].value = 1.0 / jitterOffsets.length;
|
|
|
|
|
|
- }
|
|
|
+ for( var i = 0; i < jitterOffsets.length; i ++ ) {
|
|
|
|
|
|
- renderer.render( this.scene, camera, this.renderTargets[k], true );
|
|
|
+ if( camera.setViewOffset ) camera.setViewOffset( readBuffer.width, readBuffer.height, jitterOffsets[i].x, jitterOffsets[i].y, readBuffer.width, readBuffer.height );
|
|
|
|
|
|
- }
|
|
|
+ renderer.render( this.scene, camera, this.sampleRenderTarget, true );
|
|
|
|
|
|
- renderer.render( this.scene2, this.camera2, writeBuffer, j === 0 );
|
|
|
+ renderer.render( this.scene2, this.camera2, writeBuffer, i === 0 );
|
|
|
|
|
|
}
|
|
|
|
|
|
- camera.fullWidth = undefined;
|
|
|
- camera.fullHeight = undefined;
|
|
|
- camera.x = undefined;
|
|
|
- camera.y = undefined;
|
|
|
- camera.width = undefined;
|
|
|
- camera.height = undefined;
|
|
|
- camera.updateProjectionMatrix();
|
|
|
-
|
|
|
- renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
|
|
|
+ if( camera.setViewOffset ) camera.setViewOffset( undefined, undefined, undefined, undefined, undefined, undefined );
|
|
|
|
|
|
}
|
|
|
-};
|
|
|
|
|
|
-THREE.MSAAPass.normalizedJitterVectors = function() {
|
|
|
- var xfrm = new THREE.Matrix4().makeScale( 1 / 16.0, 1/ 16.0, 0 );
|
|
|
+};
|
|
|
|
|
|
- return function( jitterVectors ) {
|
|
|
- var vectors2 = [];
|
|
|
- for( var i = 0; i < jitterVectors.length; i ++ ) {
|
|
|
- vectors2.push( new THREE.Vector3( jitterVectors[i][0], jitterVectors[i][0] ).applyMatrix4( xfrm ) );
|
|
|
- }
|
|
|
- return vectors2;
|
|
|
+THREE.MSAAPass.normalizedJitterOffsets = function( jitterVectors ) {
|
|
|
+ var vectors2 = [];
|
|
|
+ for( var i = 0; i < jitterVectors.length; i ++ ) {
|
|
|
+ vectors2.push( new THREE.Vector2( jitterVectors[i][0], jitterVectors[i][1] ).multiplyScalar( 1.0 / 16.0 ) );
|
|
|
}
|
|
|
-}(),
|
|
|
+ return vectors2;
|
|
|
+},
|
|
|
|
|
|
THREE.MSAAPass.JitterVectors = [
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ 0, 0 ]
|
|
|
] ),
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ 4, 4 ],
|
|
|
[ -4, -4 ]
|
|
|
] ),
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ -2, -6 ],
|
|
|
[ 6, -2 ],
|
|
|
[ -6, 2 ],
|
|
|
[ 2, 6 ]
|
|
|
] ),
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ 1, -3 ],
|
|
|
[ -1, 3 ],
|
|
|
[ 5, 1 ],
|
|
@@ -174,7 +128,7 @@ THREE.MSAAPass.JitterVectors = [
|
|
|
[ 3, 7 ],
|
|
|
[ 7, -7 ]
|
|
|
] ),
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ 1, 1 ],
|
|
|
[ -1, -3 ],
|
|
|
[ -3, 2 ],
|
|
@@ -195,7 +149,7 @@ THREE.MSAAPass.JitterVectors = [
|
|
|
[ 6, 7 ],
|
|
|
[ -7, -8 ]
|
|
|
] ),
|
|
|
- THREE.MSAAPass.normalizedJitterVectors( [
|
|
|
+ THREE.MSAAPass.normalizedJitterOffsets( [
|
|
|
[ -4, -7 ],
|
|
|
[ -7, -5 ],
|
|
|
[ -3, -5 ],
|