使用GLSL创建深度缓冲直方图纹理

5
我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理。该纹理为一维灰度图像,从左到右表示从近到远。在某个深度处有更多像素,则该点的纹理越亮,黑色表示不存在该深度的像素,白色表示所有像素都存在于该深度。
现在我有一个解决方案,对深度缓冲区进行glReadPixels(),在CPU上进行分析,然后将其写回到纹理中。自然地,这是应用程序中的真正瓶颈。
我正在寻找一个全GPU解决方案,其中深度缓冲区在着色器或类似方法中进行分析并更新纹理。我考虑创建一个片段着色器,读取深度值并增加到纹理中对应的像素位置,但这需要片段着色器能够写入其他纹理。我了解到这是不可行的,特别是如果它们必须写入相同的像素。
是否有我错过的技巧或技术,或者我必须涉及CPU?
2个回答

5
作为@Tommy提议的升级,我建议使用PBO而不是顶点纹理获取:
  1. 将深度缓冲区复制到PBO中。
  2. 将PBO绑定为VBO,并绑定其中的顶点属性(深度)。
  3. 使用与深度缓冲区分辨率相同数量的元素调用DrawArrays。

哦,是的,出于类似于依赖纹理读取在片段着色器中比非依赖读取更昂贵的原因,这应该会更便宜(即并行性如何工作是显而易见的)——我的想法有些混乱,因为我目前的日常工作是在GL ES中,只有数组和元素数组缓冲区。 - Tommy

3
幸运的是,有一个技巧:顶点着色器也可以采样纹理。因此,您可以发出大量的GL_POINTS,每个对应于深度纹理中的一个单独片段,然后在顶点着色器中,您可以从深度纹理中读取以确定点的变换位置。在点的片段着色器中,只需绘制一个适当的alpha值即可导致所需的累积。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接