В качестве предисловия я пытаюсь воспроизвести алгоритм рендеринга воды, описанный в этой статье 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;
}
}
Полный код можно найти на странице http://scottrabin.github.com/Terrain/.