2011-06-29 3 views
0

私は3つのクワッドA、B、Cを使ってシーンを実装しました。クワッドCはクワッドBの背後にあります。クワッドBはクワッドAの上に座っています。マルチシーンはシーン全体を暗くしています!

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

以下のコードサンプルは、固定機能マルチテクスチャでQuad Bを描画する方法です。

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); 

IはクワッドB、テクスチャクワッドA及びC変更色multitexturedアルファマップを適用し、IはGL_TEXTURE1のすべてに一切の言及を削除すると、クワッドB.

より暗く終わるない、うまくレンダリング私はQuad Bでアルファマッピングを失いますが、それでも調光します。

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

答えて

1

あなたはテクスチャのどれもが、シーンの残りの部分に影響を与えないように、テクスチャユニットのすべてを無効にする必要があります。あなたのコードの外見では、おそらくあなたの状態を追跡するのを忘れてしまったでしょう。

は、あなたが(他の回答のように示唆されている)各テクスチャユニットがそれを必要とするかどうかに応じて、GL_TEXTURE_2Dに各フレームを有効または無効にでき

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 
+0

はglActiveTexture(GL_TEXTUREN)を呼び出しています。 glEnable(GL_TEXTURE_2D)を呼び出すことと同義です。 ? –

+0

@ct:いいえ、現在アクティブなテクスチャユニットを切り替え、glEnable/glDisable(GL_TEXTURE_ ...)はアクティブなテクスチャユニットを有効/無効にします。これはglMatrixModeに非常に似ています。 – datenwolf

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 
..... 
0

を追加します。代わりに、不要なテクスチャをアンバインドするだけで済むので、はるかに速くする必要があります。

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 
関連する問題