为什么纹理显示颜色错误
Why texture is displayed with the wrong color
我正在渲染一个带有立方体纹理的天空盒。但是纹理的颜色结果是错误的。下面的代码用于加载图像。那是因为 GL_RGB 格式吗?有什么想法吗?
protected void loadImageData()
{
String fileDir;
for (int i = 0; i < 6; i++)
{
fileDir = "images/skybox/sky" + (i + 1) + ".jpg";
try
{
BufferedImage image = ImageIO.read(new File(fileDir));
byte[] data = ((DataBufferByte) image.getData().getDataBuffer()).getData();
imageBuff[i] = GLBuffers.newDirectByteBuffer(data);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
设置纹理:
loadImageData();
gl.glGenTextures(1, cubeTexBuff);
gl.glBindTexture(GL4.GL_TEXTURE_CUBE_MAP, cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.GL_TEXTURE_CUBE_MAP, 0, GL4.GL_RGB8, imageSize, imageSize);
for (int i = 0; i < 6; i++)
{
gl.glTexImage2D(GL4.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL4.GL_RGB8,
imageSize, imageSize, 0, GL4.GL_RGB, GL4.GL_UNSIGNED_BYTE, imageBuff[i]);
}
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR);
原图:
映射结果:
更新:
有了这个替代方案:enter link description here颜色终于对了,但还是有点小问题(方向反了),结果见下图:
String fileDir;
TextureData texData = null;
for (int i = 0; i < 6; i++)
{
fileDir = "images/skybox/sky" + (i + 1) + ".jpg";
try
{
texData = TextureIO.newTextureData(gl.getGLProfile(),
new File(fileDir), false, TextureIO.JPG);
texDataBuff[i] = texData.getBuffer();
texDataBuff[i].rewind();
//notice that the image used for skybox must be square
imageSize = texData.getHeight();
}
catch (IOException e)
{
e.printStackTrace();
}
}
gl.glGenTextures(1, cubeTexBuff);
gl.glBindTexture(GL4.GL_TEXTURE_CUBE_MAP, cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.GL_TEXTURE_CUBE_MAP, 0, GL4.GL_RGB8, imageSize, imageSize);
for (int i = 0; i < 6; i++)
{
gl.glTexImage2D(GL4.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL4.GL_RGB8,
imageSize, imageSize, 0, texData.getPixelFormat(), texData.getPixelType(), texDataBuff[i]);
}
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR);
原图:
映射结果:
你可以这样做,包括翻转
ImageUtil.flipImageVertically(imageBuff[i]);
{
TextureData textureData = AWTTextureIO.newTextureData(gl3.getGLProfile(), textureBuffIm,
mipmap);
gl3.glBindTexture(GL3.GL_TEXTURE_2D, objects[Objects.texture.ordinal()]);
{
int[] alignment = new int[1];
gl3.glGetIntegerv(GL3.GL_UNPACK_ALIGNMENT, alignment, 0);
// System.out.println("alignment[0] "+alignment[0]);
// System.out.println("textureData.getAlignment() "+textureData.getAlignment());
if (alignment[0] != textureData.getAlignment()) {
gl3.glPixelStorei(GL3.GL_UNPACK_ALIGNMENT, textureData.getAlignment());
}
{
gl3.glTexImage2D(GL3.GL_TEXTURE_2D, 0, textureData.getInternalFormat(), textureData.getWidth(),
textureData.getHeight(), textureData.getBorder(), textureData.getPixelFormat(),
textureData.getPixelType(), textureData.getBuffer());
}
if (alignment[0] != textureData.getAlignment()) {
gl3.glPixelStorei(GL3.GL_UNPACK_ALIGNMENT, alignment[0]);
}
记住 AWTTextureIO
总是翻转纹理,所以如果你想要它正确,你之前翻转它,这样 AWTTextureIO
会翻转回来,你将拥有原始图像。
如果您仍然需要使用 imageBuffered
,您可以将其翻转回来
我正在渲染一个带有立方体纹理的天空盒。但是纹理的颜色结果是错误的。下面的代码用于加载图像。那是因为 GL_RGB 格式吗?有什么想法吗?
protected void loadImageData()
{
String fileDir;
for (int i = 0; i < 6; i++)
{
fileDir = "images/skybox/sky" + (i + 1) + ".jpg";
try
{
BufferedImage image = ImageIO.read(new File(fileDir));
byte[] data = ((DataBufferByte) image.getData().getDataBuffer()).getData();
imageBuff[i] = GLBuffers.newDirectByteBuffer(data);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
设置纹理:
loadImageData();
gl.glGenTextures(1, cubeTexBuff);
gl.glBindTexture(GL4.GL_TEXTURE_CUBE_MAP, cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.GL_TEXTURE_CUBE_MAP, 0, GL4.GL_RGB8, imageSize, imageSize);
for (int i = 0; i < 6; i++)
{
gl.glTexImage2D(GL4.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL4.GL_RGB8,
imageSize, imageSize, 0, GL4.GL_RGB, GL4.GL_UNSIGNED_BYTE, imageBuff[i]);
}
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR);
原图:
映射结果:
更新:
有了这个替代方案:enter link description here颜色终于对了,但还是有点小问题(方向反了),结果见下图:
String fileDir;
TextureData texData = null;
for (int i = 0; i < 6; i++)
{
fileDir = "images/skybox/sky" + (i + 1) + ".jpg";
try
{
texData = TextureIO.newTextureData(gl.getGLProfile(),
new File(fileDir), false, TextureIO.JPG);
texDataBuff[i] = texData.getBuffer();
texDataBuff[i].rewind();
//notice that the image used for skybox must be square
imageSize = texData.getHeight();
}
catch (IOException e)
{
e.printStackTrace();
}
}
gl.glGenTextures(1, cubeTexBuff);
gl.glBindTexture(GL4.GL_TEXTURE_CUBE_MAP, cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.GL_TEXTURE_CUBE_MAP, 0, GL4.GL_RGB8, imageSize, imageSize);
for (int i = 0; i < 6; i++)
{
gl.glTexImage2D(GL4.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL4.GL_RGB8,
imageSize, imageSize, 0, texData.getPixelFormat(), texData.getPixelType(), texDataBuff[i]);
}
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_CUBE_MAP, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR);
原图:
映射结果:
你可以这样做,包括翻转
ImageUtil.flipImageVertically(imageBuff[i]);
{
TextureData textureData = AWTTextureIO.newTextureData(gl3.getGLProfile(), textureBuffIm,
mipmap);
gl3.glBindTexture(GL3.GL_TEXTURE_2D, objects[Objects.texture.ordinal()]);
{
int[] alignment = new int[1];
gl3.glGetIntegerv(GL3.GL_UNPACK_ALIGNMENT, alignment, 0);
// System.out.println("alignment[0] "+alignment[0]);
// System.out.println("textureData.getAlignment() "+textureData.getAlignment());
if (alignment[0] != textureData.getAlignment()) {
gl3.glPixelStorei(GL3.GL_UNPACK_ALIGNMENT, textureData.getAlignment());
}
{
gl3.glTexImage2D(GL3.GL_TEXTURE_2D, 0, textureData.getInternalFormat(), textureData.getWidth(),
textureData.getHeight(), textureData.getBorder(), textureData.getPixelFormat(),
textureData.getPixelType(), textureData.getBuffer());
}
if (alignment[0] != textureData.getAlignment()) {
gl3.glPixelStorei(GL3.GL_UNPACK_ALIGNMENT, alignment[0]);
}
记住 AWTTextureIO
总是翻转纹理,所以如果你想要它正确,你之前翻转它,这样 AWTTextureIO
会翻转回来,你将拥有原始图像。
如果您仍然需要使用 imageBuffered