C ++ SOIL не загружает маленькие изображения - PullRequest
3 голосов
/ 17 марта 2019

У меня возникли некоторые проблемы при попытке загрузить меньшие текстуры для моей пиксельной игры с использованием SOIL. Вот результат при загрузке изображения 40 x 40: enter image description here

enter image description here

Но когда я переключаюсь на 30 х 40: enter image description here

enter image description here

Я проверил свой код, если есть какие-либо проблемы, когда ширина меньше высоты, а для 40 х 50 все в порядке. Я проверил это 30 х 40 с помощью средства просмотра изображений Windows, и там тоже все в порядке. Единственное, что может повлиять на загрузчик, - это использование оси координат для установки позиции, но это работает правильно. Это код для загрузки текстуры:

glGenTextures(1, &actor.texture);
glBindTexture(GL_TEXTURE_2D, actor.texture);
unsigned char* image = SOIL_load_image(("App/Textures/" + name + ".png").c_str(), &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Ответы [ 2 ]

5 голосов
/ 17 марта 2019

Проблема не в малом размере, но 30 не делится на 4: 30 = 2 * 3 * 5.Настройка хранилища пикселей по умолчанию OpenGL предполагает, что строки выровнены по 4-байтовым границам.Для изображения 40 × 40 это условие оказывается выполненным, потому что независимо от того, какой формат пикселя вы используете, ширина имеет коэффициент 4.

Решение состоит в том, чтобы сообщить OpenGL, что строки пикселей начинаются с другогоn-байтовая граница:

unsigned char* image = SOIL_load_image(…);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(…);
5 голосов
/ 17 марта 2019

Когда изображение загружается в объект текстуры, тогда GL_UNPACK_ALIGNMENT должно быть установлено в 1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 

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

Если размер изображения равен 40 x 50, тогда размер строки в байтах равен 120, что делится на 4.
Но если размер изображения равен 30 x 40,размер строки в байтах равен 90, что не делится на 4.

...