0

3つのクワッド、A、B、およびCを使用してシーンを実装しました。クワッドCはクワッドBの後ろにあります。クワッドBはクワッドAの上にあります。

クワッドBを除いて、すべてのクワッドは同じテクスチャを使用しています。クワッドBはアルファマップを使用し、他のすべてのクワッドが使用しているベーステクスチャを使用します。

以下のコードサンプルは、固定機能のマルチテクスチャリングを使用してQuadBを描画する方法です。

GLuint alphaGLTexture; 
SDL_SurfaceToGLTexture(aTexture, &alphaGLTexture);

GLuint baseGLTexture;
SDL_SurfaceToGLTexture(baseTexture, &baseGLTexture);

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, alphaGLTexture);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, baseGLTexture); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glTranslatef(0.0f, 0.0f, 0.0f);

double u_coord = 0.0f, v_coord = 0.0f;

// Renders Quad B
glActiveTexture(GL_TEXTURE0)
glBegin(GL_QUADS);

// remainder of code modifies u_coord, v_coord and draws the other glVertex3f's.
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posax, posay, posaz);

マルチテクスチャのアルファマップをクアッドBに適用すると、テクスチャのクワッドAとCの色が変わり、クアッドBよりも暗くなります。

GL_TEXTURE1への言及を削除すると、Quad Bでのアルファマッピングは失われますが、すべてがうまくレンダリングされ、調光は行われません。

推奨事項やヒントはありますか?glTexEnviの呼び出しに何か問題がありますか?

4

3 に答える 3

1

すべてのテクスチャユニットを無効にして、どのテクスチャもシーンの残りの部分に影響を与えないようにする必要があります。コードの外観からすると、状態を追跡するのを忘れている可能性があります。

追加

glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D); // or whatever texture target used

glActiveTexture(GL_TEXTURE…);
glDisable(GL_TEXTURE_2D); // or whatever texture target used
于 2011-06-29T21:04:24.223 に答える
0

各テクスチャユニットがそれを必要とするかどうかに応じて、各フレームでGL_TEXTURE_2Dを有効または無効にすることができます(他の回答が示唆しているように)。または、必要のないテクスチャのバインドを解除することもできます。これははるかに高速です。

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D,0);

glActiveTexture(GL_TEXTURE0); //make sure to set the active texture unit back to 0
于 2011-07-01T19:24:00.743 に答える
0

他のクワッドに使用していない場合は、テクスチャ ユニット 1 を無効にしてみてください。

// draw Quad B
....

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

// draw Quad A
.....

// draw Quad C
.....
于 2011-06-29T20:59:32.323 に答える