簡體   English   中英

使用stb_image為OpenGL紋理加載PNG會產生錯誤的顏色

[英]Loading PNG with stb_image for OpenGL texture gives wrong colors

我正在使用stb_image加載一個32位的PNG文件(RGBA),我用它創建一個OpenGL紋理。

它適用於24位PNG文件(沒有alpha通道),但是當我使用32位PNG文件時,出現問題。

這就是紋理應該是這樣的:

質地

這就是使用OpenGL渲染時的樣子(黑色部分是透明的,當我啟用混合時):

錯誤的紋理

這是我加載紋理的方式:

int w;
int h;
int comp;
unsigned char* image = stbi_load(filename.c_str(), &w, &h, &comp, STBI_rgb);

if(image == nullptr)
    throw(std::string("Failed to load texture"));

glGenTextures(1, &m_texture);

glBindTexture(GL_TEXTURE_2D, m_texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

if(comp == 3)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
else if(comp == 4)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

glBindTexture(GL_TEXTURE_2D, 0);

stbi_image_free(image);

這些是窗口參數(使用SDL)

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);

怎么了?

在stbi_load函數調用中將STBI_rgb更改為STBI_rgb_alpha會修復它。

可能最好不要在RGBA:D時指定RGB

您的實際錯誤是您使用comp來確定glTexImage2D formatGL_RBA / GL_RGBA )參數。 這是因為當您使用stbi_load加載圖像時, comp返回的值將始終與源圖像匹配,而不是返回的圖像數據。

更具體地說,你的錯誤是你使用STBI_rgb ,導致stbi_load返回3字節像素,但是你用glTexImage2D加載它作為4字節像素與GL_RGBA因為當你加載32位圖像時comp是4。

您必須設置的格式在調用glTexImage2DGL_RGB如果使用STBI_rgbGL_RGBA如果使用STBI_rgb_alpha

對其他讀者的獎勵

你有類似的問題,上面仍然無濟於事嗎? 那么你的圖像數據可能沒有OpenGL期望的對齊行。 試試glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 在你調用glTexImage2D之前。 有關詳細信息,請參閱https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout

暫無
暫無

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

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