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
希望它應該防止應用程序崩潰或故障?
對,傻我。我忘記了像素的來源 - 我使用SDL_image庫中的IMG_Load(...)函數。所以看起來,至少在每像素3字節的位圖上,它會將其轉換爲32BPP。然而,我無法確定它會在任何情況下(也就是說,任何加載的格式)如此工作,對嗎? 所以我打開它的手冊,但沒有關於它的很多信息。我想我應該開始在SDL_image的一部分庫中搜索,比如libpng,libtiff等。如果我發現,我仍然不確定SDL_image如何使用它們。 – somnock
請看看更新後的帖子。這是一個解決方案嗎? – somnock
@somnock:不需要。你將不得不閱讀任何圖像加載器的文檔,並找出* actual *行對齊的內容。僅僅因爲像素不是4個字節的大小並不意味着它不使用4個字節的行對齊。 –