我認爲問題是你不能從同一個緩衝區讀寫。假設你渲染一幀圖像,你需要一個輸出到累積緩衝區的通道。下一幀,你需要做你的計算,並保存到同一個緩衝區,但如果我理解正確,這對目前的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