OpenGL 和 C++:glBegin/glEnd

Posted

技术标签:

【中文标题】OpenGL 和 C++:glBegin/glEnd【英文标题】:OpenGL & C++ : glBegin/glEnd 【发布时间】:2013-06-22 20:18:04 【问题描述】:
          glBegin(GL_TRIANGLE_STRIP);
        for(i; i <= degree; i++)
        
            float 
            sunX=-200/2*cos(i*M_PI/180),
            sunZ=200/2*sin(i*M_PI/180);

            glVertex3f(0, 0, 0);
            glVertex3f(sunX, 0, sunZ);
        
        glEnd();

此代码有效。但是……

for(i; i <= degree; i++)
        
            float 
            sunX=-200/2*cos(i*M_PI/180),
            sunZ=200/2*sin(i*M_PI/180);
                            glBegin(GL_TRIANGLE_STRIP);
            glVertex3f(0, 0, 0);
            glVertex3f(sunX, 0, sunZ);
                            glEnd();
        

但这不起作用。什么?逻辑在哪里? 我需要在 for 循环中插入另一个代码以输出文本:

glPushAttrib(GL_LIST_BIT);
glListBase(1000);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();

但我不能插入它,因为 beetwen glBegin(GL_TRIANGLE_STRIP) 和 glEnd() 它不起作用。而且我不能在里面写 glBegin(GL_TRIANGLE_STRIP), glEnd() 循环,因为它在那里不起作用。

【问题讨论】:

使用vertex arrays 不要使用 glBegin/glEnd 和旧管道的其余部分......这不再是一个好习惯...... 【参考方案1】:

每次您拨打glBegin(GL_TRIANGLE_STRIP); 时,您都在开始一个全新的三角带。它不会连接到之前 for 循环迭代中的其他顶点。

【讨论】:

【参考方案2】:

来自glBegin的文档

"... 不绘制未完全指定的线、三角形、四边形和多边形。如果提供的顶点太少而无法指定单个图元,或者指定的顶点倍数不正确,则会导致指定不完整​​。不完整的图元被忽略;其余的被绘制。..."

您需要指定 glBegin/glEnd 对之间的最小顶点数;该数字取决于您提供给 glBegin 的参数。

    GL_POINTS:1 GL_LINESGL_LINE_*:2 GL_TRIANGLESGL_TRIANGLE_*:3 GL_QUADSGL_QUAD_*:4

【讨论】:

以上是关于OpenGL 和 C++:glBegin/glEnd的主要内容,如果未能解决你的问题,请参考以下文章

如何开始在 openGL 和 C++ 中构建cooliris?

如何检测与 C++、OpenGL 和 freeglut 的冲突?

将 SDL 示例移植到 OpenGL 和 C++

C++ 和 OpenGL 帮助 [关闭]

c++ 和 OpenGl:如何从类中创建网格对象实例

OpenGL 和 C++:glBegin/glEnd