我认为问题是你不能从同一个缓冲区读写。假设你渲染一帧图像,你需要一个输出到累积缓冲区的通道。下一帧,你需要做你的计算,并保存到同一个缓冲区,但如果我理解正确,这对目前的WebGL是不可能的。
你可以做的是有两个缓冲区。在着色器中,您将东西输出到缓冲区并进行计算,只需添加另一个纹理采样器,从前一帧读取一个,保存到下一个纹理采样器,然后交替。你将始终拥有你的累计值,你可以使用任何你想添加的数学,但是你需要确保你正在正确的帧读取正确的缓冲区。
three.js有一个用于后期处理的插件,这对于做这样的事情应该非常方便。
var flipFlop = true;
var buffer1 = THREE.WebGLRenderTarget(BUFFERSIZE, BUFFERSIZE, {minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, type: THREE.FloatType});
var buffer2 = THREE.WebGLRenderTarget(BUFFERSIZE, BUFFERSIZE, {minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, type: THREE.FloatType});
function render() {
// If we are in frame1 read buffer from frame0 and add it to whatever you compute
yourComputeShaderMaterial.uniforms._accumulationBuffer.value = flipFlop ? buffer2 : buffer1;
if (flipFlop) // Frame 0
renderer.render(scene, camera, buffer1);
else // Frame 1
renderer.render(scene, camera, buffer2);
// Get whatever just renderered in this frame and use it
yourEndShader.uniforms._accumulationBuffer.value = !flipFlop ? buffer2 : buffer1;
// Switch frame
flipFlop = !flipFlop;
}
请参阅http://threejs.org/examples/webgl_gpgpu_birds.html。它展示了两个渲染目标之间乒乓球的例子。 – WestLangley