我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理。纹理是1维的灰度。从左到右表示从近到远。在某一深度上的像素越多,该点的纹理就越亮,黑色表示没有像素在该深度,白色表示所有像素都在该深度。
现在我有了一个解决方案,它在深度缓冲区上执行glReadPixels(),在CPU上分析它,然后将它写回纹理。这自然是应用程序中的一个真正的瓶颈。
我正在寻找一个全GPU的解决方案,其中深度缓冲区是分析在着色器或类似的东西,并以这种方式更新纹理。我想创建一个片段着色器来读取深度值并增加到纹理中相应的像素,但这需要片段着色器可以写入其他纹理。一些我已经学会的禁忌,特别是当它们必须写到同一个像素的时候。
有没有我遗漏的技巧或技巧,或者我被迫让CPU参与其中?
发布于 2011-04-13 18:50:33
幸运的是,有一个技巧:顶点着色器也可以采样纹理。因此,可以发出许多GL_POINTS,每个对应于深度纹理中的单个片段,然后在顶点着色器中,可以从深度纹理读取以确定点的变换位置。在点的片段着色器中,只需使用合适的alpha绘制一个值,即可获得所需的累积值。
因此,你已经让顶点着色器读取一个纹理,片段着色器不读取任何纹理,并且你正在使用正常的渲染到纹理机制来写入直方图。
发布于 2011-04-14 04:40:00
作为@Tommy建议的升级,我建议使用PBO而不是顶点纹理抓取:
https://stackoverflow.com/questions/5647727
复制相似问题