Java 为什么纹理以错误的颜色显示

Java 为什么纹理以错误的颜色显示,java,opengl,jogl,Java,Opengl,Jogl,我正在渲染具有立方体纹理的skybox。但是纹理的颜色被证明是错误的。下面的代码用于加载图像。这是因为GL_RGB格式吗?有什么想法吗 protected void loadImageData() { String fileDir; for (int i = 0; i < 6; i++) { fileDir = "images/skybox/sky" + (i + 1) + ".jpg"; try {

我正在渲染具有立方体纹理的skybox。但是纹理的颜色被证明是错误的。下面的代码用于加载图像。这是因为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();
        }
    }
}
受保护的void loadImageData()
{
字符串fileDir;
对于(int i=0;i<6;i++)
{
fileDir=“images/skybox/sky”+(i+1)+“.jpg”;
尝试
{
buffereImage image=ImageIO.read(新文件(fileDir));
字节[]数据=((DataBufferByte)image.getData().getDataBuffer()).getData();
imageBuff[i]=GLBuffers.newDirectByteBuffer(数据);
}
捕获(IOE异常)
{
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);
loadImageData();
gl.glGenTextures(1,立方英尺);
gl.glBindTexture(GL4.gl_纹理_立方体_贴图,cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.gl_纹理_立方体_贴图,0,GL4.gl_RGB8,imageSize,imageSize);
对于(int i=0;i<6;i++)
{
gl.glTexImage2D(GL4.gl_纹理_立方体_贴图_正X+i,0,GL4.gl_RGB8,
imageSize,imageSize,0,GL4.GL_RGB,GL4.GL_无符号_字节,imageBuff[i]);
}
gl.glTexParameteri(GL4.gl_纹理_立方体_贴图,GL4.gl_纹理_贴图过滤器,GL4.gl_线性);
gl.glTexParameteri(GL4.gl_纹理_立方体_贴图,GL4.gl_纹理_最小_过滤器,GL4.gl_线性);
原始图像:

映射结果:

更新:

提供了此替代方案:最终证明颜色正确,但仍然存在一个小问题(方向相反),请参见以下结果:

    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);
stringfiledir;
TextureData texData=null;
对于(int i=0;i<6;i++)
{
fileDir=“images/skybox/sky”+(i+1)+“.jpg”;
尝试
{
texData=TextureIO.newTextureData(gl.getGLProfile(),
新文件(fileDir),false,TextureIO.JPG);
texDataBuff[i]=texData.getBuffer();
texDataBuff[i].倒带();
//请注意,用于skybox的图像必须是正方形
imageSize=texData.getHeight();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
gl.glGenTextures(1,立方英尺);
gl.glBindTexture(GL4.gl_纹理_立方体_贴图,cubeTexBuff.get(0));
gl.glTexStorage2D(GL4.gl_纹理_立方体_贴图,0,GL4.gl_RGB8,imageSize,imageSize);
对于(int i=0;i<6;i++)
{
gl.glTexImage2D(GL4.gl_纹理_立方体_贴图_正X+i,0,GL4.gl_RGB8,
imageSize,imageSize,0,texData.getPixelFormat(),texData.getPixelType(),texDataBuff[i]);
}
gl.glTexParameteri(GL4.gl_纹理_立方体_贴图,GL4.gl_纹理_贴图过滤器,GL4.gl_线性);
gl.glTexParameteri(GL4.gl_纹理_立方体_贴图,GL4.gl_纹理_最小_过滤器,GL4.gl_线性);
原始图像:

映射结果:


您可以通过翻页来完成此操作

            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

的话,您可以将其翻转回去,尝试类似@elect Fixed的方法。非常感谢你。但我仍然不知道为什么我不能用我的方式实现这一点。检查internalFormat、pixelFormat、pixelType和对齐方式。你可以翻转纹理坐标或使用更快速、更健壮的TextureIO。