【问题标题】:Accumulation shader with Three.jsThree.js 的累积着色器
【发布时间】:2014-05-05 10:10:21
【问题描述】:

我正在尝试使用 THREE.js 实现路径跟踪器。我基本上是在渲染一个全屏四边形,路径跟踪发生在像素着色器中。

我想要更高的采样率,一种方法是为每个像素采样一条路径并累积生成的图像。 (即平均每个着色器通道获得的图像)

因为它是我能够生成我需要的图像,但我不知道如何积累它们。我的猜测是我必须使用两个渲染目标;一个包含“最新”的采样图像,一个包含迄今为止显示的所有图像的平均值。

我只是不知道如何从 WebGLRenderTarget 获取数据并使用它来操作包含在另一个渲染目标中的数据。 Three.js 甚至可以做到这一点吗?我一直在研究 FrameBuffer 对象,这似乎是一条有希望的道路,我正在梳理 MrDoob 的 FBO 示例 (http://www.mrdoob.com/lab/javascript/webgl/particles/particles_zz85.html),它看起来很有希望,但我不确定我是否走在正确的道路上。

【问题讨论】:

标签: javascript opengl-es three.js webgl


【解决方案1】:

我认为问题在于您不能从同一个缓冲区读取和写入。假设您在一帧渲染某些东西,您需要一个输出到累加缓冲区的通道。下一帧,您需要进行计算,并保存到同一个缓冲区,但如果我理解正确的话,目前 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;
}

【讨论】:

  • 感谢您的出色回答。最后我用纯WebGL重新实现了整个东西,你可以在tinyurl.com/k7adpb6看到结果!
  • 甜蜜的演示,这是来自特定教程吗?
  • 不是真的,只是基于一个简单的路径跟踪算法和其他教程/示例,我可以从网上找到。整件事都得到了相当彻底的评论,所以不要犹豫,查看源代码!
猜你喜欢
  • 2014-03-24
  • 1970-01-01
  • 2016-03-06
  • 2021-06-29
  • 2012-09-28
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多