5

我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理。纹理是一维的并且是灰度的。从左到右代表从近到远。某个深度处的像素越多,该点的纹理越亮,黑色表示没有像素处于该深度,白色表示所有像素都处于该深度。

现在我有一个glReadPixels()在深度缓冲区上执行的解决方案,在 CPU 上对其进行分析,然后将其写回纹理。这自然是应用程序中的真正瓶颈。

我正在寻找一个全 GPU 解决方案,其中深度缓冲区在着色器或类似的东西中进行分析,并以这种方式更新纹理。我考虑过创建一个片段着色器来读取深度值并增加到纹理中的相应像素,但这需要片段着色器可以写入其他纹理。我已经学会了禁止的东西,特别是如果他们必须写入同一个像素。

是否有我遗漏的技巧或技术,或者我是否被迫让 CPU 参与其中?

4

2 回答 2

5

作为对@Tommy 提案的升级,我建议使用 PBO 而不是顶点纹理获取:

  1. 将深度缓冲区复制到 PBO。
  2. 将PBO绑定为VBO,在其中绑定顶点属性(深度)。
  3. 使用与深度缓冲区分辨率一样多的元素调用 DrawArrays。4...
于 2011-04-13T20:40:00.277 回答
3

幸运的是,有一个技巧:顶点着色器也可以对纹理进行采样。所以你可以发出很多GL_POINTS,每个对应深度纹理中的一个单独的片段,然后在顶点着色器中你可以从深度纹理中读取来确定点的变换位置。在您的片段着色器中,只需绘制一个具有合适 alpha 的值即可导致您想要的累积。

因此,您已经让顶点着色器读取一个纹理,片段着色器没有读取任何纹理,并且您正在使用正常的渲染到纹理机制来写入直方图。

于 2011-04-13T10:50:33.053 回答