首先,我定义了一个表达金字塔协调的结构:
typedef struct
{
GLfloat xUp;
GLfloat yUp;
GLfloat zUp;
GLfloat base;
GLfloat height;
}pyramid;
这里很明显:我存储了最高点,底座和高度的坐标 我写了一个绘制金字塔的函数:
void drawPyramid(pyramid pyr)
{
GLfloat p1[]= {pyr.xUp+pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp-pyr.base/2.0};
GLfloat p2[]= {pyr.xUp+pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp+pyr.base/2.0};
GLfloat p3[]= {pyr.xUp-pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp+pyr.base/2.0};
GLfloat p4[]= {pyr.xUp-pyr.base/2.0, pyr.yUp-pyr.height, pyr.zUp-pyr.base/2.0};
GLfloat up[]= {pyr.xUp, pyr.yUp, pyr.zUp};
glBegin(GL_TRIANGLES);
glColor4f(1.0, 0.0, 0.0, 0.0);
glVertex3fv(up);
glVertex3fv(p1);
glVertex3fv(p2);
glColor4f(0.0, 1.0, 0.0, 0.0);
glVertex3fv(up);
glVertex3fv(p2);
glVertex3fv(p3);
glColor4f(0.0, 0.0, 1.0, 0.0);
glVertex3fv(up);
glVertex3fv(p3);
glVertex3fv(p4);
glColor4f(1.0, 1.0, 0.0, 0.0);
glVertex3fv(up);
glVertex3fv(p4);
glVertex3fv(p1);
glEnd();
glColor4f(0.0, 1.0, 1.0, 0.0);
glBegin(GL_QUADS);
glVertex3fv(p1);
glVertex3fv(p2);
glVertex3fv(p3);
glVertex3fv(p4);
glEnd();
}
我努力以逆时针顺序绘制所有顶点,但可能我搞砸了一些东西 这就是我在渲染函数中显示金字塔的方式:
void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0, -25.0, 50.0);
glRotatef(-angle, 0.0, 1.0, 0.0);
glTranslatef(0.0, 25.0, -50.0);
pyramid pyr;
pyr.xUp=0.0;
pyr.yUp=10.0;
pyr.zUp=50.0;
pyr.base=10.0;
pyr.height=18.0;
glColor4f(1.0, 0.0, 0.0, 0.0);
drawPyramid(pyr);
glutSwapBuffers();
}
我还使用在glut主循环之前调用的init方法:
void init()
{
glEnable(GL_DEPTH);
glViewport(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,1.0,0.0, 0.0,1.0,30.0, 0.0,1.0,0.0);
}
角度只是我用来旋转金字塔的两倍,可以通过按“r”来改变,但这是不相关的。看来真正的问题是我如何绘制顶点。
问题是金字塔的面孔看起来很分散,搞砸了。我最好用图像描述这种情况:
有一张太小的脸,显示出来,我不知道为什么 如果我旋转金字塔,它看起来搞砸了,我甚至还记得一段视频来描述这一点 如果问题不完全清楚,我可以上传它。
PS:很多人都注意到我使用的是过时的技术。但不幸的是,这就是我大学提供的。修改
我忘了说主要功能:
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Sierpinsky Pyramid");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
init();
glutMainLoop();
return 0;
}
答案 0 :(得分:3)
看起来深度缓冲区未初始化。
调用glEnable(GL_DEPTH_TEST)
是不够的。您必须正确初始化过剩并指定您需要深度缓冲区支持,否则您将无法获得深度缓冲区。如果我没记错的话,可以使用glutInitDisplayMode(GLUT_DEPTH|...)
完成。请参阅文档here和简介here。可以使用谷歌找到其他信息。
- 编辑 -
您将无效参数传递给glEnable。请致电glEnable(GL_DEPTH_TEST)
而不是glEnable(GL_DEPTH)
。
此外:
OpenGL有文档。文档可在opengl.org上获得。使用它并阅读它。另外,我建议阅读“OpenGL红皮书”。