带有对象旋转的 OpenGL 光

OpenGL light with object rotation

我正在尝试用简单的光旋转十二面体。

显示函数中的代码是这样的:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5f);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.75f);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.4);
GLfloat black[] = { 0, 0, 0, 1 };
GLfloat blue[] = { 0, 1, 1, 1 };
glLightfv(GL_LIGHT1, GL_AMBIENT, black);
glLightfv(GL_LIGHT1, GL_DIFFUSE, blue);
glLightfv(GL_LIGHT1, GL_SPECULAR, blue);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHTING);

glTranslatef(0, 0, -50);
glRotatef(angle, 0, 1.0, 0);
glutSolidDodecahedron();

angle方向键改变。但是有些角度,图片看起来很奇怪是这样的:

经过多次旋转后,它看起来像这样:

后面的脸好像是透明的。这是为什么?我怎样才能正确打印这个对象?

编辑: 解决方案是通过 glEnable(GL_CULL_FACE) 启用背面剔除。如果您不想看到对象内部,您可能需要验证对象的多边形是否使用正确的缠绕顺序定义,并确保设置了背面剔除 (glCullFace(GL_BACK_FACE))。


原回答:

光线没有接触到物体的另一侧,您的环境光设置为黑色:

 GLfloat black[] = { 0, 0, 0, 1 };
 glLightfv(GL_LIGHT1, GL_AMBIENT, black);

尝试将环境光设置为深灰色,以大致近似于 global illumination:

的环境光贡献
 GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
 glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);