延迟渲染如何从光贡献中排除网格

Deferred rendering how to exclude meshes from light contribution

我已经使用 Qt3D 设置了延迟渲染管道。到目前为止一切顺利,但现在我想在场景中渲染的网格周围添加选择框。

不幸的是,选择框网格受灯光影响,我不想这样(请参见下面的 "shaded" 图片)。例如,我可能想将环境光强度设置为 0,并且选择框应该仍然可见。另一个例子是,如果我想在其中一个视口角中显示典型的 X/Y/Z 指示器。

我得到了用于光贡献计算的典型光通过着色器,它(简而言之)是这样的:

void main()
{
    vec2 texCoord = gl_FragCoord.xy / winSize;
    vec4 col = texture(color, texCoord);
    vec3 pos = texture(position, texCoord).xyz;
    vec3 norm = texture(normal, texCoord).xyz;
    ... calculate lights contribution...
    fragColor = vec4(col.rgb * lightColor, col.a);
}

如果我将 fragColor 行替换为:

fragColor = vec4(col.rgb, col.a);

我得到下面的非阴影图片,它显示了我想要的选择框颜色。

是否有任何技巧或惯例可以从光通道中排除特定网格?

我已经尝试 "trick" 具有特殊值(如颜色 alpha = 0.123)的着色器,但它根本没有帮助。

阴影

非阴影

你基本上有两个选择:

  1. 当某个像素不应点亮时,将其存储在 gbuffer 中的某个位置。这可以通过颜色附件之一中的标志或通过在深度或模板缓冲区中存储特殊值来完成。

  2. 在照明场景渲染之上渲染照明阶段之后不需要照明的所有图元。

两个选项都有其 advantages/disadvantages。使用标志,如果您有不需要照明的大区域,它有时会更有效,因为您可以在着色器中跳过这些计算。另一方面,此解决方案可能需要更多内存,因为您必须将此信息存储在某个地方。在第二个版本中,您必须确保在生成 gbuffer 时仍然尊重创建的深度缓冲区(否则它们不会隐藏在照明对象后面),这可能就像附加相同的深度附件一样简单或非常复杂(如果照明数据直接渲染到后备缓冲区)。