如果在同一位置有两个具有两种不同颜色的顶点,片段会得到啥颜色?

Posted

技术标签:

【中文标题】如果在同一位置有两个具有两种不同颜色的顶点,片段会得到啥颜色?【英文标题】:What color does a fragment get if there are two vertices at the very same position with two different colors?如果在同一位置有两个具有两种不同颜色的顶点,片段会得到什么颜色? 【发布时间】:2010-11-10 08:43:09 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

关于混合:

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

【讨论】:

以上是关于如果在同一位置有两个具有两种不同颜色的顶点,片段会得到啥颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在matplotlib中创建同一条线具有两种不同颜色的折线图?

首先在内部具有不同对象的 VBO 中定位

二分图判断-笔试题

基于顶点的openGL中具有不同颜色的三角形的平面着色

根据顶点世界位置Y坐标修改Metal片段着色

我如何使用视图模型从另一个片段访问函数