C++ SOIL не загружает маленькие изображения

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

введите здесь описание изображения

Но когда я переключаюсь на 30 x 40: введите здесь описание изображения

введите здесь описание изображения

Я проверил свой код, есть ли проблемы, когда ширина меньше высоты, и для 40 х 50 все в порядке. Я проверил это 30 x 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);

person Popescu Flaviu    schedule 17.03.2019    source источник
comment
Если вы сохраните изображение с помощью SOIL_save_image и откроете его в Windows, это правильно? Что происходит с маленькими квадратными изображениями и большими прямоугольными изображениями?   -  person Quimby    schedule 17.03.2019
comment
Также какой-либо OpenGL потерпел неудачу? проверьте glError и если пока все в порядке, то как вы это нарисуете?   -  person Quimby    schedule 17.03.2019
comment
Я никогда не пытался сохранить, но я пробовал, и в обоих случаях у меня не было файла: unsigned char* image = SOIL_load_image(("App/Textures/" + name + ".png").c_str(), &width, &height, 0, SOIL_LOAD_RGB); SOIL_save_image("test.bmp", SOIL_SAVE_TYPE_BMP, width, height, 0, image);   -  person Popescu Flaviu    schedule 17.03.2019
comment
Я также не получаю ошибок OpenGL.   -  person Popescu Flaviu    schedule 17.03.2019
comment
При сохранении поставить 3 как третий параметр - количество каналов. Вы можете писать 0 при загрузке, потому что он задается четвертым параметром.   -  person Quimby    schedule 17.03.2019
comment
Больше не надо, решил. Я также буду иметь это в виду.   -  person Popescu Flaviu    schedule 17.03.2019
comment
Все в порядке, рад, что у вас все получилось :)   -  person Quimby    schedule 17.03.2019


Ответы (2)



Проблема не в маленьком размере, а в том, что 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(…);
person datenwolf    schedule 17.03.2019
comment
@PopescuFlaviu: Здесь не гонка :-) - person datenwolf; 17.03.2019