You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用glBegin(GL_QUADS)绘制风筝却渲染出三角形的问题咨询及解决方法求助

使用glBegin(GL_QUADS)绘制风筝却渲染出三角形的问题咨询及解决方法求助

一、为啥会渲染出三角形呀?

其实核心问题出在顶点顺序和图元类型不匹配上:
你用glBegin(GL_QUADS)时传入的四个顶点顺序是A(0,-1) → B(-1,1) → O(0,0) → C(1,1),但这个序列根本构不成GL_QUADS要求的「有效凸四边形」。
OpenGL的固定管线对GL_QUADS的规则很死板:它要求4个顶点必须是连续的顺时针/逆时针顺序,刚好围出一个凸的四边形。而你现在的顶点连起来是A→B→O→C→A,这是个凹的“箭头”形状,OpenGL没法把它识别成正经四边形,只能容错性地渲染出一部分,也就是你看到的三角形。
另外看你的错误检测代码,如果没输出报错信息,那说明OpenGL没抛错——它只是默默处理了无效输入,给了你不符合预期的结果而已。

二、glBegin(GL_QUADS)到底是怎么工作的?

给你掰碎了说:
glBegin(GL_QUADS)是OpenGL老版本固定管线里用来画四边形的启动命令,它的规则就两条:

  1. glBeginglEnd之间的顶点,会每4个分成一组,每组对应一个四边形
  2. 每组里的4个顶点必须按「顺时针/逆时针依次绕四边形一圈」的顺序传,OpenGL会自动把它们连成顶点1→顶点2→顶点3→顶点4→顶点1的闭合图形并填充
    还有两个要注意的点:要是顶点总数不是4的倍数,多出来的直接忽略;而且它只认凸四边形,凹的、自相交的形状根本画不出来,得拆成三角形才行。

三、怎么改RenderQuad才能画出想要的风筝?

分两种情况给你解决方案,看你实际想画哪种风筝:

如果你要画的是中心为O(0,0)的风筝(顶点A、B、C、O)

这个形状本质是两个拼起来的三角形,没法用GL_QUADS直接画,得换成GL_TRIANGLES图元,分别画两个三角形:

//Render kite
glBegin(GL_TRIANGLES);
// 第一个三角形:底部A → 左上B → 中心O
glVertex2dv(A);
glVertex2dv(B);
glVertex2dv(O);
// 第二个三角形:底部A → 中心O → 右上C
glVertex2dv(A);
glVertex2dv(O);
glVertex2dv(C);
glEnd();

如果你笔误把O点写成了中心,实际想画顶部顶点为(0,1)的菱形风筝

那你先修正O点的坐标,再调整顶点顺序,就能用GL_QUADS正确渲染了:

// 把O点改成顶部顶点(0,1)
GLdouble O[] = {0, 1};
//Render kite
glBegin(GL_QUADS);
// 按顺时针顺序传四个顶点:底部→左上→顶部→右上
glVertex2dv(A);
glVertex2dv(B);
glVertex2dv(O);
glVertex2dv(C);
glEnd();

调试的时候,你还可以加个打印语句把每个顶点的坐标输出来,确认位置和顺序是不是你想要的,这样更容易排查问题~

内容来源于stack exchange

火山引擎 最新活动