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); }
鏡面照明の違いの理由は何ですか? 一部のグラフィックス カードでは鏡面照明がサポートされていないだけですか? どんなポインタでも大歓迎です。