2013-03-14 2 views
-1

Я читал пиксели из текстуры 2D OpenGL в массив байтов (unsigned char), как это обычно делается. Но теперь мне нужно преобразовать его в массив изображений (из целых чисел, я полагаю), чтобы иметь макет и диапазон пикселей изображений, загруженных из CPU для обратного процесса. Мой вопрос - это достаточно просто сделать:OpenGL конвертировать пиксели пикселов RGBA в массив целых чисел изображения

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_INT,bytes); 

вместо:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,bytes); 

, а затем перебрать каждое целое число и преобразовать его из 0-1 диапазона 0-255? Я действительно не нашел примеров такого преобразования без использования 3-сторонних изображений.

Если я это сделать:

  size_t lenght=_viewWidth * _viewHeight ; 
    GLubyte *bytes=(GLubyte*)malloc(lenght); 
    /////////////// read pixels from tex ///////////////////// 
    glBindTexture(GL_TEXTURE_2D,tex); 
    glGetTexImage(GL_TEXTURE_2D,0,GL_BGR,GL_UNSIGNED_BYTE,bytes); 
      uint8_t Rc, Gc, Bc; 
     for(x = 0; x < lenght; x+=3) 
    { 
     Bc = *bytes + x; 
     Gc = *bytes + x + 1; 
     Rc = *bytes + x + 2; 

      } 

ли Rc, Gc и Bc будет в 0-255 диапазоне?

ответ

1

Когда OpenGL загружает текстуру, он преобразует входящие пиксели в формат, указанный в качестве внутреннего формата , как указано в вызове glTexImage*(). Эта операция может включать в себя этап отображения из формата (glTexImage*()) во внутренний формат и часто включает отображение в один из диапазонов [0,1] или [-1,1], а затем на диапазон для внутреннего формата для каждого компонента. Например, формат пикселей GL_FLOAT и внутренний формат GL_RGBA8 приведет к отображению входных значений из диапазона [0,1] в диапазон [0,255].

Когда вы извлекаете тексели с использованием glGetTexImage(), процесс выполняется в обратном порядке, поэтому значения выходных пикселей (для каждого компонента) будут находиться в диапазоне указанного типа вывода (например, GL_UNSIGNED_INT в вашем случае). Диапазон для unsigned ints [0,2 -1], так что это будет диапазон значений, возвращаемых в массив целочисленного изображения. Если вам нужны эти значения в другом диапазоне (например, GL_UNSIGNED_BYTES), вам необходимо вручную преобразовать значения в требуемый диапазон.

Лично, если один из типов данных, которые OpenGL может вернуть, соответствует диапазону значений, которые вам нужны, попробуйте использовать этот тип.

+0

Если у моей текстуры есть RGBA и RGBA8 в качестве внутреннего формата, и я прочитал его как беззнаковый байт, будут ли данные tee в диапазоне 0 -255? –

+0

Да. В этом случае не должно быть никакого преобразования, поскольку RGBA8 скорее всего использует неподписанные байты для хранения компонентов. – radical7