Параметр STBI_rgb
указывает на загрузку сгенерированной текстуры с 3 цветными каналами. Это приводит к тому, что буфер изображения (image
) состоит из 3 байтов на пиксель.
Но когда вы задаете двухмерное изображение текстуры с помощью glTexImage2D
, тогда указанный формат равен GL_RGBA
, что предполагает 4 канала и т. Д. 4 байта на пиксель.
Это приводит к тому, что буфер данных считывается за пределы. Измените параметр формата на GL_RGB
, чтобы решить это.
Также обратите внимание, что по умолчанию OpenGL предполагает, что начало каждой строки изображения выровнено на 4 байта. Это связано с тем, что параметр GL_UNPACK_ALIGNMENT
по умолчанию равен 4. Поскольку изображение имеет 3 цветовых канала и плотно упакован, начало строки, возможно, смещено.
Измените параметр GL_UNPACK_ALIGNMENT
параметр до 1, прежде чем указывать двухмерное изображение текстуры (glTexImage2D
).
Более того, текстура не является (mipmap) завершенной. Начальное значение GL_TEXTURE_MIN_FILTER
составляет GL_NEAREST_MIPMAP_LINEAR
. Если вы не измените его и не создадите мип-карты, то текстура не является «полной» и не будет «показана». См. glTexParameter
.
Либо установите минифицирующий фильтр на GL_NEAREST
или GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
, либо сгенерируйте мип-карты с помощью glGenerateMipmap(GL_TEXTURE_2D)
, чтобырешить проблему.
например:
glBindTexture(GL_TEXTURE_2D, t);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);