Он работает с определенными файлами 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);