|
@@ -32,7 +32,7 @@ import { CopyShader } from '../shaders/CopyShader.js';
|
|
|
|
|
|
class SSAOPass extends Pass {
|
|
|
|
|
|
- constructor( scene, camera, width, height ) {
|
|
|
+ constructor( scene, camera, width, height, kernelSize = 32 ) {
|
|
|
|
|
|
super();
|
|
|
|
|
@@ -45,7 +45,6 @@ class SSAOPass extends Pass {
|
|
|
this.scene = scene;
|
|
|
|
|
|
this.kernelRadius = 8;
|
|
|
- this.kernelSize = 32;
|
|
|
this.kernel = [];
|
|
|
this.noiseTexture = null;
|
|
|
this.output = 0;
|
|
@@ -57,17 +56,15 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
//
|
|
|
|
|
|
- this.generateSampleKernel();
|
|
|
+ this.generateSampleKernel( kernelSize );
|
|
|
this.generateRandomKernelRotations();
|
|
|
|
|
|
- // beauty render target
|
|
|
+ // depth texture
|
|
|
|
|
|
const depthTexture = new DepthTexture();
|
|
|
depthTexture.format = DepthStencilFormat;
|
|
|
depthTexture.type = UnsignedInt248Type;
|
|
|
|
|
|
- this.beautyRenderTarget = new WebGLRenderTarget( this.width, this.height, { type: HalfFloatType } );
|
|
|
-
|
|
|
// normal render target with depth buffer
|
|
|
|
|
|
this.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {
|
|
@@ -93,6 +90,8 @@ class SSAOPass extends Pass {
|
|
|
blending: NoBlending
|
|
|
} );
|
|
|
|
|
|
+ this.ssaoMaterial.defines[ 'KERNEL_SIZE' ] = kernelSize;
|
|
|
+
|
|
|
this.ssaoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;
|
|
|
this.ssaoMaterial.uniforms[ 'tDepth' ].value = this.normalRenderTarget.depthTexture;
|
|
|
this.ssaoMaterial.uniforms[ 'tNoise' ].value = this.noiseTexture;
|
|
@@ -159,7 +158,6 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
// dispose render targets
|
|
|
|
|
|
- this.beautyRenderTarget.dispose();
|
|
|
this.normalRenderTarget.dispose();
|
|
|
this.ssaoRenderTarget.dispose();
|
|
|
this.blurRenderTarget.dispose();
|
|
@@ -177,16 +175,10 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
}
|
|
|
|
|
|
- render( renderer, writeBuffer /*, readBuffer, deltaTime, maskActive */ ) {
|
|
|
+ render( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {
|
|
|
|
|
|
if ( renderer.capabilities.isWebGL2 === false ) this.noiseTexture.format = LuminanceFormat;
|
|
|
|
|
|
- // render beauty
|
|
|
-
|
|
|
- renderer.setRenderTarget( this.beautyRenderTarget );
|
|
|
- renderer.clear();
|
|
|
- renderer.render( this.scene, this.camera );
|
|
|
-
|
|
|
// render normals and depth (honor only meshes, points and lines do not contribute to SSAO)
|
|
|
|
|
|
this.overrideVisibility();
|
|
@@ -224,14 +216,6 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
break;
|
|
|
|
|
|
- case SSAOPass.OUTPUT.Beauty:
|
|
|
-
|
|
|
- this.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;
|
|
|
- this.copyMaterial.blending = NoBlending;
|
|
|
- this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
case SSAOPass.OUTPUT.Depth:
|
|
|
|
|
|
this.renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer );
|
|
@@ -248,7 +232,7 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
case SSAOPass.OUTPUT.Default:
|
|
|
|
|
|
- this.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;
|
|
|
+ this.copyMaterial.uniforms[ 'tDiffuse' ].value = readBuffer.texture;
|
|
|
this.copyMaterial.blending = NoBlending;
|
|
|
this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
|
|
|
|
|
@@ -331,7 +315,6 @@ class SSAOPass extends Pass {
|
|
|
this.width = width;
|
|
|
this.height = height;
|
|
|
|
|
|
- this.beautyRenderTarget.setSize( width, height );
|
|
|
this.ssaoRenderTarget.setSize( width, height );
|
|
|
this.normalRenderTarget.setSize( width, height );
|
|
|
this.blurRenderTarget.setSize( width, height );
|
|
@@ -344,9 +327,8 @@ class SSAOPass extends Pass {
|
|
|
|
|
|
}
|
|
|
|
|
|
- generateSampleKernel() {
|
|
|
+ generateSampleKernel( kernelSize ) {
|
|
|
|
|
|
- const kernelSize = this.kernelSize;
|
|
|
const kernel = this.kernel;
|
|
|
|
|
|
for ( let i = 0; i < kernelSize; i ++ ) {
|
|
@@ -431,9 +413,8 @@ SSAOPass.OUTPUT = {
|
|
|
'Default': 0,
|
|
|
'SSAO': 1,
|
|
|
'Blur': 2,
|
|
|
- 'Beauty': 3,
|
|
|
- 'Depth': 4,
|
|
|
- 'Normal': 5
|
|
|
+ 'Depth': 3,
|
|
|
+ 'Normal': 4
|
|
|
};
|
|
|
|
|
|
export { SSAOPass };
|