【问题标题】:lighting and surface normal issue with the cube立方体的照明和表面法线问题
【发布时间】:2013-11-20 21:36:31
【问题描述】:

在我尝试使用 glnormal 进行照明后,我的立方体看起来像这样(房子)。如果我摆脱 glnormal 那就很好,如果我要摆脱 glDepthFunc(GL_ALWAYS);那就好了,不知道怎么回事。

还有一个问题,在我使用 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_ALWAYS 作为深度函数?这基本上意味着无论您最后绘制的内容是什么,都是可见的,无论其深度或之前绘制的任何其他内容。通常你想使用GL_LESSGL_LEQUAL 这样只有比已经绘制的更接近你的像素才会显示出来。此外,GL_FRONT_AND_BACK 不是glCullFace (...) 的有效枚举。如果你要剔除两边,你可能根本不画任何东西;)
  • 我不知道 GL_ALWAYS 会那样做...但是我在屏幕上还有其他东西,我试着把它放在房子前面,我改变了 z 坐标,但它变得更大了,它从来没有来到房子前面
  • @AndonM.Coleman: glCullFace() 被记录为接受GL_FRONT_AND_BACK。正如您所指出的那样,非常无用,但完全有效。

标签: opengl lighting depth-testing


【解决方案1】:

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

常见的经典设置如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多