2

私は現在、OpenGLシェーディングとライティングを使用して、Blenderからエクスポートされた3Dモデルを単純なGLUTウィンドウに表示しようとしています。

OpenGL設定を検証するために、典型的なglutSolidTeapotを表示しようとしました。下の写真に見られるように、ティーポットを使用すると、すべてが完全に正常に見えます。

ここに画像の説明を入力してください

ティーポットをBlenderでエクスポートした独自のモデルに置き換えたい場合、シェーディングは機能しません。モデル(車のリム)は無地に見えます。モデルを回転させると色が変わりますが、常に塗りつぶされています。

ここに画像の説明を入力してください

ティーポットモデルを描画するために、glutSolidTeapotは内部で何をしますか?

OpenGLのセットアップに使用しているコードは次のとおりです。

void SetupRC()
{
    glClearColor(0.4, 0.4, 0.4, 1.0);

    // Enable lighting and the light we have set up
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);

    //Set lighting parameters
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT,light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // Enable shading
    glShadeModel(GL_SMOOTH);

    // Set up the projection parameters
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 20.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_AUTO_NORMAL);
    glEnable(GL_NORMALIZE);
}

そして、フレームを再描画するためのコード:

void RenderScene(void)
{
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);

    glTranslatef(0.0, 0.0, -2.5f);

    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // set input data to arrays
    glVertexPointer(3, GL_FLOAT, 0, BlenderGuru_CarWheelVerts);

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    GLfloat ambConst[] = { 0.24725, 0.1995, 0.0745, 1.0};
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambConst);

    GLfloat diffConst[] = { 0.75164, 0.60648, 0.22648, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffConst);

    GLfloat specConst[] = { 0.628281, 0.555802, 0.366065, 1.0 };
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specConst);

    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 51.2);

    // draw data
    glEnableClientState(GL_VERTEX_ARRAY);
        glDrawArrays(GL_TRIANGLES, 0, BlenderGuru_CarWheelNumVerts);
    glDisableClientState(GL_VERTEX_ARRAY);

    glFlush();
}
4

2 に答える 2

4

Blenderからエクスポートしているので、エクスポートされたデータには法線も含まれている可能性があります。そうでない場合は、モデル用にそれらを生成してエクスポートするようにしてください。照明を機能させるには、通常のデータが必要です。

の呼び出しglEnable(GL_AUTO_NORMAL);は、あなたが思っていることをしません。それだけになります

GL_MAP2_VERTEX_3またはGL_MAP2_VERTEX_4が頂点の生成に使用される場合、法線ベクトルを生成します。

したがって、法線データを自分でエクスポートしてこれを使用するか、使用可能なメッシュデータから法線を計算します。

于 2012-05-21T07:49:55.447 に答える
4

コードに通常のデータのロード/設定がありません。法線がないと、照明は機能しません。

于 2012-05-21T14:56:59.200 に答える