我是一位有用的助手,可以翻译文本。
我正在尝试使用Bitmap类从Java加载纹理以在NDK OpenGL中使用。虽然它可以工作,但是我遇到了像素格式的问题。
首先,在Java中,我像这样从assets文件夹加载位图:
正如您所见,像素格式存在问题。
问题是:如何最有效地从 Java bitmap 类生成 RGBA8888 格式的像素缓冲区,或者如何以 ARGB8888 格式加载 GL 纹理?
肯定有一种方法,而不是逐个像素手动交换字节吧?
我目前正在这样做:
或许还有其他错误?说实话,我并不确定关于
谢谢!
我正在尝试使用Bitmap类从Java加载纹理以在NDK OpenGL中使用。虽然它可以工作,但是我遇到了像素格式的问题。
首先,在Java中,我像这样从assets文件夹加载位图:
Bitmap bitmap = BitmapFactory.decodeStream(amgr.open(path));
return bitmap.copy(Bitmap.Config.ARGB_8888, false);
位图配置不支持RGBA通道顺序选项。
[JNI事情在这里发生]
使用GLES 1,我像这样缓冲纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// `pixels` is the pixel buffer I produced earlier.
正如您所见,像素格式存在问题。
glTexImage2D
没有 ARGB 选项,但 Java 的 Bitmap 类没有创建 RGBA 缓冲区的选项。因此,我得到了混乱的颜色通道。顺便说一下,我确实需要 alpha 通道。问题是:如何最有效地从 Java bitmap 类生成 RGBA8888 格式的像素缓冲区,或者如何以 ARGB8888 格式加载 GL 纹理?
肯定有一种方法,而不是逐个像素手动交换字节吧?
我目前正在这样做:
void pxl::swap_channels_ARGB_to_RGBA(void *pixBuf, const int len)
{
jint *pixels = (jint *)pixBuf;
for(int i = 0; i < len; i++)
{
jint pixel = pixels[i];
jint a = (pixel >> 24) & 0xFF;
jint r = (pixel >> 16) & 0xFF;
jint g = (pixel >> 8) & 0xFF;
jint b = (pixel >> 0) & 0xFF;
pixels[i] = (jint)(a | (r << 24 ) | (g << 16) | (b << 8));
}
}
或许还有其他错误?说实话,我并不确定关于
glTexImage2D
选项的内容。谢谢!