首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GLSL创建深度缓冲区直方图纹理

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

Stack Overflow用户
提问于 2011-04-13 18:31:42
回答 2查看 3.5K关注 0票数 5

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-13 18:50:33

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-04-14 04:40:00

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

  1. 将深度缓冲区复制到PBO中。
  2. 将PBO绑定为VBO,在其中绑定顶点属性(深度)。
  3. 使用与深度缓冲区分辨率相同的元素调用DrawArrays。4...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5647727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档