2013-08-29 43 views
0

在我的OpenGL程序中,我正在加載寬度爲501的24BPP圖像。 GL_UNPACK_ALINGMENT參數設置爲4。他們寫it shouldn't work,因爲每個上傳的行的大小(501*3 = 1503)不能被4除。但是,當顯示它時,我可以看到沒有artifac的正常紋理。像素數據傳輸:24BPP圖像和GL_UNPACK_ALIGNMENT設置爲4

所以我的代碼工作。我正在考慮爲什麼要充分理解這一點,並防止整個項目陷入困境。

也許(?)它的作品,因爲我不只是打電話glTexImage2D。相反,首先我要創建一個適當的(具有兩個冪的維度)空白紋理,然後上傳像素爲glTexSubImage2D

編輯:

但是你認爲它寫這樣的一些代碼的感覺?

// w - the width of the image 
// depth - the depth of the image 

bool change_alignment = false; 

if (depth != 4 && !is_divisible(w*depth)) // * 
{ 
    change_alignment = true; 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
} 

// ... now use glTexImage2D 

if (change_alingment) glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // set to default 

// * - of course we don't even need such a function 
// but I wanted to make the code as clear as possible 

希望它應該防止應用程序崩潰或故障?

回答

2

這取決於您的圖像數據來自何處。

Windows BMP格式,例如強制執行 4字節行對齊。事實上,像這樣的格式正好是爲什麼 OpenGL有一個行對齊字段:因爲一些圖像格式強制行對齊。

因此,在數據上使用4字節行對齊方式的正確性完全取決於數據在內存中的對齊方式。一些圖像加載器會自動對齊到4個字節。有些則不會。

+0

對,傻我。我忘記了像素的來源 - 我使用SDL_image庫中的IMG_Load(...)函數。所以看起來,至少在每像素3字節的位圖上,它會將其轉換爲32BPP。然而,我無法確定它會在任何情況下(也就是說,任何加載的格式)如此工作,對嗎? 所以我打開它的手冊,但沒有關於它的很多信息。我想我應該開始在SDL_image的一部分庫中搜索,比如libpng,libtiff等。如果我發現,我仍然不確定SDL_image如何使用它們。 – somnock

+0

請看看更新後的帖子。這是一個解決方案嗎? – somnock

+0

@somnock:不需要。你將不得不閱讀任何圖像加載器的文檔,並找出* actual *行對齊的內容。僅僅因爲像素不是4個字節的大小並不意味着它不使用4個字節的行對齊。 –