5

我正在尝试制作如下图右侧的三角形:

三角形

问题是我想要实现的是来自 C 的顶点 1 和 2 的颜色渐变。

据我所知,这是不可能的,因为顶点 C 必须有自己的颜色,它也会混合成 1 和 2 的颜色,就像图片的左三角形一样。如果我将 C 设置为中间点颜色,则会产生不希望的结果,因为三角形越高,其他顶点的颜色就越不明显。

C1 线应为黑色,C2 线应为白色。

有没有办法在OpenGL中实现这一点?

4

1 回答 1

6

有两种方法,但我不知道哪种方法对您的应用程序最有意义。在非常高的水平上:

  1. 将纹理映射到三角形。由于渐变非常平滑,它不需要非常高的分辨率,您可以让线性过滤为您完成工作。

  2. 使用着色器。设置更多工作,但也更灵活,并在任何比例/分辨率下为您提供“完美”的结果。


更新:如果你要使用着色器,想法如下。

将 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 colour1uniform vec4 colour2分别定义点 1 和 2 的颜色。然后将这些混合起来很简单:取f分数colour21-f分数colour1并将它们加在一起。GLSLmix函数正是这样做的。

于 2013-04-08T09:12:10.540 回答