Загрузка текстуры OpenGL: UNSIGNED_BYTE против UNSIGNED_INT_8_8_8_8 - PullRequest
10 голосов
/ 16 октября 2011

Я звоню glTexSubImage2D.Если мой пиксельный формат GL_RGBA, тогда типы пикселей GL_UNSIGNED_BYTE и GL_UNSIGNED_INT_8_8_8_8 полностью эквивалентны?

Кроме того, эти две пары эквивалентны?

  • Format = GL_RGBA, Type = GL_UNSIGNED_INT_8_8_8_8
  • Format = GL_BGRA, Type = GL_UNSIGNED_INT_8_8_8_8_REV

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

1 Ответ

21 голосов
/ 16 октября 2011

Ответы: «Нет» и «Нет». Вам нужно подумать о порядке байтов на вашем компьютере. Если у вас есть GL_RGBA и GL_UNSIGNED_INT_8_8_8_8, это означает, что пиксели хранятся в 32-разрядных целых числах, а цвета имеют логический порядок RGBA в таком целом числе, например, красный находится в старшем байте, а альфа - в младшем байте. Но если машина имеет младший порядок (как с процессорами Intel), из этого следует, что фактический порядок в памяти - ABGR. Принимая во внимание, что GL_RGBA с GL_UNSIGNED_BYTE будет хранить байты в порядке RGBA независимо от того, является ли компьютер прямым или старшим.

GL_BGRA с GL_UNSIGNED_INT_8_8_8_8_REV будет хранить цвета в целых числах в логическом порядке ARGB, но затем на машине с прямым порядком байтов вы получите порядок BGRA в памяти.

...