2014-04-18 12 views
16

Używam stb_image do załadowania 32-bitowego pliku PNG (RGBA) i tworzę z niego tekst OpenGL.Ładowanie PNG z stb_image dla tekstury OpenGL daje niewłaściwe kolory

Działa dobrze dla 24-bitowych plików PNG (bez kanału alfa), ale kiedy używam 32-bitowego pliku PNG, coś idzie nie tak.

To właśnie struktura powinna wyglądać następująco:

Texture

I to jest, jak to wygląda, gdy wykonane z OpenGL (czarne elementy mają być przejrzyste, a są po włączeniu mieszania) :

Wrong Texture

ten sposób załadować tekstura:

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); 

A oto parametry okna (przy użyciu 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); 

Czy ktoś wie co się dzieje?

Odpowiedz

18

Zmiana STBI_rgb na STBI_rgb_alpha w wywołaniu funkcji stbi_load naprawiono.

Prawdopodobnie najlepiej nie określił, kiedy jego RGBA RGB: D

+0

To zadziałało tylko "szczęście". Zobacz moją odpowiedź. –

0

Rzeczywisty błąd jest skorzystanie comp do określenia format (GL_RBA/GL_RGBA) Parametr do glTexImage2D. Dzieje się tak, ponieważ po załadowaniu obrazu przy użyciu stbi_load, wartość zwrócona w comp zawsze będzie pasować do obrazu źródłowego, a nie do danych obrazu zwróconych.

Dokładniej, twój błąd jest skorzystanie STBI_rgb, powodując stbi_load powrotu 3 bajtów pikseli, ale następnie załadować go z glTexImage2D jak 4 bajtowych pikseli z GL_RGBA ponieważ comp jest 4 po załadowaniu 32 bitowego obrazu.

Musisz ustawić format w swoim powołaniu do glTexImage2D do GL_RGB jeśli używasz STBI_rgb i GL_RGBA jeśli używasz STBI_rgb_alpha.

Bonus do innych czytelników

Czy masz podobny problem i powyżej nadal nie pomaga? Wtedy dane obrazowe mogą nie mieć wierszy na linii trasowania, której oczekuje OpenGL. Wypróbuj glPixelStorei(GL_UNPACK_ALIGNMENT, 1); zanim zadzwonisz pod numer glTexImage2D. Aby uzyskać więcej informacji, patrz https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout.

Powiązane problemy