Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在同一个绘图调用中,是否可以对我正在采样的深度纹理进行深度测试?_Opengl_Fbo_Opengl 4_Deferred Rendering - Fatal编程技术网

Opengl 在同一个绘图调用中,是否可以对我正在采样的深度纹理进行深度测试?

Opengl 在同一个绘图调用中,是否可以对我正在采样的深度纹理进行深度测试?,opengl,fbo,opengl-4,deferred-rendering,Opengl,Fbo,Opengl 4,Deferred Rendering,背景: 我使用的是延迟渲染设置,在第一阶段,我有两个FBO:一个是GBuffer,用于存储所有可见碎片的法线、反照率和材质信息。此FBO具有32位深度纹理。在计算任何照明之前,这将在几何体过程中绘制 第二个FBO仅为颜色,从黑色开始,但通过从GBuffer采样并使用添加混合写入仅颜色缓冲区的照明着色器在多个过程中累积照明 问题是,我真的很想利用早期深度测试,以便让我的照明只计算包含实际几何体(而不仅仅是天空)的碎片。我能想到的最好的方法是使用深度测试,在阳光下使深度为1的任何像素失败,或者使位于

背景:

我使用的是延迟渲染设置,在第一阶段,我有两个FBO:一个是GBuffer,用于存储所有可见碎片的法线、反照率和材质信息。此FBO具有32位深度纹理。在计算任何照明之前,这将在几何体过程中绘制

第二个FBO仅为颜色,从黑色开始,但通过从GBuffer采样并使用添加混合写入仅颜色缓冲区的照明着色器在多个过程中累积照明

问题是,我真的很想利用早期深度测试,以便让我的照明只计算包含实际几何体(而不仅仅是天空)的碎片。我能想到的最好的方法是使用深度测试,在阳光下使深度为1的任何像素失败,或者使位于点光源影响范围后面的任何像素失败。但是,我不认为我可以将这个深度纹理绑定到我的颜色FBO,因为我还可以在照明着色器中对其进行采样,以计算碎片在世界空间中的位置

所以我的问题是:有没有一种方法可以在早期深度测试和着色器内部采样时使用相同的深度纹理?或者,如果没有,是否有其他(合理性能)方法来拒绝没有几何体的像素?在我的灯光通行证中,我根本不会写这种深度纹理


我只需要瞄准PC上的现代图形硬件(这样我就可以使用任何通用扩展或openGL 4.6功能)。

openGL中有关于读取着色器中的数据的规则,该着色器也因帧缓冲区操作而更新。那些规定过去很严格。事实上,在GL 4.4之前,您试图做的实际上是未定义的行为。也就是说,如果纹理中的图像已附加到渲染FBO,并且您从该纹理中采集了一个样本,使其能够从附加的图像中读取,那么您将获得未定义的行为。不管你的书写面具是否意味着没有书写发生;是乌布


幸运的是,它现在已经有了明确的定义。你只有在实际写作时才能得到UB,而不仅仅是因为你有一张附在FBO上的图片。我所说的“现在”,基本上是指过去10年制造的任何硬件。虽然它们是相当新的,但它们的前身NV_纹理_屏障实际上相当旧。尽管名称上是NVIDIA扩展,但事实上确实如此。

OpenGL中有关于读取着色器中的数据的规则,该着色器也因帧缓冲区操作而更新。那些规定过去很严格。事实上,在GL 4.4之前,您试图做的实际上是未定义的行为。也就是说,如果纹理中的图像已附加到渲染FBO,并且您从该纹理中采集了一个样本,使其能够从附加的图像中读取,那么您将获得未定义的行为。不管你的书写面具是否意味着没有书写发生;是乌布

幸运的是,它现在已经有了明确的定义。你只有在实际写作时才能得到UB,而不仅仅是因为你有一张附在FBO上的图片。我所说的“现在”,基本上是指过去10年制造的任何硬件。虽然它们是相当新的,但它们的前身NV_纹理_屏障实际上相当旧。尽管名称上是NVIDIA的一个扩展,但事实上它确实是