Я использую 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);
Я, вероятно, должен упомянуть об этом, но некоторые изображения были отрисованы правильно, я думал, что это потому, что ширина! = Высота. Но это не так, изображения с шириной! = Высота также загружаются нормально.
Но для других изображений я все еще получаю эту проблему.
Вам, вероятно, нужно позвонить
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
перед загрузкой данных текстуры с glTexImage2D
,
GL_UNPACK_ALIGNMENT
Определяет требования выравнивания для начала каждой строки пикселей
в памяти. Допустимые значения: 1 (выравнивание байтов), 2 (строки)
выровнены по четным байтам), 4 (выравнивание слов) и 8 (начало строк
на границах из двух слов).
Значение по умолчанию для выравнивания равно 4, и ваша библиотека загрузки изображений, вероятно, возвращает данные пикселей с выровненными байтами строками, что объясняет, почему некоторые из ваших изображений выглядят нормально (когда ширина кратна четырем).
Всегда старайтесь использовать ширину и высоту изображений в два раза, потому что некоторые графические процессоры поддерживают текстуры только в разрешении 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 🙂