three-stdlib
Version:
stand-alone library of threejs examples
176 lines (175 loc) • 4.74 kB
JavaScript
import { WebGLRenderTarget, HalfFloatType } from "three";
import { SSAARenderPass } from "./SSAARenderPass.js";
class TAARenderPass extends SSAARenderPass {
constructor(scene, camera, clearColor, clearAlpha) {
super(scene, camera, clearColor, clearAlpha);
this.sampleLevel = 0;
this.accumulate = false;
this.accumulateIndex = -1;
}
render(renderer, writeBuffer, readBuffer, deltaTime) {
if (this.accumulate === false) {
super.render(renderer, writeBuffer, readBuffer, deltaTime);
this.accumulateIndex = -1;
return;
}
const jitterOffsets = _JitterVectors[5];
if (this.sampleRenderTarget === void 0) {
this.sampleRenderTarget = new WebGLRenderTarget(readBuffer.width, readBuffer.height, { type: HalfFloatType });
this.sampleRenderTarget.texture.name = "TAARenderPass.sample";
}
if (this.holdRenderTarget === void 0) {
this.holdRenderTarget = new WebGLRenderTarget(readBuffer.width, readBuffer.height, { type: HalfFloatType });
this.holdRenderTarget.texture.name = "TAARenderPass.hold";
}
if (this.accumulateIndex === -1) {
super.render(renderer, this.holdRenderTarget, readBuffer, deltaTime);
this.accumulateIndex = 0;
}
const autoClear = renderer.autoClear;
renderer.autoClear = false;
renderer.getClearColor(this._oldClearColor);
const oldClearAlpha = renderer.getClearAlpha();
const sampleWeight = 1 / jitterOffsets.length;
if (this.accumulateIndex >= 0 && this.accumulateIndex < jitterOffsets.length) {
this.copyUniforms["opacity"].value = sampleWeight;
this.copyUniforms["tDiffuse"].value = writeBuffer.texture;
const numSamplesPerFrame = Math.pow(2, this.sampleLevel);
for (let i = 0; i < numSamplesPerFrame; i++) {
const j = this.accumulateIndex;
const 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.setClearColor(this.clearColor, this.clearAlpha);
renderer.clear();
renderer.render(this.scene, this.camera);
renderer.setRenderTarget(this.sampleRenderTarget);
if (this.accumulateIndex === 0) {
renderer.setClearColor(0, 0);
renderer.clear();
}
this.fsQuad.render(renderer);
this.accumulateIndex++;
if (this.accumulateIndex >= jitterOffsets.length)
break;
}
if (this.camera.clearViewOffset)
this.camera.clearViewOffset();
}
renderer.setClearColor(this.clearColor, this.clearAlpha);
const accumulationWeight = this.accumulateIndex * sampleWeight;
if (accumulationWeight > 0) {
this.copyUniforms["opacity"].value = 1;
this.copyUniforms["tDiffuse"].value = this.sampleRenderTarget.texture;
renderer.setRenderTarget(writeBuffer);
renderer.clear();
this.fsQuad.render(renderer);
}
if (accumulationWeight < 1) {
this.copyUniforms["opacity"].value = 1 - accumulationWeight;
this.copyUniforms["tDiffuse"].value = this.holdRenderTarget.texture;
renderer.setRenderTarget(writeBuffer);
this.fsQuad.render(renderer);
}
renderer.autoClear = autoClear;
renderer.setClearColor(this._oldClearColor, oldClearAlpha);
}
dispose() {
super.dispose();
if (this.sampleRenderTarget !== void 0)
this.sampleRenderTarget.dispose();
if (this.holdRenderTarget !== void 0)
this.holdRenderTarget.dispose();
}
}
const _JitterVectors = [
[
[0, 0]
],
[
[4, 4],
[-4, -4]
],
[
[-2, -6],
[6, -2],
[-6, 2],
[2, 6]
],
[
[1, -3],
[-1, 3],
[5, 1],
[-3, -5],
[-5, 5],
[-7, -1],
[3, 7],
[7, -7]
],
[
[1, 1],
[-1, -3],
[-3, 2],
[4, -1],
[-5, -2],
[2, 5],
[5, 3],
[3, -5],
[-2, 6],
[0, -7],
[-4, -6],
[-6, 4],
[-8, 0],
[7, -4],
[6, 7],
[-7, -8]
],
[
[-4, -7],
[-7, -5],
[-3, -5],
[-5, -4],
[-1, -4],
[-2, -2],
[-6, -1],
[-4, 0],
[-7, 1],
[-1, 2],
[-6, 3],
[-3, 3],
[-7, 6],
[-3, 6],
[-5, 7],
[-1, 7],
[5, -7],
[1, -6],
[6, -5],
[4, -4],
[2, -3],
[7, -2],
[1, -1],
[4, -1],
[2, 1],
[6, 2],
[0, 4],
[4, 4],
[2, 5],
[7, 5],
[5, 6],
[3, 7]
]
];
export {
TAARenderPass
};
//# sourceMappingURL=TAARenderPass.js.map