-1

OpenGL の影に少し問題があります。モデルにはすべての面に影があり、OpenGL は、面が光源から指している方向に暗さを与えます。光が面を通過するだけであることに気付きました。つまり、2 つの平面が隣り合っていて、光源が片側にある場合、遠い側の平面はまだ点灯しています。

どうすればこれが起こらないようにできますか? 3D 環境全体で機能するシャドウ コードが必要です。

private static void setUpLighting() {
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightModel(GL_LIGHT_MODEL_AMBIENT, BufferTools.asFlippedFloatBuffer(new float[]{0.05f,
            0.05f, 0.05f, 1f}));
    glLight(GL_LIGHT0, GL_POSITION,
            BufferTools.asFlippedFloatBuffer(new float[]{0, 0, 0, 1}));
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_DIFFUSE);
    glEnable(GL_TEXTURE_2D);
}
4

1 に答える 1

2

光が面を通過するだけであることに気付きました。つまり、2 つの平面が隣り合っていて、光源が片側にある場合、遠い側の平面はまだ点灯しています。

OpenGL をそうではないものと間違えます。OpenGL はシーン グラフではありません。OpenGL には内部シーン表現はありません。描画するために送信するすべてのポイント、ライン、および三角形は、描画されている他のポイント、ライン、および三角形を考慮せずに個別に処理されます。実際、OpenGL は洗練された紙と鉛筆のように機能します。

OpenGL はシーン表現を維持しないため、いわゆる「グローバル イルミネーション」モデルを単独で実行する方法はありません。したがって、シーンに影が必要な場合は、シーンを管理し、結果が影やグローバル イルミネーションのように見える (OpenGL を使用する) 描画アルゴリズムを実装する必要があります。

「Stencil Volume Shadows」と「Depth Buffer Shadow Maps」のトピックを調べる必要があります。

于 2012-10-16T06:17:09.777 に答える