Autor Wątek: [SOLVED] Ładowanie 24-bitowej tekstury  (Przeczytany 400 razy)

Offline karol57

  • Użytkownik

# Lipiec 01, 2017, 21:52:12
Głupi problem, nie umiem załadować 24-bitowej tekstury...

Jako 32-bity działa:
        static const
        GLubyte defaultCheckerData[5][5][4] =
                {{{0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u}},
                 {{0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}},
                 {{0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}},
                 {{192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u}},
                 {{255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}}};

        GLuint defaultChecker;
        gl::GenTextures(1, &defaultChecker);
        gl::BindTexture(gl::TEXTURE_2D, defaultChecker);
        gl::TexImage2D(gl::TEXTURE_2D, 0, gl::RGB, 5, 5, 0, gl::RGBA, gl::UNSIGNED_BYTE, defaultCheckerData);
        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST);
        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST);

A jako 24 już otrzymuję dziwne kolory
        static const
        GLubyte defaultCheckerData[5][5][/* było 4 */3] =
                {{{0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u}},
                 {{0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}},
                 {{0u,   0u,   0u},   {192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}},
                 {{192u, 192u, 192u}, {255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u}},
                 {{255u, 0u,   0u},   {0u,   128u, 128u}, {0u,   0u,   255u}, {0u,   0u,   0u},   {192u, 192u, 192u}}};

        GLuint defaultChecker;
        gl::GenTextures(1, &defaultChecker);
        gl::BindTexture(gl::TEXTURE_2D, defaultChecker);
        gl::TexImage2D(gl::TEXTURE_2D, 0, gl::RGB, 5, 5, 0, /* było gl::RGBA */gl::RGB, gl::UNSIGNED_BYTE, defaultCheckerData);
        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST);
        gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST);

W screenach pokazane jak to wygląda...
« Ostatnia zmiana: Lipiec 03, 2017, 16:25:48 wysłana przez karol57 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline kalicjusz

  • Użytkownik
    • Kidler3D

# Lipiec 01, 2017, 23:45:01
Spróbuj dokończyć tworzenie tekstury w ten lub podobny sposób:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Ewentualnie jako parametr format funkcji glTexImage2D przekazać GL_BGR.

Offline albireo

  • Użytkownik

  • +1
# Lipiec 02, 2017, 15:56:03
Spróbuj przed wywołaniem gl::TexImage2D(...)
dać
gl::PixelStorei(gl::PACK_ALIGNMENT, 1);

Offline voytech

  • Użytkownik

  • +1
# Lipiec 03, 2017, 04:01:00
https://www.khronos.org/opengl/wiki/Common_Mistakes#Texture_upload_and_pixel_reads

zgodnie z tym co tam piszą to długość linii nie jest podzielna przez 4. U ciebie jest 5*3 = 15 i dlatego się kaszani.

https://www.khronos.org/opengl/wiki/Image_Format#Image_format_queries

tutaj podane jak można kartę wypytać czy sobie inny format wewnętrzny zastosuje od tego zasugerowanego przez usera.

Offline karol57

  • Użytkownik

# Lipiec 03, 2017, 16:25:33
@albireo
*gl::UNPACK_ALIGNMENT

@albireo @voytech
Bingo! Wyrównanie w liniach odrzuciłem od razu, bo w pierwszej linii kolory nie pasowały mi w ogóle... Okazało się, że patrzyłem się na teksturę od dupy strony i pierwsza linia rzeczywiście jest zachowana...