【问题标题】:Writing to depth buffer from opengl compute shader从opengl计算着色器写入深度缓冲区
【发布时间】:2016-11-27 22:09:05
【问题描述】:

通常在现代桌面 OpenGL 硬件上,从计算着色器填充深度缓冲区然后使用该深度缓冲区进行三角形等图形管道渲染的最佳方法是什么?

具体来说,我想知道关于 HiZ 的担忧。另外我想知道在图形渲染之前或之后对深度缓冲区进行计算着色器修改是否更好?

如果计算着色器在图形渲染之后运行,我假设深度缓冲区通常会在后台解压缩。但是我担心深度缓冲区的其他方式可能会处于图形管道的解压缩/非最佳状态?

【问题讨论】:

    标签: opengl depth-buffer compute-shader


    【解决方案1】:

    据我所知,您无法将具有任何深度格式的纹理绑定为图像,因此无法在计算着色器中写入深度格式纹理。请参阅glBindImageTexture documentation,它列出了您的纹理格式必须兼容的格式。深度格式不在其中,规范说深度格式与普通格式不兼容。

    纹理复制功能具有相同的兼容性限制,因此您甚至不能使用例如写入计算着色器中的普通纹理,然后复制到深度纹理。 glCopyImageSubData 没有明确的限制,但我没有尝试过,它不再是核心配置文件的一部分。

    可能的工作是写入普通纹理,然后渲染全屏三角形并将 gl_FragDepth 设置为从纹理读取的值,但这是一个额外的全屏通道。

    我不太明白您的第二个问题 - 如果您的计算着色器内容修改了深度缓冲区,结果很可能会有所不同,具体取决于您是在常规渲染之前还是之后执行此操作,因为不同的部分将可见或被遮挡。

    但也许这个问题没有实际意义,因为您似乎根本无法手动写入深度缓冲区 - 这也可能回答您的第三个问题 - 通过不写入深度缓冲区,您不能弄乱它的压缩:)

    请注意,我不是这方面的专家,我遇到了类似的问题并自己查看了文档/规范,所以这一切都可能是错误的 :) 如果您设法使用计算写入深度缓冲区,请告诉我着色器!

    【讨论】:

    • 我认为你得到了大部分问题,但具体的部分是 GPU 如何将深度缓冲区保持在更优化的形式,例如 HiZ 剔除等所以我专门寻找有经验的人的答案类似的相互作用
    • 只是为了确保我们在同一页面上,GPU 的 HiZ 是一项硬件功能,(afaik)没有公开记录,您在计算着色器中所做的任何事情都不会受益或干扰使用该功能,它旨在加速光栅化,仅此而已。如果您想了解 HiZ 的工作原理,我可以推荐 fgiesen.wordpress.com/2011/07/08/…,但除非您对渲染管道的光栅化部分进行低级优化,否则您无需担心。
    • HiZ 使用供应商特定的压缩/优化/重组形式的深度缓冲区。某些操作会迫使 GPU 从中转换,例如着色器直接访问深度缓冲区,这会使事情变慢。我想知道在与基于计算的东西集成时是否有人遇到过特定的更快路径。好像不是!
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多