2011-01-11 20 views
0

イメージを1つのポリゴンにテクスチャマップしようとしています。私のイメージは正しく読み込まれていますが、イメージの赤い平面だけがテクスチャされています。OpenGLテクスチャにはテクスチャの赤色成分のみが表示されます

私はそれが読み込まれた後、私は画像をチェックしてQGLWidget

以内にこれをやっている、それはコンポーネントが正しく読まれているのです - つまり、私は緑と青のプレーンの有効な値を取得します。ここで

コード

QImageReader *theReader = new QImageReader(); 

theReader->setFileName(imageFileName); 
QImage theImageRead = theReader->read(); 
if(theImageRead.isNull()) 
    { 
     validTile = NOT_VALID_IMAGE_FILE; 
     return; 
    } 
else 
    { 
     int newW = 1; 
     int newH = 1; 
     while(newW < theImageRead.width()) 
      { 
       newW *= 2; 
      } 
     while(newH < theImageRead.height()) 
      { 
       newH *= 2; 
      } 
     theImageRead = theImageRead.scaled(newW, newH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); 
// values checked in theImageRead are OK here 
     glGenTextures(1,&textureObject); 
     theTextureImage = QGLWidget::convertToGLFormat(theImageRead); 
// values checked in theTextureImage are OK here 
     glBindTexture(GL_TEXTURE_2D, textureObject); 
     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newW, newH, 0, GL_RGBA, GL_UNSIGNED_BYTE,theTextureImage.bits()); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glFlush(); 
     validTile = VALID_TEXTURE; 
     return; 
    } 

then I draw like this:

{ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,textureTiles[tN]->getTextureObject()); glBegin(GL_QUADS); glTexCoord2f(0.0,0.0); glVertex2f(textureTiles[tN]->lowerLeft.x(), textureTiles[tN]->lowerLeft.y()); glTexCoord2f(1.0,0.0); glVertex2f(textureTiles[tN]->lowerRight.x(), textureTiles[tN]->lowerRight.y()); glTexCoord2f(1.0,1.0); glVertex2f(textureTiles[tN]->upperRight.x(), textureTiles[tN]->upperRight.y()); glTexCoord2f(0.0,1.0); glVertex2f(textureTiles[tN]->upperLeft.x(), textureTiles[tN]->upperLeft.y()); glEnd(); glDisable(GL_TEXTURE_2D); } 

で誰もが、それは(R、0,0,1)の値であるかのように私のテクスチャがinterprededことが原因となる何かを見ていますか? (r、g、b、a)?

QT 4.7.1、Ubuntuの10.04、OpenGLの2.somethingまたは任意のヘルプ

+1

あなたが忘れてしまったどこかで 'glColor()'コールがありますか? – genpfault

+0

内部的にOpenGLはinternalFormatパラメータをとり、必要な計算をデータに適用して、要求された形式でデータを取得します。この結果(私が正しくドキュメントを理解している場合)は、GLが関係する限り、常にRGBAイメージです。テスト目的のために、関数呼び出しでGL_RGBの代わりに明示的にinternalFormatをGL_RGBAに設定するとどうなりますか? – badgerr

+0

何も違いはありません – jhowland

答えて

2

を事前に他の

おかげでこれは非常に共通の問題です。まず、MIN/MAGフィルターを何かに設定してください。デフォルトではミップマップが使用されているので、ミップマップは提供していないので、テクスチャーは不完全です。

不完全なテクスチャをサンプリングすると、通常は白くなります。デフォルトのテクスチャ環境を使用したglColor呼び出しは、頂点の色にテクスチャの色を掛けます。あなたはおそらくglColor(赤)、赤*白=赤のようなものを持っているので、あなたは赤を見ているのです。

これを修正するには、MIN/MAGフィルタをGL_LINEARまたはGL_NEARESTに設定します。

+1

私はそれを行いました - 違いはありません。私がやったことは、glTexEnvi(GL_TEX_ENV、GL_TEX_ENV_MODE、GL_REPLACE)を使っていて、それがすべての違いを作ったことです - うまくいくようです。 – jhowland

7

私も同様の問題がありました。私は、テクスチャ化されたクワッドを描画する前にglの色を白と不透明に "リセット"しなければならなかった、あるいは色が乱れてしまいました。このように:

... 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D,textureTiles[tN]->getTextureObject()); 

glColor4f(1.0, 1.0, 1.0, 1.0); // reset gl color 

glBegin(GL_QUADS); 
... 
+0

これはまだ試しましたか?私はそれが問題ではないように思えるが、それは間違いない。 (とにかく私にとって;-) – sidewinderguy

+0

これは私にとってもうまくいった。私はあなたが色をリセットする必要があると言っているドキュメントや何も見つけられませんでした。 – pR0Ps

関連する問題