SSAO シェーダー (スクリーン スペース アンビエント オクルージョン) をアンチエイリアシング レンダー スタック (スーパー サンプリング アンチエイリアシング) に統合したいと考えています。AA は高品質のレンダリングに必要です。私の GPU が提供するデフォルトのアンチエイリアシングは常に十分ではありません。現在、SSAO は通常のレンダリング プロセスに既に統合されていますが、私の新しい目標は、両方の手法を組み合わせることです。
このために、私はフィドルを設定しました。最初の EffectComposer は、キャンバスの 2 倍の解像度で renderTarget にシーンをレンダリングします。このことから、SSAO に depthTarget を使用したいと思います。最後のステップは、レンダリングされたイメージをキャンバスのサイズの平面に描画することです。これにより、ダウンサンプリングが行われるため、アンチエイリアシング効果が得られます。
フィドルへのリンク: SSAO+SSAA
スタックは次のように設定されます。
function initManualAntiAliasing2(width, height, wStepMax, hStepMax) {
var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };
// render image with double size
var rw1 = wStepMax * width;
var rh1 = hStepMax * height;
var myRenderTarget1 = new THREE.WebGLRenderTarget( rw1, rh1, parameters );
var myRenderTargetSSAO = new THREE.WebGLRenderTarget( rw1, rh1, parameters );
composer = new THREE.EffectComposer( renderer, myRenderTarget1 );
var renderPass = new THREE.RenderPass(scene, camera);
composer.addPass(renderPass);
var renderSceneSSAO = new THREE.TexturePass(composer.renderTarget2);
composerSSAO = new THREE.EffectComposer( renderer, myRenderTargetSSAO );
composerSSAO.addPass(renderSceneSSAO);
var depthShader = THREE.ShaderLib[ "depthRGBA" ];
var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
depthMaterial.blending = THREE.NoBlending;
var parametersDepth = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat };
myRenderTargetDepth = new THREE.WebGLRenderTarget( rw1, rh1, parametersDepth );
ssaoEffect = new THREE.ShaderPass( THREE.SSAOShader );
ssaoEffect.uniforms[ 'tDepth' ].value = myRenderTargetDepth;
ssaoEffect.uniforms[ 'size' ].value.set( rw1, rh1 );
ssaoEffect.uniforms[ 'cameraNear' ].value = camera.near;
ssaoEffect.uniforms[ 'cameraFar' ].value = camera.far;
ssaoEffect.uniforms[ 'aoClamp' ].value = 0.4;
ssaoEffect.uniforms[ 'lumInfluence' ].value = 0.4;
ssaoEffect.uniforms[ 'onlyAO' ].value = 1; // debug: when ssao shader works, we will definitely see it with this option
ssaoEffect.renderToScreen = true;
composerSSAO.addPass( ssaoEffect );
var renderScene1 = new THREE.TexturePass(composer.renderTarget2);
// sample down to screen size
composer1 = new THREE.EffectComposer(renderer);
composer1.addPass(renderScene1);
var renderScene2 = new THREE.TexturePass(composer1.renderTarget2);
var effectCopy = new THREE.ShaderPass( THREE.CopyShader );
effectCopy.renderToScreen = true;
composer1.addPass(effectCopy);
}
レンダリング関数は次のように設定されます。
function renderAA2() {
renderer.autoClear = false;
renderer.clear();
scene.overrideMaterial = myRenderTargetDepth;
composer.render();
composerSSAO.render();
scene.overrideMaterial = null;
composer1.render();
}
私は同様の状況を見つけていないので、私の質問: ssao が使用されるようにスタック全体をセットアップする方法。
こんにちは、トーマス