从opengl计算着色器写入深度缓冲区

从opengl计算着色器写入深度缓冲区,opengl,depth-buffer,compute-shader,Opengl,Depth Buffer,Compute Shader,通常,在现代桌面OpenGL硬件上,从计算着色器填充深度缓冲区,然后使用该深度缓冲区进行三角形等图形管道渲染的最佳方法是什么 具体而言,我想知道有关真主党的问题。另外,我想知道在图形渲染之前还是之后对深度缓冲区进行计算着色器修改是否更好 如果在图形渲染后运行计算着色器,我假设深度缓冲区通常会在幕后解压缩。但我担心用另一种方法处理深度缓冲可能会使图形管道处于解压缩/非最佳状态?据我所知,无法将任何深度格式的纹理绑定为图像,因此无法在计算着色器中写入深度格式纹理。请参见,它列出了纹理格式必须兼容的格

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

具体而言,我想知道有关真主党的问题。另外,我想知道在图形渲染之前还是之后对深度缓冲区进行计算着色器修改是否更好


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

据我所知,无法将任何深度格式的纹理绑定为图像,因此无法在计算着色器中写入深度格式纹理。请参见,它列出了纹理格式必须兼容的格式。深度格式不在其中,规范称深度格式与正常格式不兼容

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

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

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

但这个问题可能是没有意义的,因为您似乎根本无法手动写入深度缓冲区(这可能也回答了您的第三个问题),如果不写入深度缓冲区,您就无法对其进行压缩:)


请注意,我不是这方面的专家,我有一个类似的问题,我自己也看了文档/规范,所以这一切可能都是错误的:)请让我知道你是否设法用计算着色器写入深度缓冲区

据我所知,无法将任何深度格式的纹理绑定为图像,因此无法在计算着色器中写入深度格式纹理。请参见,它列出了纹理格式必须兼容的格式。深度格式不在其中,规范称深度格式与正常格式不兼容

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

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

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

但这个问题可能是没有意义的,因为您似乎根本无法手动写入深度缓冲区(这可能也回答了您的第三个问题),如果不写入深度缓冲区,您就无法对其进行压缩:)


请注意,我不是这方面的专家,我有一个类似的问题,我自己也看了文档/规范,所以这一切可能都是错误的:)请让我知道你是否设法用计算着色器写入深度缓冲区

我想大部分问题你都明白了,但具体的部分是GPU如何保持深度缓冲区的最佳形式,例如HiZ筛选等,所以我特别想从有类似交互经验的人那里寻找答案只是为了确保我们在同一页上,GPU的HiZ是一个硬件功能,即(afaik)未公开记录,在计算着色器中执行的任何操作都不会从该功能中受益或干扰该功能,其目的是加速光栅化,仅此而已。如果您想了解HiZ的工作原理,我可以向您推荐,但您不必担心,除非您正在对渲染管道的光栅化部分进行低级优化。HiZ使用特定于供应商的深度缓冲区压缩/优化/重组形式。某些操作会强制GPU从中转换,例如着色器直接访问深度缓冲区,这会使速度变慢。我想知道是否有人在与基于计算的东西集成时遇到过特定的更快的路径。似乎不是这样!我想大部分问题你都明白了,但具体的部分是GPU如何保持深度缓冲区的最佳形式,例如HiZ筛选等,所以我特别想从有类似交互经验的人那里寻找答案只是为了确保我们在同一页上,GPU的HiZ是一个硬件功能,即(afaik)未公开记录,在计算着色器中执行的任何操作都不会从该功能中受益或干扰该功能,其目的是加速光栅化,仅此而已。如果您想了解HiZ的工作原理,我可以向您推荐,但您不必担心,除非您正在对渲染管道的光栅化部分进行低级优化。HiZ使用特定于供应商的深度缓冲区压缩/优化/重组形式。某些操作会强制GPU从中转换,例如着色器直接访问深度缓冲区,这会使速度变慢。我想知道是否有人在与基于计算的东西集成时遇到过特定的更快的路径。似乎不是这样!