Mac OS X 10.5 以降用の OpenGL スクリーンセーバーを作成しました。これは、マーチング キューブを使用して作成された回転するハートを示しています。Snow Leopard (10.6) を実行している私の黒の 13.3 インチ開発 Macbook で問題なく動作し、素晴らしく光沢があります。

しかし、新しい Macbook Pro で leopard (10.5) を実行しているときに試してみると、ハートは光沢がありません。アンビエント/ディフューズ ライトのみで照らされているように見えますが、スペキュラ ライトはありません。ライトのスペキュラ コンポーネントを 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);
// 光
GLfloatambient_light[] = {0.2f、0.2f、0.2f、1.0f};
GLfloat 拡散光 [] = { 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, 拡散光);
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, [マーチングキューブの頂点]);
glNormalPointer(GL_FLOAT, 0, [マーチングキューブ法線]);
}
実際の描画コードは次のようになります。
- (void)drawRect:(NSRect)rect
{
[super drawRect:rect];
[[glView openGLContext] makeCurrentContext];
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// ハートビート効果を与えるために視点を調整します
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0、半径、2*半径/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);
}
鏡面照明の違いの理由は何ですか? 一部のグラフィックス カードでは鏡面照明がサポートされていないだけですか? どんなポインタでも大歓迎です。