使用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老版本固定管线里用来画四边形的启动命令,它的规则就两条:
- 从
glBegin到glEnd之间的顶点,会每4个分成一组,每组对应一个四边形 - 每组里的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




