1

我已经使用 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 等特殊值“欺骗”着色器,但它根本没有帮助。

阴影

在此处输入图像描述

无阴影

在此处输入图像描述

4

1 回答 1

2

你基本上有两个选择:

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

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

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

于 2017-08-10T15:02:48.020 回答