1
我的立方体看起来像这样(的房子)后,我试图用glnormal的照明。如果我摆脱glDepthFunc(GL_ALWAYS);如果我摆脱了glnormal,那么它很好,那么它也很好,不知道这里发生了什么。
还有一个问题,在我使用glDepthFunc(GL_ALWAYS)之后,我尝试添加其他的东西,我翻译了z轴坐标后面的房子,但我仍然看到它?我误解了深度测试吗?
初始设置
glEnable(GL_LIGHTING);
GLfloat light[] = {1,1,1,1};
GLfloat light_position[] = {20,20,-5,1};
glLightfv(GL_LIGHT0,GL_DIFFUSE,light);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glEnable(GL_LIGHT0);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_FRONT_AND_BACK);
// Draw stuff
drawbackground();
glDepthFunc(GL_ALWAYS);
绘制立方体
void Cube::walk_gl(){
double xx = 0.0, yy=0.0;
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glNormal3d(0, 0, -1);
glVertex3d(xx, yy, 1.0);
glVertex3d(xx+1.0, yy, 1.0);
glVertex3d(xx+1.0, yy+1.0, 1.0);
glVertex3d(xx, yy+1.0, 1.0);
glNormal3d(0, 0, 1);
glVertex3d(xx, yy, 0.0);
glVertex3d(xx+1.0, yy, 0.0);
glVertex3d(xx+1.0, yy+1.0, 0.0);
glVertex3d(xx, yy+1.0, 0.0);
glNormal3d(0, -1, 0);
glVertex3d(xx, yy, 0.0);
glVertex3d(xx+1.0, yy, 0.0);
glVertex3d(xx+1.0, yy, 1.0);
glVertex3d(xx, yy, 1.0);
glNormal3d(0, 1, 0);
glVertex3d(xx, yy+1.0, 0.0);
glVertex3d(xx+1.0, yy+1.0, 0.0);
glVertex3d(xx+1.0, yy+1.0, 1.0);
glVertex3d(xx, yy+1.0, 1.0);
glNormal3d(-1, 0, 0);
glVertex3d(xx, yy, 0.0);
glVertex3d(xx, yy+1.0, 0.0);
glVertex3d(xx, yy+1.0, 1.0);
glVertex3d(xx, yy, 1.0);
glNormal3d(1, 0, 0);
glVertex3d(xx+1.0, yy, 0.0);
glVertex3d(xx+1.0, yy+1.0, 0.0);
glVertex3d(xx+1.0, yy+1.0, 1.0);
glVertex3d(xx+1.0, yy, 1.0);
glEnd();
}
?这基本上意味着无论你最后画的是什么,都可以看到,而不管它的深度或其他任何东西在它之前。通常你想使用'GL_LESS'或'GL_LEQUAL',这样只会显示比你已经绘制的更接近你的像素。此外,'GL_FRONT_AND_BACK'不是'glCullFace(...)'的有效枚举。如果你要剔除双方,你可能不会画任何东西;) –
我不知道GL_ALWAYS是否这样做......但我在屏幕上还有其他东西,我试着把它放在房子前面,我改变了Z坐标,但它变得更大,并且它永远不会在房子前面得到 – cakester
@ AndonM.Coleman:[''glCullFace()'](http://www.opengl.org/sdk/docs/man2/xhtml/ glCullFace.xml)被记录为接受'GL_FRONT_AND_BACK'。正如你所指出的那样,它是无用的,但完全有效。 – genpfault