2016-04-06 49 views
1

在OS X上運行時,我使用SDL_Image庫(使用IMG_LOAD(),它返回SDL_Surface*)在OpenGL中加載了紋理。似乎色彩通道已被交換,即,我必須將GL_BGRA設置爲glTexImage2D()中的像素格式參數。識別SDL中的像素數據格式

有沒有一種方法來確定正確的數據格式(BGRA或RGBA等......),而不僅僅是簡單地編譯和檢查紋理? SDL交換這些顏色通道的原因是什麼?

+1

我打算髮表一個答案,但我意識到我錯過了解決方案的很大一部分。基本上,在很多系統中,BGRA是無符號8位標準化紋理的首選,其他類型傾向於使用RGBA。但是,我無法找到一種方法來詢問SDL_Image輸出的格式,這對確保它與OpenGL的匹配非常關鍵。但是,現在,可能您在任何合理的系統上加載的任何圖像都將被BGRA訂購。 RGBA或ARGB可能會彈出用於HDR文件。 –

回答

1

是的。下面的鏈接對如何確定每個組件的信道轉移的代碼示例:http://wiki.libsdl.org/SDL_PixelFormat#Code_Examples

從網站:

SDL_PixelFormat *fmt; 
SDL_Surface *surface; 
Uint32 temp, pixel; 
Uint8 red, green, blue, alpha; 
. 
. 
. 
fmt = surface->format; 
SDL_LockSurface(surface); 
pixel = *((Uint32*)surface->pixels); 
SDL_UnlockSurface(surface); 

/* Get Red component */ 
temp = pixel & fmt->Rmask; /* Isolate red component */ 
temp = temp >> fmt->Rshift; /* Shift it down to 8-bit */ 
temp = temp << fmt->Rloss; /* Expand to a full 8-bit number */ 
red = (Uint8)temp; 

您應該能夠通過價值Xmasks進行排序。然後你可以確定它的RGBA或BGRA。如果Xmask == 0,則顏色通道不存在。

我不知道爲什麼交換髮生。

編輯:從Xshift更改爲Xmask,因爲後者可用於確定顏色通道的位置和存在。

+1

_「我不知道爲什麼交換會發生。」_字節順序很可能。不知道OS X的哪個版本,甚至是什麼處理器架構,但這是該平臺上比其他平臺更常見的問題。 –