我为 Mac OS X 10.5 及更高版本编写了一个 OpenGL 屏幕保护程序,它显示了一个使用行进立方体构建的旋转心脏。它在我运行 Snow Leopard (10.6) 的黑色 13.3" 开发 Macbook 上运行良好,美观且有光泽。

但是当我在运行 leopard (10.5) 的较新的 Macbook Pro 上试用它时,心脏并不光滑。它看起来好像只用环境光/漫射光照亮,但没有镜面光。就好像我将光的镜面反射分量设置为 0。较新的 Macbook 有一个 Nvidia 显卡。运行 10.6 的较旧版本具有 Intel XMA3100。

这是我的 OpenGL 初始化代码。心脏是使用行进立方体创建的,我也在计算法线向量。
- (void)setUpOpenGL
{
[[glView openGLContext] makeCurrentContext];
// 将缓冲区交换与垂直刷新率同步
GLint swapInterval = 1;
[[glView openGLContext] setValues:&swapInterval
forParameter:NSOpenGLCPSwapInterval];
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
// 光
GLfloat 环境光[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloatdiffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat specular_light[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat position_light[] = { 0.0f, 0.0f, -1.0f, 0.0f };
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient_light);
glLightfv(GL_LIGHT0, GL_DIFFUSE,diffuse_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light);
glLightfv(GL_LIGHT0, GL_POSITION, position_light);
// 材料
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0};
GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 };
GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 };
GLfloat mat_shininess[] = { 100.0 };
glColor3f(1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
// 复制等值面顶点到图形数组
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, [marchingCubes 顶点]);
glNormalPointer(GL_FLOAT, 0, [marchingCubes normals]);
}
实际的绘图代码如下所示:
- (void)drawRect:(NSRect)rect
{
[超级drawRect:矩形];
[[glView openGLContext] makeCurrentContext];
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 调整视点赋予心跳效果
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 半径, 2*radius/3,
0, 0, 0,
0, 0, 1);
// 调整旋转使心脏旋转
glRotatef(旋转, 0.0f, 0.0f, 1.0f);
//画心
glDrawArrays(GL_TRIANGLES, 0, [marchingCubes vertexCount]/3);
glFlush();
[[glView openGLContext] flushBuffer];
// 旋转和缩放一点
旋转 += 1.0f;
半径 = 4.0 + 0.25*sin(旋转/4);
}
任何想法为什么镜面照明差异?某些显卡根本不支持镜面照明吗?任何指针都非常感谢。