2017-08-10 54 views
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,但它根本没有任何帮助。

enter image description here

非阴影

enter image description here

回答

2

你基本上有两种选择:

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

  2. 在照明场景渲染之后渲染所有不需要照明的基元。

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

+0

BDL,谢谢,我想我会选择第二个。我发布这个10分钟后,我意识到我可以用一个单独的着色器来渲染这些网格物体。我唯一担心的是他们如何与gbuffer碎片混合时看起来如何。如果我取得了一些好成绩,我会发布更新。 –