我已经使用OpenGL几个月了。我们已经开始在课堂上编写基本着色器,我们有一个Qt + OpenGL项目。这是一个简单的:交互式3D场景查看器。我们已经获得了加载.obj文件的起始代码,将它们放在场景中然后让我们用鼠标旋转。
我有一个非常奇怪的问题,我的老师无法解释。我们使用GL_LIGHT0及其默认参数:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
这是唯一的反对。光的方向和位置应与眼睛的方向和位置相同。这是我在Ubuntu中运行程序时的工作方式;我加载一个杯子的模型,当我旋转时,光线随着我的眼睛旋转,我可以看到它的所有面部都被点亮了。 但是,在Mac OS X 10.6.8下,它无法正常工作。灯保持固定,所有面向其他方向的面都是黑色的。 我尝试了其他灯光,我尝试在MODELVIEW中加载身份然后自己指定位置和方向,我尝试重新下载代码,重新编译并运行它仍然是同样的错误。
程序需要一些我使用软链接链接的.dylib文件(不过我认为这不是问题)。问题不在代码中,因为它适用于其他系统。 Mac实现可能有所不同吗?我该怎么测试呢?谢谢!
编辑:这是一段更大的代码:
void GLWidget::initializeGL() {
glClearColor(0.8f, 0.8f, 1.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
resetCamera(); // sets VRP, OBS...
}
void GLWidget::paintGL( void ) {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
setProjection();
setModelview();
drawAxes();
pscene.render();
}
void drawAxes() {
float L = DRAW_AXES_LENGTH;
glDisable(GL_LIGHTING);
glBegin(GL_LINES);
glColor3f(1,0,0); glVertex3f(0,0,0); glVertex3f(L,0,0); // X
glColor3f(0,1,0); glVertex3f(0,0,0); glVertex3f(0,L,0); // Y
glColor3f(0,0,1); glVertex3f(0,0,0); glVertex3f(0,0,L); // Z
glEnd();
glEnable(GL_LIGHTING);
}
这些是与照明相关的功能。正如我所说,LIGHT0在initializeGL中设置一次。我试图在paintGL中设置它的位置,但它也没有用。
-----编辑2 ----- 我找到了解决方案。在drawAxes中,就在返回之前,添加:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
GLfloat pos[] = {0.0f, 0.0f, 1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glPopMatrix();
这是为什么?禁用并重新启用后,它会停止工作吗?