2013-03-14 131 views
-1

我将OpenGL纹理2D中的像素读入字节数组(无符号字符),因为它通常是完成的。但是现在我需要将其转换为图像数组(我认为是整数)从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你的情况)。无符号整数的范围是[0,2 -1],所以这将是整数图像数组中返回值的范围。如果您需要不同范围的值(例如GL_UNSIGNED_BYTES),则需要手动将值转换为您需要的范围。个人而言,如果其中一种数据类型OpenGL可以返回匹配所需值的范围,请尝试使用该类型。

+0

如果我的纹理具有RGBA和RGBA8作为内部格式,并且我将它读作无符号字节,那么tee数据的范围是0-255吗? – 2013-03-14 19:14:30

+0

是的。在这种情况下,甚至不应该进行任何转换,因为RGBA8很可能使用无符号字节来存储组件。 – radical7 2013-03-14 19:41:44