Объект OpenGL глянцевый/блестящий в Mac OS X 10.6, но не в 10.5. Почему?

Я написал заставку OpenGL для Mac OS X 10.5 и выше, которая показывает вращающееся сердце, построенное с помощью маршевых кубиков. Она отлично работает на моем черном 13,3-дюймовом Macbook под управлением Snow Leopard (10.6), красивом и блестящем.

Но когда я пробую его на более новом Macbook Pro, но под управлением Leopard (10.5), сердце не глянцевое. Создается впечатление, что оно освещено только рассеянным/диффузным светом, но не зеркальным. Это похоже на то, как если бы я установил для зеркального компонента света значение 0. На новом Macbook установлена видеокарта Nvidia. В более старом, работающем под управлением 10.6, установлена Intel XMA3100.

Вот мой код инициализации OpenGL. Сердце создано с помощью маршевых кубов, и я также вычисляю нормальные векторы.

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

Фактический код рисования выглядит так:

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

Есть идеи, почему разница в спекулярном освещении? Может быть, спекулярное освещение просто не поддерживается на некоторых видеокартах? Любые подсказки будут приняты с благодарностью.

6
задан thinkski 30 January 2012 в 04:40
поделиться