未绘制OpenGL四边形
我试图在屏幕上画一个四边形(正方形)。我将其插入到一个预先存在的程序中,该程序绘制了一个圆柱体。这是在正交模型视图矩阵中,我几乎可以肯定剪裁体积是正确的(从原点到任意方向都是200)。在我使用的显示函数中,我按下一个矩阵,向前转换(0.0,0.0,-20.0),称为quadriliteral,然后弹出该矩阵。我不知道人们使用的任何常见openGL设置是否会使其不可见?有没有办法获取当前剪辑卷并在控制台中打印出来未绘制OpenGL四边形,opengl,3d,drawing,Opengl,3d,Drawing,我试图在屏幕上画一个四边形(正方形)。我将其插入到一个预先存在的程序中,该程序绘制了一个圆柱体。这是在正交模型视图矩阵中,我几乎可以肯定剪裁体积是正确的(从原点到任意方向都是200)。在我使用的显示函数中,我按下一个矩阵,向前转换(0.0,0.0,-20.0),称为quadriliteral,然后弹出该矩阵。我不知道人们使用的任何常见openGL设置是否会使其不可见?有没有办法获取当前剪辑卷并在控制台中打印出来 void quadrilateral() { glLoadIdentity
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();
}我看你的四线组是向后缠绕的。您已经启用了GL_CULL_FACE,它会抛出任何顺时针缠绕的多边形,并且您的四边形具有顺时针缠绕
禁用背面消隐,或将顶点顺序切换为逆时针方向。看起来缠绕顺序不正确:
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);
或者将顶点的顺序更改为逆时针顺序。能否继续并发布所有相关的OpenGL初始化代码?(如果您不熟悉网站,请在帖子上查找编辑按钮)。有大约100种不同的方式可以让你陷入困境,所以如果我们不必猜测,这可能是最好的。欢迎来到SO。当然,它很长,但我会尽量缩短。不要让它比需要的长,但如果你不确定某件事是否重要,那就错在分享过度。我尝试了上述所有方法,但可惜,它仍然不会出现:(一定还有其他问题