2013-11-20 25 views
1

enter image description here照明和表面正常的问题与立方体

我的立方体看起来像这样(的房子)后,我试图用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(); 
} 
+1

?这基本上意味着无论你最后画的是什么,都可以看到,而不管它的深度或其他任何东西在它之前。通常你想使用'GL_LESS'或'GL_LEQUAL',这样只会显示比你已经绘制的更接近你的像素。此外,'GL_FRONT_AND_BACK'不是'glCullFace(...)'的有效枚举。如果你要剔除双方,你可能不会画任何东西;) –

+0

我不知道GL_ALWAYS是否这样做......但我在屏幕上还有其他东西,我试着把它放在房子前面,我改变了Z坐标,但它变得更大,并且它永远不会在房子前面得到 – cakester

+0

@ AndonM.Coleman:[''glCullFace()'](http://www.opengl.org/sdk/docs/man2/xhtml/ glCullFace.xml)被记录为接受'GL_FRONT_AND_BACK'。正如你所指出的那样,它是无用的,但完全有效。 – genpfault

回答

0

glCullFace(GL_FRONT_AND_BACK);似乎相当可疑的功能。 GL_FRONT_AND_BACK将丢弃所有面,只允许线和点。

常见的,经典的设置是类似如下:你为什么要使用`GL_ALWAYS`作为深度函数

glEnable(GL_CULL_FACE); //<-- missing 
glCullFace(GL_BACK); 

glEnable(GL_LIGHTING); //<-- missing 
glEnable(GL_LIGHT0); 
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,0); //Despite culling is on anyway, 
              //the back faces of 'solid' meshes don't 
              //need illumination 

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); //GL_ALWAYS allows back faces to cover front faces in your scene