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

时间:2011-04-13 10:31:42

标签: performance opengl glsl histogram depth-buffer

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

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

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

是否存在我缺少的技巧或技巧,或者我是否被迫让CPU参与其中?

2 个答案:

答案 0 :(得分:4)

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

  1. 将深度缓冲区复制到PBO中。
  2. 将PBO绑定为VBO,绑定顶点属性(深度)。
  3. 使用与深度缓冲区分辨率一样多的元素调用DrawArrays。 4 ...

答案 1 :(得分:3)

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

所以,你有顶点着色器读取一个纹理,片段着色器没有读取任何纹理,你正在使用正常的渲染到纹理机制来写你的直方图。