OpenGL中同一轴上多边形着色的不一致性

时间:2014-04-02 13:33:19

标签: opengl textures shadow lighting

我正在OpenGL中建造一所房子。在外面和内部有门或窗户的地方,我使用四边形在房子周围的窗户下方和上方,然后四边形填充窗户之间的间隙。这些将具有相同的平面值,但由于某种原因,GL_LIGHT将阴影传递给某些平面值。有什么线索的原因?

Windows之间的四元组

glBegin(GL_QUADS);
    glTexCoord2d(0, 0);glVertex3d(0, 1.1, 0);
    glTexCoord2d(2, 0);glVertex3d(0, 1.1, 2);
    glTexCoord2d(2, 1.6);glVertex3d(0, 2.7, 2);
    glTexCoord2d(0, 1.6);glVertex3d(0, 2.7, 0);
    glEnd();

在windows下面

glBegin(GL_QUADS);
    glTexCoord2d(0, 0);glVertex3d(0, 0.1, 0);
    glTexCoord2d(15, 0);glVertex3d(0, 0.1, 15);
    glTexCoord2d(15, 1);glVertex3d(0, 1.1, 15);
    glTexCoord2d(0.0, 1);glVertex3d(0, 1.1, 0);
    glEnd();

以上窗口

glBegin(GL_QUADS);
    glTexCoord2d(0, 2.6);glVertex3d(0, 2.7, 0);
    glTexCoord2d(15, 2.6);glVertex3d(0, 2.7, 15);
    glTexCoord2d(15, 3.0);glVertex3d(0, 3.1, 15);
    glTexCoord2d(0.0,3.0);glVertex3d(0, 3.1, 0);
    glEnd();

这是光的代码

GLfloat light_position[] = { 50, 50, -1.0};
    GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat ambient[] = { 1.0, 1.0, 1.0, 1.0 };

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glEnable(GL_NORMALIZE);
    glLightfv(GL_LIGHT0, GL_POSITION , light_position );
    glLightfv(GL_LIGHT0, GL_SPECULAR , specular);
    glLightfv(GL_LIGHT0, GL_DIFFUSE , diffuse );
    glLightfv(GL_LIGHT0, GL_AMBIENT , ambient );

以下是结果的屏幕截图 http://imgur.com/WsgZWBF

为什么要这样做,有没有办法解决它?

1 个答案:

答案 0 :(得分:0)

您需要为OpenGL的灯光提供(有意义的)顶点/面法线才能正常工作:

18.020 Why are my objects all one flat color and not shaded and illuminated?

  

当您无法在每个顶点提供法线时会发生此效果。

     

OpenGL需要法线来计算光照方程,并且它不会为你计算法线(评估者除外)。 如果您的应用程序没有调用glNormal *(),那么它在每个顶点使用默认的法线(0.0,0.0,1.0)。 OpenGL将计算相同或几乎相同的,在每个顶点点亮结果。这将使您的模型看起来平坦且没有阴影。

     

解决方案是简单地计算需要在任何给定顶点指定的法线。然后在指定与法线相关联的顶点之前调用glNormal3f()将它们发送到OpenGL。