Изображение DevIL некорректно отображается

Я использую OpenGL, я могу правильно загрузить tga файлы, но по какой-то причине, когда я рендеринг jpg файлов, я не вижу их правильно.

Вот как должно выглядеть изображение:

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

И вот как это выглядит .. почему это растягивается? это из-за координат?

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

Вот код, который я использую для рисования.

void Renderer::DrawJpg(GLuint tex, int xi, int yq, int width, int height) const
{
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(0+xi,   0+xi);
glTexCoord2i(0, 1); glVertex2i(0+xi,   height+xi);
glTexCoord2i(1, 1); glVertex2i(width+xi, height+xi);
glTexCoord2i(1, 0); glVertex2i(width+xi, 0+xi);
glEnd();
}

Вот как я загружаю изображение …

imagename=s;
ILboolean success;
ilInit();
ilGenImages(1, &id);
ilBindImage(id);
success = ilLoadImage((const ILstring)imagename.c_str());
if (success)
{
success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE); /* Convert every colour component into
unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA */
if (!success)
{
printf("image conversion failed.");
}
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);

width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);

glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH),
ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE,
ilGetData());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);       // Linear Filtered
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);       // Linear Filtered
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Я, вероятно, должен упомянуть об этом, но некоторые изображения были отрисованы правильно, я думал, что это потому, что ширина! = Высота. Но это не так, изображения с шириной! = Высота также загружаются нормально.
Но для других изображений я все еще получаю эту проблему.

0

Решение

Вам, вероятно, нужно позвонить

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

перед загрузкой данных текстуры с glTexImage2D,

От справочные страницы:

GL_UNPACK_ALIGNMENT

Определяет требования выравнивания для начала каждой строки пикселей
в памяти. Допустимые значения: 1 (выравнивание байтов), 2 (строки)
выровнены по четным байтам), 4 (выравнивание слов) и 8 (начало строк
на границах из двух слов).

Значение по умолчанию для выравнивания равно 4, и ваша библиотека загрузки изображений, вероятно, возвращает данные пикселей с выровненными байтами строками, что объясняет, почему некоторые из ваших изображений выглядят нормально (когда ширина кратна четырем).

1

Другие решения

Всегда старайтесь использовать ширину и высоту изображений в два раза, потому что некоторые графические процессоры поддерживают текстуры только в разрешении NPOT. (например, 128×128, 512×512, но не 123×533, 128×532)

И я думаю, что здесь вместо GL_REPEAT вы должны использовать GL_CLAMP_TO_EDGE 🙂
GL_REPEAT используется, когда ваши координаты текстуры> 1.0f, CLAMP_TO_EDGE тоже, но гарантирует, что изображение заполнит многоугольник без нежелательных линий на краях. (это блокирует вашу линейную фильтрацию по краям)

Не забудьте опробовать код, в котором используются числа с плавающей точкой (пример из комментария) 🙂

Вот хорошее объяснение http://open.gl/textures 🙂

1

По вопросам рекламы [email protected]