簡體   English   中英

如何使用FreeImage庫將紋理加載到OpenGL?

[英]How do I load textures to OpenGL using FreeImage library?

我正在使用NeHe教程在C ++中學習OpenGL,但我正在嘗試使用FreeImage庫,而不是Glaux或SOIL。 我在使用FreeImage時看到的好處是,它的最后一次更新發生在去年10月,而SOIL在5年內沒有更新。 我遇到的問題是我無法正確加載紋理。

這是我的代碼:

static GLuint texture = 0;
if (texture == 0)
{
    FIBITMAP* bitmap = FreeImage_Load(
        FreeImage_GetFileType("textures/test/nehe_06.png", 0),
        "textures/test/nehe_06.png");

    glGenTextures(1, &texture);

    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(bitmap), FreeImage_GetHeight(bitmap),
        0, GL_RGB, GL_UNSIGNED_BYTE, FreeImage_ConvertTo32Bits(bitmap));

    FreeImage_Unload(bitmap);
}

使用這個代碼,我得到的紋理是錯誤的:它是黑色的,有彩色的點和條帶,更改圖像給出相同的結果,所以我假設我沒有正確加載紋理。

我試圖交換紅色和藍色位(讀取FreeImage在BGR中加載)沒有更好的結果。 最后,如果我通過* FreeImage_GetBits(位圖)更改* FreeImage_ConvertTo32Bits(位圖)* *我得到一個段錯誤。

我做錯了什么?

您的代碼有兩個問題 - 一個是您將圖像轉換為32位,但是您指定24位紋理格式為openGL( GL_RGB )。 第二個是你將FreeImage對象本身傳遞給紋理而不是轉換后的位。

你需要做這樣的事情

FIBITMAP *pImage = FreeImage_ConvertTo32Bits(bitmap);
int nWidth = FreeImage_GetWidth(pImage);
int nHeight = FreeImage_GetHeight(pImage);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight,
    0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage));

FreeImage_Unload(pImage);

擴展以前的答案:

FreeImage_GetBits()函數將返回一個指向以FreeImage內部格式存儲的數據的指針。 每條掃描線通常與4字節邊界對齊。 當你有兩個紋理時,這將正常工作。 但是,對於NPOT紋理,您需要為OpenGL指定正確的解包對齊。

FreeImage中還有另一個函數,它允許你得到未對齊的緊密排列的像素數組: FreeImage_ConvertToRawBits()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM