OpenGL将RGBA字节像素转换为图像整数数组

时间:2013-03-14 16:22:35

标签: c++ opengl

我将OpenGL纹理2D中的像素读取到字节数组(unsigned char)中,因为它通常已经完成。但是现在我需要将其转换为图像数组(我想的是整数),以便加载图像的布局和像素范围从CPU进行逆向处理。 我的问题是 - 这样做是否足够:

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 个答案:

答案 0 :(得分:1)

当OpenGL加载纹理时,它会将传入像素转换为{{1>}调用中指定的内部格式提供的格式。此操作可能包括从像素格式glTexImage*()的第三个参数)到内部格式的映射步骤,并且通常包括映射到范围[0,1]或[之一]之一-1,1],然后到每个组件的内部格式范围。例如,GL_FLOAT的像素格式和GL_RGBA8的内部格式将使输入值从范围[0,1]映射到范围[0,255]。

使用glTexImage*()检索纹素时,过程反向完成,因此输出像素值(每个组件)将在指定的输出类型范围内(例如,在您的情况下为GL_UNSIGNED_INT) 。无符号整数的范围是[0,2 32 -1],因此这将是整数图像数组中返回的值的范围。如果您需要不同范围内的值(例如,GL_UNSIGNED_BYTES),则需要手动将值转换为您需要的范围。

就个人而言,如果OpenGL可以返回的某个数据类型与您需要的值范围匹配,请尝试使用该类型。