An OpenGL object is glossy / shiny on Mac OS X 10.6, but not 10.5. What for?

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.

q4flK.png

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.

XCKdE.png

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);
}

, ? ? .

+5
1

GL_SPECULAR ( ) { 0.0,0.0,0.0,1.0 }

GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 };

func 1. 2. , .

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
+1

All Articles