基于顶点的openGL中具有不同颜色的三角形的平面着色
Flat Shading of Triangles with different colors in openGL based on vertices
我是 openGL 的新手。现在,我想绘制一个 3D 三角形,其中填充了不同颜色的图案。但是我没有得到具有独特图层的颜色。所有颜色都被插值。
我还在下面附上了预期输出的图像,并获得了上述过程的输出。
如果我用了glShadeModel (GL_SMOOTH);
根据获得的输出图像对颜色进行插值。
如果glShadeModel (GL_FLAT);
我给最后一个顶点的颜色,例如说蓝色,整个三角形都充满了蓝色。
谁能帮我解决这个问题。如果我有任何建议,这对我很有帮助。顶点和片段着色器是解决这个问题的更好方法吗?我对顶点和片段着色器没有足够的了解。
这就是我现在用来画那个三角形的方法。
代码:
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
您在 OpenGL 中尝试了两种不同的模式。在其中一种模式下,它将在您绘制的多边形的顶点之间插入颜色。在另一种模式下,它只会对整个多边形使用相同的平面颜色。
您将整个多边形填充为蓝色的原因是您要求 OpenGL 绘制单个单色多边形。
根据您的预期输出图像判断,您需要让 OpenGL 绘制多个单色多边形;每种颜色一个。即需要多次调用glBegin/glEnd
在面向未来的新开发方面,我肯定会考虑使用 OpenGL ES 2.x 并使用着色器。 OpenGL ES 1.x 实际上是一种死胡同的技术,有一些较大的局限性,较新的 API 解决了这些局限性。
在片段着色器中,您可以使用 flat
关键字注释输入变量,这将使用激发顶点的顶点值进行切换,而不是从所有贡献的顶点进行插值。然而,这需要 OpenGL ES 3.x 之后的版本——它在 OpenGL ES 2.x.
中不受支持
在 OpenGL ES 2.x 及更早版本中,我认为您实际上需要复制顶点 - 即,如果所有三个输入都具有相同的值,则插值实际上是空操作。这显然会显着增加顶点处理成本。
我已经解决了这个问题,对我来说效果很好。我没有使用任何着色器 program.Please 请参阅此问题以获取答案。
使用 OpenGL 在 QT 中计算 2 点之间线性插值的最快方法
我是 openGL 的新手。现在,我想绘制一个 3D 三角形,其中填充了不同颜色的图案。但是我没有得到具有独特图层的颜色。所有颜色都被插值。
我还在下面附上了预期输出的图像,并获得了上述过程的输出。
如果我用了glShadeModel (GL_SMOOTH);
根据获得的输出图像对颜色进行插值。
如果glShadeModel (GL_FLAT);
我给最后一个顶点的颜色,例如说蓝色,整个三角形都充满了蓝色。
谁能帮我解决这个问题。如果我有任何建议,这对我很有帮助。顶点和片段着色器是解决这个问题的更好方法吗?我对顶点和片段着色器没有足够的了解。 这就是我现在用来画那个三角形的方法。 代码:
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
您在 OpenGL 中尝试了两种不同的模式。在其中一种模式下,它将在您绘制的多边形的顶点之间插入颜色。在另一种模式下,它只会对整个多边形使用相同的平面颜色。
您将整个多边形填充为蓝色的原因是您要求 OpenGL 绘制单个单色多边形。
根据您的预期输出图像判断,您需要让 OpenGL 绘制多个单色多边形;每种颜色一个。即需要多次调用glBegin/glEnd
在面向未来的新开发方面,我肯定会考虑使用 OpenGL ES 2.x 并使用着色器。 OpenGL ES 1.x 实际上是一种死胡同的技术,有一些较大的局限性,较新的 API 解决了这些局限性。
在片段着色器中,您可以使用 flat
关键字注释输入变量,这将使用激发顶点的顶点值进行切换,而不是从所有贡献的顶点进行插值。然而,这需要 OpenGL ES 3.x 之后的版本——它在 OpenGL ES 2.x.
在 OpenGL ES 2.x 及更早版本中,我认为您实际上需要复制顶点 - 即,如果所有三个输入都具有相同的值,则插值实际上是空操作。这显然会显着增加顶点处理成本。
我已经解决了这个问题,对我来说效果很好。我没有使用任何着色器 program.Please 请参阅此问题以获取答案。 使用 OpenGL 在 QT 中计算 2 点之间线性插值的最快方法