Opengl es OpenGL ES GL_三角形渐变问题

Opengl es OpenGL ES GL_三角形渐变问题,opengl-es,glkit,Opengl Es,Glkit,我试图画一个有梯度的面积图。这就是我现在拥有的 如果你看红绿色的图形,你会注意到渐变不是它应该的样子 编辑:渐变应该是均匀的,如下所示: 我正在使用OpenGLES2.0和GLKit绘制一系列图表。图表是使用GL_三角形绘制的。我知道问题是每个三角形的梯度是单独绘制的 我能想到的唯一方法是使用模具缓冲区。我将画一个大矩形的梯度,并剪辑到这个形状使用模具。有更好的方法吗?如果没有,你能帮我画一个有指定点的模板吗?我是OpenGL新手,对使用模具缓冲区没有很好的解释。OpenGL ES可以做你想

我试图画一个有梯度的面积图。这就是我现在拥有的

如果你看红绿色的图形,你会注意到渐变不是它应该的样子

编辑:渐变应该是均匀的,如下所示:

我正在使用OpenGLES2.0和GLKit绘制一系列图表。图表是使用GL_三角形绘制的。我知道问题是每个三角形的梯度是单独绘制的


我能想到的唯一方法是使用模具缓冲区。我将画一个大矩形的梯度,并剪辑到这个形状使用模具。有更好的方法吗?如果没有,你能帮我画一个有指定点的模板吗?我是OpenGL新手,对使用模具缓冲区没有很好的解释。

OpenGL ES可以做你想做的事情,但你需要增加模型的细分。换句话说,不只是使用几个大三角形,而是需要更多更小的三角形,顶点颜色的变化均匀地分布在这些三角形上。这样可以更好地控制渐变。三角形在加速的OpenGL ES上很便宜,因此即使将该数字增加100倍,也不会对性能产生太大影响


你也可以考虑一种不同的方法,其中整个图形由包含渐变的单一纹理覆盖。这将更容易实现。

您不需要模具缓冲区。我也不认为更多的三角形会有帮助——更可能的是,这只会让你更加困惑,因为你会为中间顶点指定逐顶点颜色,并且必须自己插值它们

您的渐变就是这样出现的,因为您为插值指定顶点颜色的方式和位置。请注意您的输出和您要查找的示例之间的颜色差异:

在图的上边缘的每个顶点上都有100%的红色,在下边缘的每个顶点上都有100%的绿色。OpenGL在每个三角形的面上线性插值颜色,这就是为什么图形的较短部分会有更多的红色

在您要查找的输出中,图的顶部在较短的部分开始时红色较少,因此它在较短的距离内进行较短的白色过渡

有几种不同的方法可以做到这一点,但可能最简单的方法(对于使用
glkbaseffect
而不是编写自己的着色器的计划)可能是为渐变使用1D纹理,并为每个顶点指定一个纹理坐标,该坐标与其在图形上的Y坐标成比例,如下所示:

(我的图表中的示例坐标假定图形顶点覆盖范围为0.0到1.0,但该点始终存在:每个点的垂直纹理坐标应为图形总高度的一小部分,介于0.0和1.0之间。)


或者,您可以分两步进行绘制:首先,绘制图形的形状,然后使用适当的
glBlendFunc
绘制一个四元(两个三角形),用渐变覆盖整个屏幕,以便它仅绘制您用图形形状填充的区域

我没有注意到梯度看起来不是它应该的样子,因为我不知道它应该是什么样子。如果您能澄清这一点,我们将能更好地提供帮助。@rickster:用一幅示例图片更新。您对图表中各种“峰值”的颜色强度的解释非常有意义,谢谢您的努力。我有一个想法,这可能是问题所在,但考虑到我在核心图形方面的经验,我认为解决方案很简单。我将尝试两种你建议的解决方案。好的,第二种方法可以奏效。对于任何尝试此方法的人,我使用的混合函数是:glBlendFunc(GL_DST_ALPHA,GL_ZERO);即使我把形状分成更小的三角形,每个小三角形都会被单独着色,这不是同样的问题吗?