OpenGL上的三角形渐变

Leo*_*Leo 5 opengl gradient vertex-array

我想尝试制作一个像下图中右边的三角形:

三角形

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

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

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

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

Tho*_*mas 6

有两种方法,但我不知道哪种方式对您的应用程序最有意义.在很高的水平:

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

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


更新:如果您要使用着色器,那么想法如下.

将a varying vec2 coords从顶点着色器传递到片段着色器.将点1的值设置为0,0,对于点2 1,0,将点C设置为0,1.要将这些值放入顶点着色器,请使用attribute.变化的值将在三角形内插,就像纹理坐标和颜色一样.所以coords变量映射到你的三角形,如下所示:

y
1 +-----+
  |\    |
  |#\   |
  |##\  |
  |###\ |
  |####\|
0 +-----+ x
  0     1
Run Code Online (Sandbox Code Playgroud)

片段着色器coords在散列区域内的某处接收值.为了弄清楚多少每次需要相融合,通过计算行的颜色coords0,1,并发现其与相交x线.由于的坐标系统coords,这是一个简单的操作:简单地划分coords.xcoords.y.叫这个f.(请注意,这将在C点给出除零,但这是预期的,因为您从未在那里定义颜色.如果需要,可以在着色器中明确检查.)

指示coordsc和表示与线.字符,f某处0和1之间结束:

y
1 +-----+
  |\    |
  |.\   |
  |#c\  |
  |#.#\ |
  |##.#\|
0 +--f--+ x
  0     1
Run Code Online (Sandbox Code Playgroud)

现在,让我们说你有uniform vec4 colour1,并uniform vec4 colour2以点1和2,分别定义颜色.然后将这些混合起来很简单:取一f小部分colour21-f一部分colour1并将它们加在一起.GLSL mix功能就是这样做的.