2016-10-29 93 views
0

我目前正在学习OpenGL和从我的理解,我有画线之前调用(OpenGL的)绘制直线,但形状不

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

。然后,要绘制形状,我需要调用

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

绘制形状,如GL_TRIANGLES和GL_QUADS。 我写了这段代码,其目的是在顶部绘制一条线和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_PROJECTION和GL_MODELVIEW以及它们如何工作之间切换?

+1

您使用了弃用的固定功能API。我强烈建议你转向OpenGL 4.5,这将解决问题。 – ybungalobill

+2

为了加速学习,您应该了解有关窗口及其坐标,OpenGL视口,NDC和剪辑空间的更多信息。你不会通过编码正确学习OpenGL,并看看会发生什么。祝你好运。 – Andreas

回答

2

您的多边形的Z值为-5.0,它在设备坐标的默认[-1,1]范围之外,因此它们会被丢弃。

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

+0

“剔除”在这里是一个不幸的术语。在OpenGL术语中,剔除是指根据它们的排列顺序来消除多边形。在这种情况下会发生什么叫做“裁剪”。 –

+0

@ReetoKoradi:你错了。阅读OpenGL 4.5规范部分'13 .5原始剪辑':“原始图像被剔除,然后剪切到剪辑卷” – ybungalobill

+0

好吧,从技术上讲,OpenGL规范在这种情况下使用动词“丢弃”(因为剔除卷涉及到这里)。但是,通常“剔除”是指丢弃整个基元,而“剪切”是指用较小的基元代替基元。所以在这两者中,更多的是“剔除”而不是“裁剪”。不过我会将其与OpenGL术语对齐。 – ybungalobill