Я написал заставку 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); }
Есть идеи, почему разница в спекулярном освещении? Может быть, спекулярное освещение просто не поддерживается на некоторых видеокартах? Любые подсказки будут приняты с благодарностью.