TexSubImage2D создает искаженную текстуру только для определенных изображений

Я пытаюсь сделать текстуру поверх другой, как на картинке ниже:

  Желаемый

Однако только это изображение отображается правильно. Мои другие изображения искажены и «искажены». Если вы внимательно посмотрите, как будто строки были сдвинуты:

  фактический

В приведенном выше примере я использовал ту же самую фотографию кота на заднем плане. И эта фотография кота, и все другие изображения, которые я генерирую, в конечном итоге искажены, за исключением той особой картинки, по какой-то причине. Я посмотрел на данные EXIF, и кроме того факта, что он не использует sRGB, он находится в том же формате, что и другие. У него есть альфа-канал и все.

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

int height, width = 512;
m_pSubImage = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGBA);

glGenTextures(1, &m_textureObj);
glBindTexture(m_textureTarget, m_textureObj);
...
glActiveTexture(TextureUnit);
glBindTexture(m_textureTarget, m_textureObj);
glTexSubImage2D(GL_TEXTURE_2D, 0, 20, 10, 100, 100, GL_RGBA, GL_UNSIGNED_BYTE, m_pSubImage);

Код для загрузки фонового изображения похож, за исключением того, что он использует этот вызов вместо glTexSubImage2D:

glTexImage2D(m_textureTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_pImage);

0

Решение

Похоже, что вы не передаете ширину и высоту правильно glTexSubImage2D, Обратите внимание, что вам нужно количество пикселей, сохраняемых на одну строку развертки, которое часто не совсем соответствует «логической» ширине изображения, но округляется до кратного 4.

Разница между «логической» и «хранилищной» шириной оставит несколько отступных пикселей на каждой строке сканирования, которые будут интерпретироваться как крайние левые пиксели следующей строки сканирования, и будут накапливаться при перемещении изображения вниз. Это создает наклонный эффект, который вы наблюдаете.

0

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

Похоже, вы не проверяете ошибки. Следующие режимы отказа glTexSubImage2D Особенно актуальны здесь:

  • GL_INVALID_VALUE генерируется, если xoffset < 0, xoffset + width > w, yoffset < 0, yoffset + height > h, где w это ширина и h высота текстурного изображения, которое будет изменено.

  • GL_INVALID_VALUE генерируется, если ширина или высота меньше 0.

  • GL_INVALID_OPERATION генерируется, если массив текстур не был определен предыдущим glTexImage2D или же glCopyTexImage2D операция чья internalformat соответствует формату glTexSubImage2D,

0

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