4

シーンに2つ目のライトを追加しようとしています。別のライト(この場合はLIGHT1)を有効にし、既存のライトと一緒に機能するようにパラメーターを設定するだけでよいという印象を受けました。これを念頭に置いて、これは私の照明の初期化です。

void ThemePark::lightInit(GLfloat sun_position[], GLfloat light1_position[])
{
    // Enable Lighting
    glEnable(GL_LIGHTING);

    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
    glLightfv(GL_LIGHT0, GL_POSITION, sun_position); // Position the lights
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

    // Set light intensity and color for each component
    glLightf(GL_LIGHT0, GL_DIFFUSE, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT0, GL_AMBIENT, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT0, GL_SPECULAR, (1,1,1,1));

    glLightf(GL_LIGHT1, GL_DIFFUSE, (0.7,0.7,0.7,1));
    glLightf(GL_LIGHT1, GL_AMBIENT, (0.3,0.3,0.3,1));
    glLightf(GL_LIGHT1, GL_SPECULAR, (1,1,1,1));

    // Set attenuation
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, -1.0);

    glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.2);

    // Enable Lights
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
}

また、次のように、ディスプレイ機能にライトを再度配置しています。

if(lighting)
{
    glLightfv(GL_LIGHT0, GL_POSITION, sun_position);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
}

彼らの立場は次のとおりです。

GLfloat sun_position[] = {10, 10, -2, 1};
GLfloat light1_position[] = {1, 1, 1, 1};

ただし、これを行うときは、アクティブなライトLIGHT0が1つしかありません。LIGHT0のenableステートメントを削除すると、ライトのないシーンが得られます。テストとして、ライティング初期化関数を次のように変更しました。これにより、基本的にLIGHT1はLIGHT0と同じになりますが、LIGHT0を有効化または初期化することはありません。

void ThemePark::lightInit(GLfloat sun_position[], GLfloat light1_position[])
{
    // Enable Lighting
    glEnable(GL_LIGHTING);

    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
    glLightfv(GL_LIGHT1, GL_POSITION, sun_position);

    // Set light intensity and color for each component
    glLightf(GL_LIGHT1, GL_DIFFUSE, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT1, GL_AMBIENT, (0.5,0.5,0.5,1));
    glLightf(GL_LIGHT1, GL_SPECULAR, (1,1,1,1));

    // Set attenuation
    glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.5);
    glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, -1.0);

    // Enable Lights
    glEnable(GL_LIGHT1);
}

それに応じて表示機能も変更しました。ただし、シーンにまだ照明がありません。ここに欠けているものはありますか?

4

1 に答える 1

2

GL_LIGHT1-7 は実際には GL_LIGHT0 とは異なるデフォルトを持っています...そのため、設定を忘れたものを見つける必要があります。おそらくGL_QUADRATIC_ATTENUATIONでしょうか?スペック内のすべてのパラメーターを設定しようとしない場合、それらの多くはデフォルトで GL_LIGHT1-7 のゼロ/オフ状態になります。

于 2012-12-17T20:12:04.393 に答える