Spaces:
Running
Running
File size: 3,858 Bytes
6cd9596 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
/**
*
* Temporal Anti-Aliasing Render Pass
*
* @author bhouston / http://clara.io/
*
* When there is no motion in the scene, the TAA render pass accumulates jittered camera samples across frames to create a high quality anti-aliased result.
*
* References:
*
* TODO: Add support for motion vector pas so that accumulation of samples across frames can occur on dynamics scenes.
*
*/
THREE.TAARenderPass = function ( scene, camera, params ) {
if ( THREE.SSAARenderPass === undefined ) {
console.error( "THREE.TAARenderPass relies on THREE.SSAARenderPass" );
}
THREE.SSAARenderPass.call( this, scene, camera, params );
this.sampleLevel = 0;
this.accumulate = false;
};
THREE.TAARenderPass.JitterVectors = THREE.SSAARenderPass.JitterVectors;
THREE.TAARenderPass.prototype = Object.assign( Object.create( THREE.SSAARenderPass.prototype ), {
constructor: THREE.TAARenderPass,
render: function ( renderer, writeBuffer, readBuffer, deltaTime ) {
if ( ! this.accumulate ) {
THREE.SSAARenderPass.prototype.render.call( this, renderer, writeBuffer, readBuffer, deltaTime );
this.accumulateIndex = - 1;
return;
}
var jitterOffsets = THREE.TAARenderPass.JitterVectors[ 5 ];
if ( ! this.sampleRenderTarget ) {
this.sampleRenderTarget = new THREE.WebGLRenderTarget( readBuffer.width, readBuffer.height, this.params );
this.sampleRenderTarget.texture.name = "TAARenderPass.sample";
}
if ( ! this.holdRenderTarget ) {
this.holdRenderTarget = new THREE.WebGLRenderTarget( readBuffer.width, readBuffer.height, this.params );
this.holdRenderTarget.texture.name = "TAARenderPass.hold";
}
if ( this.accumulate && this.accumulateIndex === - 1 ) {
THREE.SSAARenderPass.prototype.render.call( this, renderer, this.holdRenderTarget, readBuffer, deltaTime );
this.accumulateIndex = 0;
}
var autoClear = renderer.autoClear;
renderer.autoClear = false;
var sampleWeight = 1.0 / ( jitterOffsets.length );
if ( this.accumulateIndex >= 0 && this.accumulateIndex < jitterOffsets.length ) {
this.copyUniforms[ "opacity" ].value = sampleWeight;
this.copyUniforms[ "tDiffuse" ].value = writeBuffer.texture;
// render the scene multiple times, each slightly jitter offset from the last and accumulate the results.
var numSamplesPerFrame = Math.pow( 2, this.sampleLevel );
for ( var i = 0; i < numSamplesPerFrame; i ++ ) {
var j = this.accumulateIndex;
var jitterOffset = jitterOffsets[ j ];
if ( this.camera.setViewOffset ) {
this.camera.setViewOffset( readBuffer.width, readBuffer.height,
jitterOffset[ 0 ] * 0.0625, jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16
readBuffer.width, readBuffer.height );
}
renderer.setRenderTarget( writeBuffer );
renderer.clear();
renderer.render( this.scene, this.camera );
renderer.setRenderTarget( this.sampleRenderTarget );
if ( this.accumulateIndex === 0 ) renderer.clear();
this.fsQuad.render( renderer );
this.accumulateIndex ++;
if ( this.accumulateIndex >= jitterOffsets.length ) break;
}
if ( this.camera.clearViewOffset ) this.camera.clearViewOffset();
}
var accumulationWeight = this.accumulateIndex * sampleWeight;
if ( accumulationWeight > 0 ) {
this.copyUniforms[ "opacity" ].value = 1.0;
this.copyUniforms[ "tDiffuse" ].value = this.sampleRenderTarget.texture;
renderer.setRenderTarget( writeBuffer );
renderer.clear();
this.fsQuad.render( renderer );
}
if ( accumulationWeight < 1.0 ) {
this.copyUniforms[ "opacity" ].value = 1.0 - accumulationWeight;
this.copyUniforms[ "tDiffuse" ].value = this.holdRenderTarget.texture;
renderer.setRenderTarget( writeBuffer );
if ( accumulationWeight === 0 ) renderer.clear();
this.fsQuad.render( renderer );
}
renderer.autoClear = autoClear;
}
} );
|