7

我想要一个漂亮的渐变效果。但此刻它真的很不完整,你可以看到两个三角形之间的外观。我有以下着色器 vert 和 frag。我唯一能想到的就是切换到预先生成的纹理。

数据被抛光为两个三角形的浮点数 [xy][RGB],我认为 C++ 源代码不值得展示。

垂直#版本 330

layout(location = 0) in vec2 position;    
layout(location = 1) in vec3 incolor;

smooth out vec3 color;

void main()
{
    color = incolor;
    gl_Position = vec4(position.x,position.y,0.0,1.0);  
}

碎片#版本 330

smooth out vec4 outputColor;
smooth in vec3 color;

void main()
{
    outputColor  = vec4(vec3(color),1.0);   
}

结果 块状

查看单个三角形显示块状 在此处输入图像描述

4

1 回答 1

6

这是quad属性的线性插值的正确行为。请记住,四边形始终呈现为两个三角形。这样做有两种可能性:以对角线或对角线作为它们的共同边。现在如何插入属性变得不明确(在两种情况下都不同)。\/

我将向您展示一个与您的类似的示例。

在此处输入图像描述

三角形由\对角线分隔。

在此处输入图像描述

三角形由/对角线分隔。

在这两种情况下,顶点的颜色都是:

000000  top left
3B3B3B  top right + bottom left
FFFFFF  bottom right

一种解决方案是仅提供导致明确内插颜色的属性值(颜色)。当以下情况成立时就是这种情况。

考虑从左上角到右下角的一条线(我们称这些为具有指定基色的基本顶点)。左上角的值为0,右下角1。每个其他顶点(在这种情况下是左下角,右上角)都必须正交投影到这条假想线,并且相应的值被分配给这个顶点。在这种情况下(一个正方形),另外两个角各有一个值.5。这些角的颜色必须是两种基色的混合值,其 alpha 值对应于刚刚计算的值。

在上面的例子中,为了使两个图像看起来相同,其他两个角的颜色必须是808080而不是:3B3B3B

在此处输入图像描述

在您的情况下,您对顶点使用以下颜色(至少,它们在您的屏幕截图中显示为这样):

000000  top left
3A3A3A  top right + bottom left
595959  bottom right

所以他们不满足上面的要求,因为3A3A3A不是其他两者之间的平均值。


一个稍微不同的示例说明了为什么您可能不只是想使用.5混合 alpha 值(这会导致其他两个顶点的平均值)。考虑一个非正方形的四边形,比如这个矩形,它使用.5其他两个角的值,对应于808080灰色:

在此处输入图像描述

正如你所看到的,渐变的方向并不正交于两个“底角”之间的连接线,正如我所说的(左上 - 右下)。现在让我们看看我上面的方法产生了什么:

在此处输入图像描述

这看起来更像是两个角之间的线性渐变,但在“世界空间”中,而不是在“纹理空间”中。您可能更喜欢两个输出中的一个而不是另一个;我想向你展示不同之处。连接线上的值(正交投影)如下所示(它们只是近似值!)

在此处输入图像描述

抱歉我的图片不好... ;)

于 2013-01-05T01:41:03.060 回答