2012-07-11 101 views
0

我正试图在屏幕上绘制一个四边形(方形)。我把它插入一个预先存在的程序中,画出一个圆柱体。这是在一个正交模型视图矩阵中,我几乎肯定剪辑音量是正确的(从原点的任何方向都是200)。在我使用的显示函数中,我推送了一个矩阵,向前翻译(0.0,0.0,-20.0),称为quadriliteral,然后弹出矩阵。任何常见的openGL设置的人使用,我不知道这可能会使这不可见?有没有办法获得当前裁剪卷并在控制台中打印出来?OpenGL四边形不被绘制

void quadrilateral() 
{ 
    glLoadIdentity(); 
    glColor3f(0.5f,0.0f,0.8f); 
    glBegin(GL_QUADS); 

    glVertex3f(-10.0f,-10.0f,0.0f); 
    glVertex3f(-10.0f,10.0f,0.0f); 
    glVertex3f(10.0f,10.0f,0.0f); 
    glVertex3f(10.0f,-10.0f,0.0f); 

    glEnd(); 
} 


//This is called from a main function elsewhere 
void draw(void) 
{ 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Cylinder"); 
    glutReshapeFunc(CChangeSize); 
    glutSpecialFunc(CSpecialKeys); 
    glutKeyboardFunc(Ckeyboard); 
    glutDisplayFunc(CRenderScene); 
    CSetupRC(); 
    glPopMatrix(); 
} 


void CSetupRC() 
{ 
// Light values and coordinates 
GLfloat ambientLight[] = {0.4f, 0.4f, 0.4f, 1.0f }; 
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f }; 
GLfloat specular[] = { 0.9f, 0.9f, 0.9f, 1.0f}; 
GLfloat lightPos[] = { -50.0f, 200.0f, 200.0f, 1.0f }; 
GLfloat specref[] = { 0.6f, 0.6f, 0.6f, 1.0f }; 


glEnable(GL_DEPTH_TEST); // Hidden surface removal 
glEnable(GL_CULL_FACE);  // Do not calculate inside of solid object 
glFrontFace(GL_CCW); 

// Enable lighting 
glEnable(GL_LIGHTING); 

// Setup light 0 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight); 
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); 
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); 
glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 

// Position and turn on the light 
glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
glEnable(GL_LIGHT0); 

// Enable color tracking 
glEnable(GL_COLOR_MATERIAL); 

// Set Material properties to follow glColor values 
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

// All materials hereafter have full specular reflectivity 
// with a moderate shine 
glMaterialfv(GL_FRONT, GL_SPECULAR,specref); 
glMateriali(GL_FRONT,GL_SHININESS,64); 

// Black background 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable(GL_TEXTURE_2D); 

} 


// Called to draw scene 
void CRenderScene(void) 
{ 
// Clear the window with current clearing color 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// Save the matrix state 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// Rotate about x and y axes 
glRotatef(CxRot, 1.0f, 0.0f, 0.0f); 
glRotatef(CyRot, 0.0f, 1.0f, 0.0f); 

// Draw the cylinder 
cylinder(); 

glPopMatrix(); 

// CylinderTwo 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// Rotate about x and y axes 
glRotatef(CxRot, 1.0f, 0.0f, 0.0f); 
glRotatef(CyRot, 0.0f, 1.0f, 0.0f); 

// Draw the cylinder 
glRotatef(120.0f, 1.0f, 1.0f, 1.0f); 
cylinderTwo(); 

glPopMatrix(); 

// Random square 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glTranslatef(-30.0f,20.0f,10.0f); 
quadrilateral(); 
glPopMatrix(); 

// Swap buffers 
glutSwapBuffers(); 

}

+0

你可以继续发布所有相关的OpenGL初始化代码吗? (如果您不熟悉网站,请在您的帖子中查找编辑按钮)。大约有100种不同的方式可以让你搞砸,所以如果我们不需要猜测的话,这可能是最好的。欢迎来到SO。 – Tim 2012-07-11 16:07:25

+0

当然,它很长,但我会尽量保持它的短暂 – user1515657 2012-07-11 16:08:51

+0

不要让它超过它所需的时间,但如果你不确定是否有什么重要的话,就会在臃肿的一边犯错。 – Tim 2012-07-11 16:14:08

回答

1

它看起来像你的缠绕顺序不正确:

glEnable(GL_CULL_FACE); 

此行意味着将剔除背面。

glFrontFace(GL_CCW); 

这使得正面逆时针方向。

glVertex3f(-10.0f,-10.0f,0.0f); 
    glVertex3f(-10.0f,10.0f,0.0f); 
    glVertex3f(10.0f,10.0f,0.0f); 
    glVertex3f(10.0f,-10.0f,0.0f); 

在这里,您有顺时针顺序排列的顶点,这意味着您正在使用背面进行相机绘制。或者禁用扑杀:

glDisable(GL_CULL_FACE); 

使前脸顺时针:

glFrontFace(GL_CW); 

或更改顶点的顺序为逆时针顺序。

+0

我尝试了以上所有,但唉,它仍然不会出现:(肯定还有其他东西是错误的 – user1515657 2012-07-11 17:15:26

+0

等我得到它的工作,非常感谢! – user1515657 2012-07-11 17:18:34

0

看来,我认为你的四向后缠绕。你已经启用了GL_CULL_FACE,它会抛出任何顺时针缠绕的多边形,并且你的四边形有顺时针缠绕。

禁用背面剔除或将顶点的顺序逆时针切换。

+0

还在工作,其他东西一定是错的 – user1515657 2012-07-11 17:17:48

+0

只是在开玩笑,我现在开始工作了。谢谢你的帮助! – user1515657 2012-07-11 17:18:52