0

このマルチテクスチャスキームのテクスチャの1つだけのライティングを無効にするにはどうすればよいですか?glDisable(GL_LIGHTING)とglEnable(GL_LIGHTING)を使用しようとしましたが、クワッドをレンダリングするときに設定が記憶されません。

コードスニペットは次のとおりです。

glDisable(GL_LIGHTING);
glEnable(GL_BLEND);

glDisable(GL_TEXTURE_RECTANGLE_ARB);
glDisable(GL_TEXTURE_2D);

//------------------------
glActiveTextureARB(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP); // texture with black/white

//------------------------
glActiveTextureARB(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MY_TEXTURE); // normal texture
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);

glColor4f(1, 1, 1, 1);

glBegin(GL_QUADS);
    glNormal3f(0,0,1);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 1.0f);
    glVertex3f(1.0f,  1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

glActiveTextureARB(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

編集:テクスチャの読み込み:

glGenTextures(1, &LIGHT_MAP);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

奇妙なことに、コードの最初の行でライティングを有効にすると、マルチテクスチャクワッドでレンダリングされたlight_mapテクスチャがまったく表示されません。また、照明はそのクワッドにまったく影響を与えていないようです。アプリ内の他のクワッド(マルチテクスチャではありません)で機能します。

助けていただければ幸いです。

4

1 に答える 1

2

あなたの最初の文は意味がありません。GLライティングは頂点レベルで発生します。テクスチャリング、それがシングルテクスチャであろうとマルチテクスチャであろうと。ずっと後に起こります。詳細:

頂点ごとに計算されたライティングは各フラグメントに補間され、その値はテクスチャリングパイプラインステージ0に入力されます。

つまり...ステージ0のテクスチャ環境に従って、点灯した色Lが入り、テクスチャステージ0(ここではライトマップ)のテクスチャと結合されます。テクスチャ環境をどのように設定したかは示されていません。テクスチャステージ0なので、どのように受け継がれるかはわかりません。

次に、ステージ0からの出力(ライティングとテクスチャ0から計算)がテクスチャステージ1の入力(「通常の」テクスチャがバインドされます。これは拡散テクスチャと呼ばれます)に送信されます。ここでは、RGBとALPHAの両方でADDを使用したCOMBINEの環境を使用します。これは、ライトマッピングでは一般的ではありません。照明とライトマップを拡散色に追加します。通常、それらを乗算します(GL_COMBINEではなくGL_TEXTURE_ENV_MODE = GL_MODULATE)。

また、SOURCE0_ALPHAとSOURCE1_ALPHAを設定しなかったため、ステージ1のALPHA出力を生成するために正確に何を追加するかはわかりません。

全体として、最初に(数学として)結果として必要なものを正確に書き留め、それをGLマルチテクスチャパイプラインにマッピングすることをお勧めします。

編集:コメントに続いて、ステージ0 TexEnvを指定しない場合、デフォルトを取得します。

GL_TEXTURE_ENV_MODEのデフォルトはGL_MODULATEで、GL_TEXTURE_ENV_COLORのデフォルトは(0、0、0、0)です。

したがって、照明からの色はライトマップで変調されます(これは、達成しようとしていることによっては意味がある場合があります)。それはあなたのディフューズに追加されます(私が言ったように、それはおそらく代わりに変調されるはずです)。

これらのどれも私が前に言ったことを変えません:あなたがあなたの結果に望む数学を正確に書き留めてください。そこから、必要なテクスチャ環境を見つけるお手伝いをします。しかし、あなたはあなたが達成したい結果を言いませんでした。

于 2010-01-10T13:09:49.357 に答える