I wrote an OpenGL splash screen for Mac OS X 10.5 and later that shows a spinning heart built with marching cubes. It works great on my black 13.3-inch MacBook, powered by Snow Leopard (10.6), nice and glossy.

But when I try it on the new Macbook Pro, but running the leopard (10.5), my heart is not glossy. It seems to be lit only by ambient / ambient light, but not specular light. It is as if I set the mirror component of the light to 0. The new Macbook has an Nvidia graphics card. One older, running on 10.6, has an Intel XMA3100.

Here is my OpenGL initialization code. The heart is created using marching cubes, and I also compute normal vectors.
- (void) setUpOpenGL
{
[[glView openGLContext] makeCurrentContext];
// Synchronize buffer swaps with vertical refresh rate
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);
// Light
GLfloat ambient_light [] = {0.2f, 0.2f, 0.2f, 1.0f};
GLfloat diffuse_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);
// Material
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);
// Copy isosurface vertices to graphics array
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, [marchingCubes vertices]);
glNormalPointer (GL_FLOAT, 0, [marchingCubes normals]);
}
The actual drawing code is as follows:
- (void) drawRect: (NSRect) rect
{
[super drawRect: rect];
[[glView openGLContext] makeCurrentContext];
glDrawBuffer (GL_BACK);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Adjust viewpoint to give heart beat effect
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (0, radius, 2 * radius / 3,
0, 0, 0,
0, 0, 1);
// Adjust rotation to make heart spin
glRotatef (rotation, 0.0f, 0.0f, 1.0f);
// Draw heart
glDrawArrays (GL_TRIANGLES, 0, [marchingCubes vertexCount] / 3);
glFlush ();
[[glView openGLContext] flushBuffer];
// Rotate and scale a bit
rotation + = 1.0f;
radius = 4.0 + 0.25 * sin (rotation / 4);
}
, ? ? .