これを前置きするために、この記事http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.htmlで説明されている水レンダリング アルゴリズムを複製しようとしています。このアルゴリズムの一部では、最初にレンダリングされたシーンからのテクスチャ サンプリングに後で使用するために、アルファ マスクをフレーム バッファにレンダリングする必要があります。要するに、アルゴリズムは次のようになります。
- シーン ジオメトリをテクスチャSにレンダリングし、屈折メッシュをスキップしてアルファ マスクに置き換えます。
- アルファ マスク内にある場合は摂動を使用してテクスチャSをサンプリングすることにより、屈折メッシュをレンダリングします。それ以外の場合は、テクスチャSを直接サンプリングします。
残念ながら、私はまだ WebGL を学んでおり、これにアプローチする方法を知るのに十分な知識がありません。さらに、その記事は HLSL を使用しており、変換は私にとって重要です。明らかに、フラグメント シェーダーでこれを実行しようとしてもうまくいきません。
void main( void ) {
gl_FragColor = vec4( 0.0 );
}
以前にレンダリングされたジオメトリとブレンドされ、アルファ値は 1.0 のままになるためです。
ここに私が持っているものの簡単な概要があります:
function animate(){
... snip ...
renderer.render( scene, camera, rtTexture, true );
renderer.render( screenScene, screenCamera );
}
// water fragment shader
void main( void ){
// black out the alpha channel
gl_FragColor = vec4(0.0);
}
// screen fragment shader
varying vec2 vUv;
uniform sampler2D screenTex;
void main( void ) {
gl_FragColor = texture2D( screenTex, vUv );
// just trying to see what the alpha mask would look like
if( gl_FragColor.a < 0.1 ){
gl_FragColor.b = 1.0;
}
}