我正在寻找将BufferedImage中包含的4分量像素数据打包成OpenGL可以使用的格式的最有效(CPU,而非内存)方式。
据我所知,在Java方面,有 TYPE_4BYTE_ABGR 和 TYPE_INT_ARGB ,在GL方面有 GL_RGBA 和 GL_BGRA 。请注意,这意味着重新映射alpha组件。目前从Java到GL我做了类似的事情:
int w = image.getWidth(), h = image.getHeight();
for (int i=0;i<w;i++)
for (int j=0;j<h;j++)
{
int col = image.getRGB(i, j);
data.put(4*(j*w+i), (byte)((col >> 16) & 0xff));
data.put(4*(j*w+i)+1, (byte)((col >> 8) & 0xff));
data.put(4*(j*w+i)+2, (byte)((col >> 0) & 0xff));
data.put(4*(j*w+i)+3, (byte)((col >> 24) & 0xff));
}
其中data是 ByteBuffer ,然后将 GL_RGBA 格式发送到其中一个 glTexture 方法。
我并不是真的在寻找上述代码的轻微调整(除非您认为它们会产生重大影响),而是一种避免完全重新映射的方法。或者至少避免 getRGB 中的颜色转换。例如,在Java中处理 TYPE_3BYTE_BGR 时,我可以将其直接发送到 GL_BGR 并填充缓冲区:
data.put(((DataBufferByte)image.getData().getDataBuffer()).getData());