5

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

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

4

1 に答える 1

1

GL_SPECULAR (およびその他の色) のデフォルトは{ 0.0,0.0,0.0,1.0 }

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

セットアップ機能の最後にこれを行って、1. 描画を最適化し、2. セットアップ時に照明が実際に正面に適用されているかどうかを再確認することもできます。

glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
于 2012-01-29T16:36:17.283 に答える