我正在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
为什么要这样做,有没有办法解决它?
答案 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。