在OS X上運行時,我使用SDL_Image
庫(使用IMG_LOAD()
,它返回SDL_Surface*
)在OpenGL中加載了紋理。似乎色彩通道已被交換,即,我必須將GL_BGRA
設置爲glTexImage2D()
中的像素格式參數。識別SDL中的像素數據格式
有沒有一種方法來確定正確的數據格式(BGRA或RGBA等......),而不僅僅是簡單地編譯和檢查紋理? SDL交換這些顏色通道的原因是什麼?
在OS X上運行時,我使用SDL_Image
庫(使用IMG_LOAD()
,它返回SDL_Surface*
)在OpenGL中加載了紋理。似乎色彩通道已被交換,即,我必須將GL_BGRA
設置爲glTexImage2D()
中的像素格式參數。識別SDL中的像素數據格式
有沒有一種方法來確定正確的數據格式(BGRA或RGBA等......),而不僅僅是簡單地編譯和檢查紋理? SDL交換這些顏色通道的原因是什麼?
是的。下面的鏈接對如何確定每個組件的信道轉移的代碼示例: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,因爲後者可用於確定顏色通道的位置和存在。
_「我不知道爲什麼交換會發生。」_字節順序很可能。不知道OS X的哪個版本,甚至是什麼處理器架構,但這是該平臺上比其他平臺更常見的問題。 –
我打算髮表一個答案,但我意識到我錯過了解決方案的很大一部分。基本上,在很多系統中,BGRA是無符號8位標準化紋理的首選,其他類型傾向於使用RGBA。但是,我無法找到一種方法來詢問SDL_Image輸出的格式,這對確保它與OpenGL的匹配非常關鍵。但是,現在,可能您在任何合理的系統上加載的任何圖像都將被BGRA訂購。 RGBA或ARGB可能會彈出用於HDR文件。 –