(OpenGL)绘制了线,但未绘制形状

(OpenGL)绘制了线,但未绘制形状,opengl,Opengl,我目前正在学习OpenGL,根据我的理解,我不得不打电话给 glMatrixMode(GL_PROJECTION); glLoadIdentity(); 在画线之前。然后,要画形状,我需要打电话 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); 绘制形状,如GL_三角形和GL_四边形。 我写这段代码的目的是在顶部画一条线和3个形状,但只画了一条线。 这是我的密码 void drawScene() { //Clear information from

我目前正在学习OpenGL,根据我的理解,我不得不打电话给

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
在画线之前。然后,要画形状,我需要打电话

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
绘制形状,如GL_三角形和GL_四边形。 我写这段代码的目的是在顶部画一条线和3个形状,但只画了一条线。 这是我的密码

void drawScene() {
//Clear information from last draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective



glBegin(GL_LINES);

glColor3f(100,200,100);
glLineWidth(10.0f);
glVertex2f(-1.0f,0.8f);
glVertex2f(1.0f,0.8f);

glEnd();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_QUADS); //Begin quadrilateral coordinates

//Trapezoid
glVertex3f(-0.7f, -1.5f, -5.0f);
glVertex3f(0.7f, -1.5f, -5.0f);
glVertex3f(0.4f, -0.5f, -5.0f);
glVertex3f(-0.4f, -0.5f, -5.0f);

glEnd(); //End quadrilateral coordinates


glBegin(GL_TRIANGLES); //Begin triangle coordinates

//Pentagon
glVertex3f(0.5f, 0.5f, -5.0f);
glVertex3f(1.5f, 0.5f, -5.0f);
glVertex3f(0.5f, 1.0f, -5.0f);

glVertex3f(0.5f, 1.0f, -5.0f);
glVertex3f(1.5f, 0.5f, -5.0f);
glVertex3f(1.5f, 1.0f, -5.0f);

glVertex3f(0.5f, 1.0f, -5.0f);
glVertex3f(1.5f, 1.0f, -5.0f);
glVertex3f(1.0f, 1.5f, -5.0f);

//Triangle
glVertex3f(-0.5f, 0.5f, -5.0f);
glVertex3f(-1.0f, 1.5f, -5.0f);
glVertex3f(-1.5f, 0.5f, -5.0f);

glEnd(); //End triangle coordinates

glutSwapBuffers(); //Send the 3D scene to the screen
}

有人能给我解释一下如何在GL_投影和GL_MODELVIEW之间切换以及它们是如何工作的吗?

多边形的Z值是
-5.0
,它超出了设备坐标的默认[-1,1]范围,因此它们会被丢弃


将所有
glVertex3f(x,y,z)
调用替换为
glVertex2f(x,y)

您使用的是不推荐使用的固定函数API。我强烈建议您转到OpenGL 4.5,这将解决问题。为了加快您的学习,您应该进一步了解窗口及其坐标、OpenGL视口、NDC和剪辑空间。通过编码,您将无法正确地学习OpenGL并了解会发生什么。祝你好运,“被淘汰”在这里是个不幸的词。在OpenGL术语中,消隐是指根据多边形的缠绕顺序消除多边形。这种情况下发生的事情叫做“剪辑”。@RetoKoradi:你错了。阅读OpenGL 4.5规范“13.5原语剪裁”部分:“原语根据剪裁体积剪裁,然后剪裁到剪裁体积”好的,从技术上讲,OpenGL规范在这种情况下使用动词“discard”(因为此处不涉及剪裁体积)。然而,通常“剔除”指的是删除整个原语,而“剪裁”指的是用较小的原语替换原语。因此,在这两者中,更多的是“剔除”而不是“剪裁”。不过我还是会将其与OpenGL术语对齐。我明白了,您在4.5规范中发现了一些新的内容,而我对它并不熟悉。这是将ARB_cull_距离扩展推广到core时引入的一个新的全基元剔除特性。在4.5之前的规范中,您不会发现任何这种语言。丢弃视图体积外的几何体始终称为剪裁,现在仍然如此。