WebGL渲染到纹理-如何将数据写入alpha通道
WebGL render to texture - how do I write data to the alpha channel?
在此之前,我尝试复制本文中描述的水渲染算法http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html.该算法的一部分要求将alpha遮罩渲染到帧缓冲区中,以便稍后用于从最初渲染的场景进行纹理采样。简而言之,算法看起来是这样的:
- 将场景几何体渲染到纹理S中,跳过折射网格并将其替换为alpha遮罩
- 通过对纹理S进行采样来渲染折射网格,如果纹理在alpha遮罩内,则使用扰动,否则仅直接对纹理S进行采样
不幸的是,我仍在学习WebGL,我真的不知道如何处理它。此外,这篇文章使用了HLSL,转换对我来说并不重要。显然,在片段着色器中尝试这样做是行不通的:
void main( void ) {
gl_FragColor = vec4( 0.0 );
}
因为它将仅与先前渲染的几何体混合,并且alpha值仍将为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/
显然,尝试在片段着色器中执行此操作是行不通的:因为它将仅与先前渲染的几何体混合,并且alpha值仍将为1.0。
这取决于你。只需使用正确的混合模式:
glBlendFuncSeparate(..., ..., GL_ONE, GL_ZERO);
glBlendFuncSeparate
为颜色的RGB和Alpha部分设置单独的混合。在这种情况下,它将源alpha直接写入目标。
请注意,如果绘制的是不透明的东西,则不需要混合模式。输出alpha将按原样书写,就像颜色一样。
相关文章:
- Kurento数据通道的创建和管理
- 如何启动WebRTC数据通道
- WebRTC - 数据通道 - 适用于移动互联网
- 标签在创建数据通道中的作用是什么以及如何正确使用它
- 画布到数据不带 alpha 通道的URL
- RTC 数据通道的行为不稳定
- 如何为远程对等方完全扩展官方WebRTC数据通道示例
- 如何传输文本,音频&使用Webrtc数据通道从一个对等端到另一个对等点的图像文件
- 通过谷歌应用程序引擎通道api发送数据uri
- 通过WebRTC的websocket或数据通道逐字符发送
- WebRTC数据通道服务器到客户端的UDP通信
- 如何保持WebRTC数据通道打开在手机浏览器非活动选项卡
- 如何测量webbrtc数据通道的带宽
- 如何使用数据通道创建HTML5 WebRTC对等体连接
- 如何启动一个基本的WebRTC数据通道
- 通过WebRTC数据通道发送带有元数据的文件块
- WebRTC数据通道不符合规格
- 如何在客户端使用JavaScript检查webRTC数据通道兼容性
- 如何在WebRTC对等体连接中创建数据通道
- WebRTC数据通道服务器端到客户端的UDP通信.目前有可能吗?