Формат данных для glDrawPixels() в JOGL

Теперь я запутался с функцией glDrawPixels(). Я знаю, что сигнатура функции выглядит так: gl.glDrawPixels (ширина int, высота int, формат, тип, данные);

Я не уверен, как сделать данные типа формата согласованными. например, мне нужно использовать формат GL2.GL_RGB, я прошу type=GL2.GL_DOUBLE, GL2.GL_FLOAT, GL2.GL_BYTE соответственно. Как выглядят данные? как мне обернуть и отформатировать мои данные в Java перед вызовом функции glDrawPixels().


person SkyOasis    schedule 12.02.2013    source источник


Ответы (1)


Прежде всего, вам не следует использовать glDrawPixels. Это очень медленная функция и в большинстве реализаций OpenGL не очень оптимизирована. Вместо этого вы должны использовать текстурированный четырехугольник. Но ваш вопрос также относится к параметрам glTexImage2D.

Так что же означают эти параметры. Давайте посмотрим на сигнатуру glTexImage2D.

C SPECIFICATION
   void glTexImage2D( GLenum target,
                      GLint level,
                      GLint internalformat,
                      GLsizei width,
                      GLsizei height,
                      GLint border,
                      GLenum format,
                      GLenum type,
                      const GLvoid *pixels )
  • internalformat обозначает формат, который данные будут иметь внутри OpenGL.

  • format — это формат данных в pixels, который имеет точно то же значение, что и одноименный параметр в glDrawPixels. По сути, format сообщает OpenGL, сколько элементов приходится на пиксель данных в pixels.

  • type сообщает OpenGL тип, содержащий один пиксель. Теперь это интересно, потому что это нетривиально.

Рассмотрим некоторые комбинации:

формат = GL_BGRA, тип = GL_UNSIGNED_INT#ffffffff8#ffffffff8

Это сообщает OpenGL, что пиксель состоит из 4 элементов в следующем порядке: синий, зеленый, красный и альфа, и что все четыре элемента содержатся в одном беззнаковом целом числе из 32 бит, разделенном на 4 группы по 8 бит в каждой. Возможно, вы знаете, что цветовая нотация HTML, например. #ffffffff для записи. По сути, это 32-битное целое число без знака в шестнадцатеричной системе счисления.

У вас может быть массив 32-битных целых чисел без знака

uint32_t pixels[] = {
 0xffffffff, 0x0000ffff, 0xffffffff,
 0x0000ffff, 0xffffffff, 0x0000ffff,
 0xffffffff, 0x0000ffff, 0xffffffff,
};

Это будет изображение размером 3×3 красного бриллианта на белом фоне.

формат = GL_RGB, тип = GL_UNSIGNED_BYTE

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

Тогда наш красный бриллиант выглядел бы так

uint8_t pixels[] = {
    0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff,
    0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00,
    0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff
};

формат = GL_RGBA, тип = GL_FLOAT (или GL_DOUBLE)

В этом случае каждый элемент пикселя является отдельным числом с плавающей запятой в диапазоне [0; 1]. Алмаз тогда будет выглядеть как

float pixels[] = {
    0., 1., 0.,
    1., 0., 1.,
    0., 1., 0.
};

Для GL_DOUBLE это выглядит точно так же, но с double вместо float.


Надеюсь, теперь вы поняли основную суть

person datenwolf    schedule 13.02.2013
comment
Я понимаю ваш пример для примера uint32_t и uint_8. как насчет плавающих чисел, таких как GL_FLOAT и GL_DOUBLE, есть ли подходящий массив/контейнер для хранения данных пикселей? - person SkyOasis; 13.02.2013