我正在尝试制作如下图右侧的三角形:
问题是我想要实现的是来自 C 的顶点 1 和 2 的颜色渐变。
据我所知,这是不可能的,因为顶点 C 必须有自己的颜色,它也会混合成 1 和 2 的颜色,就像图片的左三角形一样。如果我将 C 设置为中间点颜色,则会产生不希望的结果,因为三角形越高,其他顶点的颜色就越不明显。
C1 线应为黑色,C2 线应为白色。
有没有办法在OpenGL中实现这一点?
我正在尝试制作如下图右侧的三角形:
问题是我想要实现的是来自 C 的顶点 1 和 2 的颜色渐变。
据我所知,这是不可能的,因为顶点 C 必须有自己的颜色,它也会混合成 1 和 2 的颜色,就像图片的左三角形一样。如果我将 C 设置为中间点颜色,则会产生不希望的结果,因为三角形越高,其他顶点的颜色就越不明显。
C1 线应为黑色,C2 线应为白色。
有没有办法在OpenGL中实现这一点?
有两种方法,但我不知道哪种方法对您的应用程序最有意义。在非常高的水平上:
将纹理映射到三角形。由于渐变非常平滑,它不需要非常高的分辨率,您可以让线性过滤为您完成工作。
使用着色器。设置更多工作,但也更灵活,并在任何比例/分辨率下为您提供“完美”的结果。
更新:如果你要使用着色器,想法如下。
将 avarying vec2 coords
从顶点着色器传递到片段着色器。将点 1 的值设置为0,0
,将点 2的值设置为 ,1,0
将点 C 的值设置为0,1
。要将这些值放入顶点着色器,请使用attribute
. 不同的值将在三角形上插值,就像纹理坐标和颜色一样。所以coords
变量被映射到你的三角形,如下所示:
y
1 +-----+
|\ |
|#\ |
|##\ |
|###\ |
|####\|
0 +-----+ x
0 1
片段着色器coords
在散列区域内的某处接收一个值。要弄清楚每种颜色需要混合多少,请计算通过coords
和的线0,1
,并找到它与x
轴的交点。由于 的坐标系coords
,这是一个简单的操作:只需coords.x
除以coords.y
。打电话给这个f
。(请注意,这将在点 C 处除以零,但这是预期的,因为您从未在那里定义颜色。如果需要,您可以在着色器中显式检查。)
coords
用字符表示和表示行,最终c
介于0 和 1 之间:.
f
y
1 +-----+
|\ |
|.\ |
|#c\ |
|#.#\ |
|##.#\|
0 +--f--+ x
0 1
现在假设您有uniform vec4 colour1
和uniform vec4 colour2
分别定义点 1 和 2 的颜色。然后将这些混合起来很简单:取f
分数colour2
和1-f
分数colour1
并将它们加在一起。GLSLmix
函数正是这样做的。