2011-01-11 95 views
0

我想將紋理映射到單個多邊形。我的圖像正在被正確讀取,但只有圖像的紅色平面被紋理化。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); } 

是否有人看到任何會導致出現interpreded我的質地,就好像它是值(R,0,0,1)? (R,G,B,A)?

QT 4.7.1,Ubuntu的10.04,OpenGL的2.something或其他

在此先感謝您的幫助

+1

你有一個'glColor()`調用你忘了嗎? – genpfault 2011-01-11 16:13:34

+0

在內部,OpenGL採用internalFormat參數並將所需的任何計算應用於您的數據以獲得所需的格式。這個結果(如果我正確理解文檔)始終是一個RGBA圖像,就GL而言。出於測試目的,如果在函數調用中明確將internal格式設置爲GL_RGBA而不是GL_RGB,會發生什麼情況? – badgerr 2011-01-11 16:50:09

+0

沒有什麼 - 完全沒有區別 – jhowland 2011-01-11 18:11:25

回答

2

這是一個非常普遍的問題。首先,將MIN/MAG過濾器設置爲某種東西,因爲默認值使用mipmap,並且由於您沒有提供mipmap,因此紋理不完整。

採樣不完整的紋理通常會產生白色。使用默認紋理環境的glColor調用將使頂點顏色與紋理顏色相乘。你可能有像glColor(紅色)和紅色*白色=紅色的東西,所以這就是爲什麼你看到紅色。

要修復它,請將MIN/MAG過濾器設置爲GL_LINEAR或GL_NEAREST。

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