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

| 我正在使用当前上下文的深度缓冲区来影响正在显示的纹理。纹理是一维的,呈灰度。从左到右代表从近到远。在某个深度处的像素越多,则该点处的纹理越亮,黑色是该深度处没有像素,白色是所有像素都处于该深度处。 现在,我有了一个在深度缓冲区上执行does0ѭ的解决方案,并在CPU上对其进行分析,然后将其写回到纹理中。自然,这是应用程序中的真正瓶颈。 我正在寻找一种全GPU解决方案,其中在着色器或类似工具中分析深度缓冲区并以这种方式更新纹理。我考虑过要创建一个片段着色器,该片段着色器读取深度值并增加到纹理中的相应像素,但是这将要求片段着色器可以写入其他纹理。我已经学会了一种禁忌,尤其是如果他们必须写入相同的像素时。 是否有我缺少的技巧或技术,或者我被迫让CPU参与其中?     
已邀请:
幸运的是,有一个技巧:顶点着色器也可以对纹理进行采样。因此,您可以发出许多GL_POINTS,每个GL_POINTS对应于深度纹理中的单个片段,然后在顶点着色器中,您可以从深度纹理中读取以确定点的变换位置。在片段着色器中,为这些点绘制一个具有适当alpha值的值即可引起所需的累积。 因此,您已经使顶点着色器读取了一个纹理,片段着色器不读取任何纹理,并且您正在使用常规的纹理渲染机制来写入直方图。     
作为@Tommy提议的升级,我建议使用PBO代替顶点纹理获取: 将深度缓冲区复制到PBO中。 将PBO绑定为VBO,在其中绑定顶点属性(深度)。 用与深度缓冲区分辨率一样多的元素调用DrawArrays。 4 ...     

要回复问题请先登录注册