【问题标题】:Flat Shading of Triangles with different colors in openGL based on vertices基于顶点的openGL中不同颜色三角形的平面着色
【发布时间】:2018-06-14 12:08:12
【问题描述】:

我是 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-es fragment-shader vertex-shader


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@flodin。你能告诉我如何多次调用 glbegin 和 glend 吗?如果您有任何示例或任何链接,请分享。是否可以使用 GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_FAN 等原始类型来绘制它,而不是使用 openGL ES 2.x、3.x??
    • 我不确定您对什么感到困惑。你肯定知道如何调用一个函数两次吗?复制粘贴您的 glBegin()/glEnd() 块并对其进行修改以在您想要的位置呈现第二个多边形。
    • 我不想要第二个多边形。我只想在不使用着色器的情况下为具有超过 1 种颜色的单个多边形着色,如预期输出所示。如何告诉openGL画一个这样的三角形?
    • 我明白,但您需要用多个多边形构建它,每个多边形都有一个纯色,它们连接在一起看起来像一个多边形。
    【解决方案2】:

    就面向未来的新开发而言,我肯定会考虑使用 OpenGL ES 2.x 及更高版本并使用着色器。 OpenGL ES 1.x 实际上是一种死胡同技术,新的 API 解决了一些较大的限制。

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

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

    【讨论】:

    • 感谢您的宝贵建议。如果可能,您能否分享一些代码或任何有用的链接,以指导我以正确的方式学习 OpenGL ES 3.x ? @solidpixel
    • 这是一个很大的话题,但只需搜索 OpenGL ES 2.x 或 3.x 教程。网上有很多。如果您喜欢论文参考,“OpenGL ES 3.0 编程指南”也很好。
    【解决方案3】:

    我已经解决了这个问题,它对我来说工作正常。我没有使用任何着色器程序。请参考这个问题以获得答案。 Fastest Method to compute Linear interpolation between 2 points in QT using OpenGL

    【讨论】:

    • 你自己可以在这里解释一些事情。
    • @HarshWardhan 我已经完成了顶点之间的线性插值,并根据颜色分离了中间点。分离后,我将每个点复制到顶点和颜色缓冲区,然后用它们在屏幕上绘制。因为我要处理更多的三角形,所以我在 openGL 中使用 retained 模式 来获得更好的性能,而不是使用立即模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多