2013-07-05 174 views
3

我在OpenGL環境中使用CImg。當我嘗試添加紋理時,每種顏色似乎都會分離到紋理中的單獨拼貼中。例如,當我嘗試使用一個紋理,看起來是這樣的:在我的計劃OpenGL紋理顏色分離

它出來尋找這樣的:

,我是裝的質地是一個512x512 .bmp文件,保存在GIMP中,具有24位色彩深度,RBG。我嘗試了一些Gimp允許的其他格式,但這些只是導致CImg出錯。

這是我的加載質地:

glBindTexture(GL_TEXTURE_2D, 13); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

CImg<unsigned char> src("MilkyWay.bmp"); 
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, src.width(), src.height(), 
    0, GL_RGB, GL_UNSIGNED_BYTE, src); 

,這是我怎樣顯示質地:

glEnable (GL_TEXTURE_2D); 
glBindTexture (GL_TEXTURE_2D, 13); 
glBegin (GL_QUADS);   
    glTexCoord2f (0.0, 1.0); 
    glVertex3f (-120.0, 120.0, 0.0); 
    glTexCoord2f (1.0, 1.0); 
    glVertex3f (120.0, 120.0, 0.0); 
    glTexCoord2f (1.0, 0.0); 
    glVertex3f (120.0, -120.0, 0.0); 
    glTexCoord2f (0.0, 0.0); 
    glVertex3f (-120.0, -120.0, 0.0); 
glEnd(); 

回答

1

CIMG存儲頻道非交錯(或 '平坦'),但GL期待着相反。結果就是你所看到的。

您可以重新排列數據(或讓CImg爲您完成),但由於通道也傾向於以源格式進行交織,所以圖像庫僅對某些中間步驟進行解交織以重新交織在交給GL之前效率不高。相反,我會推薦使用不同的加載圖像數據的方法,以便它可以直接使用。

有許多庫可以做到這一點,儘管BMP是一種非常簡單的格式來直接讀取。

+0

謝謝!有什麼圖像閱讀庫,你會推薦? – Vicker

+1

我想更新,以防其他人閱讀此內容。我從http://www.lonesock.net/soil.html下載了SOIL,它創造了奇蹟。感謝您的幫助,JasonD! – Vicker