基于顶点的openGL中具有不同颜色的三角形的平面着色

时间:2018-06-14 12:08:12

标签: opengl-es fragment-shader vertex-shader

我是openGL的新手。现在,我想在3D中绘制一个三角形,其中填充了不同的颜色图案。但我没有获得具有独特图层的颜色。所有颜色都被插值。

下面我还附上了预期输出的图像,并获得了上述过程的输出。

如果我使用glShadeModel (GL_SMOOTH);

根据获得的输出图像对颜色进行插值。

如果glShadeModel (GL_FLAT);

我为最后一个顶点给出的颜色,例如说蓝色,整个三角形用蓝色填充。

任何人都可以帮我解决这个问题。如果我有任何建议,对我很有帮助。顶点和片段着色器是解决此问题的更好方法吗?我对顶点和片段着色器知之甚少。 这是我用来画那个traingle的方法。 代码:

glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3d(a1,b1,c1);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3d(a2,b2,c2);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3d(a3,b3,c3);
glEnd();
glFlush();

expected output

Obtained output

3 个答案:

答案 0 :(得分:0)

您在OpenGL中尝试了两种不同的模式。在其中一种模式中,它将在您绘制的多边形的顶点之间插入颜色。在另一种模式中,它将仅对整个多边形使用相同的平面颜色。

您要使整个多边形填充蓝色的原因是您要求OpenGL绘制单个单色多边形。

根据您对预期输出的图像判断,您需要让OpenGL绘制多个单色多边形;每种颜色一个。也就是说,你需要多次调用glBegin / glEnd。

答案 1 :(得分:0)

在面向未来的新开发方面,我肯定会考虑使用OpenGL ES 2.x并使用着色器。 OpenGL ES 1.x实际上是一种死端技术,新的API解决了一些很大的局限性。

在片段着色器中,您可以使用flat关键字注释输入变化,该关键字将使用来自激发顶点的顶点值进行切换,而不是从所有贡献顶点进行插值。但是,这需要OpenGL ES 3.x以上 - OpenGL ES 2.x不支持它。

在OpenGL ES 2.x及更早版本中,我认为您实际上需要复制顶点 - 即如果所有三个输入具有相同的值,则插值实际上是无操作。这显然会显着增加顶点处理成本。

答案 2 :(得分:0)

我已经解决了这个问题,对我来说很好。我没有使用任何着色器程序。请参考此问题的答案。 Fastest Method to compute Linear interpolation between 2 points in QT using OpenGL