OpenGL (4.2) 片段处理 & 深度缓冲区 & imageLoadAndStore

标签 opengl graphics glsl

我有一个两 channel 渲染。在第一遍中,我使用 FBO 将一些不透明的几何图形渲染为多个纹理。

在第二遍中,我再次渲染相同的几何图形,并基于不同的几何属性(如对象、法线等),我使用 imageStore() (image_load_and_store) 将第 1 遍计算的颜色值写入某些纹理的特定纹理像素中

我希望这种情况仅发生在可见片段上(仅对应于第 1 遍的最终片段颜色的片段)

所以我现在尝试的是从 channel 1获取GL_DEPTH_ATTACHMENT纹理并将其附加到 channel 2的fbo(也作为GL_DEPTH_ATTACHMENT),然后在渲染 channel 2之前我设置

glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glDepthMask(false);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
...render my scene...

我希望片段着色器(使用 imageStore())仅针对在第 1 遍中可见的片段执行(并且因为它与我渲染的场景相同,也在第 2 遍中)。

但它似乎不起作用 - 隐藏的片段也被处理并执行 imageStore() (并且由于它们使用在 pass1 中为可见片段计算的颜色,所以它们做了错误的事情)

知道为什么吗? imageStore或其他东西会强制fragmentshader执行吗?我能以某种方式控制这个吗?它必须与 Early-z 做一些事情吗?

最佳答案

OpenGL 规范定义片段着色器在深度测试之前执行。如果某些硬件首先执行深度测试,那么只有在交换机不会注意到任何行为变化的情况下。

好吧,除非您只是告诉片段着色器在深度测试后执行,否则请将此行放入片段着色器中:

layout(early_fragment_tests) in;

出于显而易见的原因,这是 Shader_image_load_store 的一部分。

关于OpenGL (4.2) 片段处理 & 深度缓冲区 & imageLoadAndStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926114/

相关文章:

python - 这个 Python Turtle 图形是如何制作的?

java - 如何用Java实现可执行JAR

c# - 如何在 .NET 中按比例调整任何类型的图像?

c++ - 球体的 OpenGL UV 贴图(有接缝)

opengl - 最简单照明模型中的光方向及其变换

c++ - Visual Studio 找不到 GL/glut.h

opengl - 从 4.1 版开始,OpenGL 中文本渲染的最新技术是什么?

java - 使用 openGL 绘制样条线

c++ - 如何在调整窗口大小时锁定纵横比?

opengl - 分析图形着色器