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

时间:2017-08-10 14:50:08

标签: qt opengl glsl qt3d

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

不幸的是,选择框网格会受到灯光的影响,我不希望这样(请参阅下面的“阴影”图片)。例如,我可能想要将环境光强度设置为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);

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

从光通道中排除特定网格是否有任何技巧或常见做法?

我已经尝试使用特殊值(例如颜色alpha = 0.123)“欺骗”着色器,但它根本没用。

enter image description here

无阴影

enter image description here

1 个答案:

答案 0 :(得分:2)

您基本上有两个选择:

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

  2. 在照明阶段渲染后渲染所有不需要照明的基元。

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