2016-07-24 207 views
0

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

具体而言,我想知道关于HiZ的问题。另外我想知道在图形渲染之前或之后对深度缓冲区执行计算着色器修改会更好吗?

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

回答

2

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

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

什么可能会写入正常纹理,然后呈现全屏三角形并将gl_FragDepth设置为从纹理中读取的值,但这是一个额外的全屏传递。

我不太理解你的第二个问题 - 如果你的计算着色器的东西修改了深度缓冲区,结果很可能会有所不同,这取决于你是在正常渲染之前还是之后进行,因为不同的部分将是可见的或遮挡的。

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

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

+0

我认为你可以得到大部分的问题,但具体的部分是GPU如何能够以更优化的形式保存深度缓冲区,例如HiZ剔除等。因此,我专门寻找具有类似相互作用经验的人的答案 – iam

+0

确保我们在同一页面上,GPU的HiZ是一个硬件特性,(afaik)没有公开记录,你在计算着色器中做的任何事情都不会受益于或干扰该特性,它旨在加速光栅化,而已。如果您想了解HiZ的工作原理,我可以推荐https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/,但除非您是低级别的 - 优化渲染管线的栅格化部分,否则就没什么好担心的。 – karyon

+0

HiZ使用供应商特定的压缩/优化/重组形式的深度缓冲区。某些操作迫使GPU从此转换,例如直接着色器访问到深度缓冲区,这会使事情变得更慢。我想知道是否有人在与基于计算的东西集成时遇到了特定的更快的路径。似乎不是! – iam