Прежде всего, вам не следует использовать 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#ffffffff
8#ffffffff
8
Это сообщает 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