我使用Android NDK和FreeImage库编写游戏,以将图像加载到我的游戏中。它以BGR格式加载图像。可以以RGB格式加载吗?还是我需要手动交换R和B组件?

已编辑

我的设备是三星Galaxy S4(armv7体系结构)。这是代码

FIMEMORY* fiStream = FreeImage_OpenMemory((BYTE*)data, size);
FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiStream);
if (FreeImage_FIFSupportsReading(fif))
{
    dib = FreeImage_LoadFromMemory(fif, fiStream, 0);
}

if (!dib)
    return;

data_ = FreeImage_GetBits(dib);
width_ = FreeImage_GetWidth(dib);
height_ = FreeImage_GetHeight(dib);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width_, height_, 0, GL_RGB, GL_UNSIGNED_BYTE, data_ );

最佳答案

FreeImage实际上实际上不必使用BGR(A)排序。 FreeImage documentation中的“像素访问功能”部分包含以下语句(强调我的意思):


但是,此模型使用的像素布局取决于OS。使用字节存储
为了标记像素布局,然后FreeImage在Little下方使用BGR [A]像素布局
Endian处理器(Windows,Linux),并在Big Endian处理器(Mac OS X或任何Big Endian Linux / Unix)下使用RGB [A]像素布局。做出此选择是为了简化使用
带有图形API的FreeImage。

但是,这种细微差别对用户是透明的。为了使像素访问OS
独立的FreeImage定义了一组用于设置或获取单独颜色的宏
24位或32位DIB中的组件。


但是,当您要将FreeImage的原始像素数据用作OpenGL的源时,这些宏将无济于事。

但是我不知道您的问题是什么。 OpenGL将接受BGR(A)和RGB(A)作为图像数据。实际上,FreeImage的选择还不错,因为BGR(A)很可能是此类平台上的本机数据格式,因此使用这种格式代表了传输图像数据的最有效方法。

10-06 03:01