0

我有一个关于 OpenGL 渲染管道的问题。

我最近一直在阅读有关 GLSL 几何着色器的理论。我想我确实了解如何发出新几何图形并将颜色分配给新顶点的基础知识。但是,我不确定如果其中一个新顶点的位置与来自顶点着色器的顶点的位置完全相同,那么片段会得到什么颜色。

考虑这个例子:据我所知,我能够使用顶点着色器处理单个顶点。我进行了一些转换并将位置存储在 glPosition 中。此外,还可以为该顶点分配颜色,例如通过将其存储到 glFrontColor。例如,我将其设为红色。如果所有通道都有 32 位,那将是 0xFFFFFFFF'00000000'00000000'00000000,对吧?接下来,涉及几何着色器。我希望我的几何着色器发出一些额外的顶点。其中至少有一个与从顶点着色器传入的原始顶点处于完全相同的位置。但是,它被分配了另一种颜色,例如绿色。那将是 0x00000000'FFFFFFFF'00000000'00000000,对吧?迟早,在处理完每个顶点之后,就会发生光栅化。我认为,两个顶点都被光栅化,因此将成为同一个片段。所以,我们走了。那个特定的片段会变成什么颜色?是否有某种自动混合和片段变黄?或者是红色还是绿色?

这个问题可能很傻。但我只是不清楚这一点,如果有人能为我澄清这一点,我将不胜感激。

如果没有混合(我假设),我怎么可能创建混合效果?

4

2 回答 2

2

假设您正在渲染点(这似乎是您所描述的),具有不同颜色的两个顶点将在同一位置产生两个片段(每个顶点一个)。将什么最终颜色写入输出取决于每个颜色的 Z 值、混合函数集和处理它们的顺序(实际上是随机的——除非你做一些额外的同步,否则你不能指望任何一个顺序东西,所以你需要设置你的混合函数/Z-剔除,这样就没有关系了)。

于 2010-11-10T19:13:21.163 回答
0

我认为它们将是Z-Fighting,如果它们具有完全相同的 xy 和 z 值。

关于混合:

这与可编程管道是分开的,因此您不必为此在着色器中完成大部分工作。首先启用混合glEnable(GL_BLEND),然后指定您想要的混合功能glBlendFunc,最常见的是glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。现在顶点只需要设置一个 alpha 值gl_FragColor.a,它们的颜色就会混合。

于 2010-11-10T13:32:35.777 回答