Я пытаюсь сделать текстуру поверх другой, как на картинке ниже:
Однако только это изображение отображается правильно. Мои другие изображения искажены и «искажены». Если вы внимательно посмотрите, как будто строки были сдвинуты:
В приведенном выше примере я использовал ту же самую фотографию кота на заднем плане. И эта фотография кота, и все другие изображения, которые я генерирую, в конечном итоге искажены, за исключением той особой картинки, по какой-то причине. Я посмотрел на данные 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);
Похоже, что вы не передаете ширину и высоту правильно glTexSubImage2D
, Обратите внимание, что вам нужно количество пикселей, сохраняемых на одну строку развертки, которое часто не совсем соответствует «логической» ширине изображения, но округляется до кратного 4.
Разница между «логической» и «хранилищной» шириной оставит несколько отступных пикселей на каждой строке сканирования, которые будут интерпретироваться как крайние левые пиксели следующей строки сканирования, и будут накапливаться при перемещении изображения вниз. Это создает наклонный эффект, который вы наблюдаете.
Похоже, вы не проверяете ошибки. Следующие режимы отказа 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
,