Текстура не отображается правильно? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь отобразить текстуру JPG, используя OpenGL, но у меня есть некоторые проблемы.Это важная часть моего кода:

unsigned char* data = stbi_load("resources/triangle.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}

Файл JPG, который я пытаюсь загрузить, можно загрузить здесь .Он работает с определенными файлами JPG, но не с этим, так что он явно относится к форматированию - но что и почему?

Так отображается текстура

1 Ответ

0 голосов
/ 22 сентября 2018

Он работает с определенными файлами JPG, но не с этим, так что он явно относится к форматированию - но что и почему?

По умолчанию OpenGL предполагает, что размер каждой строкиизображения выровнены на 4 байта.

Это потому, что параметр GL_UNPACK_ALIGNMENT по умолчанию равен 4.

Поскольку изображение имеет 3 цветовых канала (потому что егоJPG) и плотно упакован, размер строки изображения может не выравниваться до 4 байтов.Обратите внимание, что если ширина изображения будет равна 4, то он будет выровнен до 4 байтов, потому что 4 * 3 = 12 байтов.Но если ширина будет 5, она не будет выровнена до 4, потому что 5 * 3 = 15 байтов.

Это приводит к тому, что строки изображения кажутся неуместными.Установите GL_UNPACK_ALIGNMENT в 1, чтобы решить вашу проблему:

glPixelStore( GL_UNPACK_ALIGNMENT, 1 );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);

Также обратите внимание, что вы предполагаете, что изображение имеет 3 цветовых канала из-за параметра формата GL_RGB в glTexImage2D.В этом случае это работает из-за формата файла JPG.stbi_load возвращает количество цветовых каналов, содержащихся в буфере изображения (nrChannels).
Соблюдайте его, используя GL_RGB или GL_RGBA для параметра формата, как-то так:

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
    nrChannels == 3 ? GL_RGB : GL_RGBA,
    GL_UNSIGNED_BYTE, data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...