【发布时间】:2018-08-25 14:57:37
【问题描述】:
我正在使用 LWJGL(Java 的 OpenGL)库进行纹理映射。 这是从文件中读取图像的代码:
BufferedImage image = ImageIO.read(new File(url));
获取数据栅格(图像像素)为字节数组的代码:
DataBufferByte imageByteBuffer = ((DataBufferByte)image.getRaster().getDataBuffer());
byte[] bytePixels = imageByteBuffer.getData();
现在是创建“bytePixels”数组并将其放入字节缓冲区的代码:
pixels = BufferUtils.createByteBuffer(bytePixels.length);
pixels.put(bytePixels);
pixels.flip();
这里用于将所有这些绑定到缓冲区:
id = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, image.getWidth(), image.getHeight(), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixels);
问题是,纹理图像的颜色不是原始图像颜色!!
原图:
纹理图像:
这个对OpenGL Renders texture with different color than original image?的回答,不能解决这个问题,因为GL_BGR在lwjgl Class GL11中无效!
【问题讨论】:
-
“问题是,纹理图像的颜色不是原始图像?” - 有什么区别?
-
@Rabbid76 不同之处如上图所示!!
-
问题是红色和蓝色通道交换了。这是 OpenGL 还是 OpenGL ES?您使用哪个 OpenGL 版本?
-
您的图片很可能是
BGR格式。只需在glTexImage2D()呼叫中尝试GL11.GL_BGR。 -
@Jaa 不,在这个版本的 OpenGL 中没有
GL_BGR格式。见Class GL11