我正在使用Three.js将世界呈现给一个WebGLRenderTarget。我的世界没有充满整个屏幕,因此,有透明的背景。其目的是提供α通道感知的图像效果。
我的后处理功能取决于alpha通道。然而,看起来Three.JS后处理着色器无法正确读取alpha通道--无论我尝试向WebGLRenderTarget添加什么值,它都是1.0。
演示这个问题的简单方法。
我创建一个呈现目标:
var rtParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat};
for(var i=0; i<this.bufferCount; i++) {
this.buffers[i] = new THREE.WebGLRenderTarget(this.width, this.height, rtParameters);
}
我将缓冲区设置alpha清除为0.3::
function clear(buf) {
// For debugging purposes we set clear color alpha
renderer.setClearColor(new THREE.Color(0xff00ff), 0.3);
renderer.clearTarget(buf, true, true, true);
}
// Clean up both buffers for the start
clear(buffers[0]);
然后,我使用这个缓冲区作为读取缓冲区,并在我的后处理片段着色器函数(ThreeJS后处理示例)中呈现给屏幕:
"void main() {",
// texture is the buffer I rendered before
"vec4 sample = texture2D( texture, vUv);",
// Everything goes to white (1.0) when trying to visualize the
// alpha channel of previously rendered WebGLTarget.
// It should get value 0.3 - slight gray
"gl_FragColor = vec4(sample.a, sample.a, sample.a, 1.0);",
"}"
其他颜色值被正确读取。如果我使用vec4(sample.r, sample.g, sample.b, 1.0)
,它将按预期直接复制。
发布于 2012-07-01 08:12:03
这是一把小提琴,它实现了我相信你正在努力实现的目标。
https://stackoverflow.com/questions/11282303
复制