-1

我像通常那样将 OpenGL 纹理 2D 中的像素读取到字节数组(无符号字符)中。但现在我需要将其转换为图像数组(我想是整数),以便从 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 范围内吗?

4

1 回答 1

1

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

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

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

于 2013-03-14T19:09:24.563 回答