Java 尝试使用openGL创建纹理时缓冲区大小不足

Java 尝试使用openGL创建纹理时缓冲区大小不足,java,opengl,textures,buffer,bufferedimage,Java,Opengl,Textures,Buffer,Bufferedimage,我目前正在尝试使用JOGL生成带纹理的多边形曲面,但收到一条错误消息,我不明白。Eclipse告诉我“java.lang.IndexOutOfBoundsException:缓冲区中需要430233个剩余字节,只有428349个”。就我所见,readTexture方法生成的缓冲图像的大小不足以与glTex2D()方法一起使用。然而,我不知道如何着手解决这个问题。下面是代码的相关部分,如有任何帮助,将不胜感激 public void init(GLAutoDrawable drawable) {

我目前正在尝试使用JOGL生成带纹理的多边形曲面,但收到一条错误消息,我不明白。Eclipse告诉我“java.lang.IndexOutOfBoundsException:缓冲区中需要430233个剩余字节,只有428349个”。就我所见,readTexture方法生成的缓冲图像的大小不足以与glTex2D()方法一起使用。然而,我不知道如何着手解决这个问题。下面是代码的相关部分,如有任何帮助,将不胜感激

public void init(GLAutoDrawable drawable) 
{
    final GL2 gl = drawable.getGL().getGL2();
    GLU glu = GLU.createGLU();
    //Create the glu object which allows access to the GLU library\

    gl.glShadeModel(GL2.GL_SMOOTH);              // Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
    gl.glClearDepth(1.0f);                      // Depth Buffer Setup
    gl.glEnable(GL.GL_DEPTH_TEST);              // Enables Depth Testing
    gl.glDepthFunc(GL.GL_LEQUAL);               // The Type Of Depth Testing To Do
    gl.glEnable(GL.GL_TEXTURE_2D);
    texture = genTexture(gl);
    gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
    TextureReader.Texture texture = null;
    try {
        texture = TextureReader.readTexture   ("/C:/Users/Alex/Desktop/boy_reaching_up_for_goalpost_stencil.png");
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
    makeRGBTexture(gl, glu, texture, GL.GL_TEXTURE_2D, false);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

}

private void makeRGBTexture(GL gl, GLU glu, TextureReader.Texture img, 
        int target, boolean mipmapped) {

    if (mipmapped) {
        glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), 
                img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels());
    } else {
        gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), 
                img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels());
    }
}

private int genTexture(GL gl) {
    final int[] tmp = new int[1];
    gl.glGenTextures(1, tmp, 0);
    return tmp[0];
}

    //Within the TextureReader class
    public static Texture readTexture(String filename, boolean storeAlphaChannel)

                    throws IOException {

            BufferedImage bufferedImage;

            if (filename.endsWith(".bmp")) {

                    bufferedImage = BitmapLoader.loadBitmap(filename);

            } else {

                    bufferedImage = readImage(filename);

            }

            return readPixels(bufferedImage, storeAlphaChannel);

    }

错误是由makeRGBTexture()方法内对glTexImage2D()的调用生成的。

默认情况下,GL希望图像的每一行都从可被4整除的内存地址开始(4字节对齐)。对于RGBA图像,情况总是如此(只要第一个像素正确对齐)。但对于RGB图像,只有当宽度也可被4整除时才会出现这种情况。请注意,这与非常旧的GPU的“两个电源”要求完全无关

使用227x629的特定图像分辨率,每行可获得681个字节,因此GL每行可额外增加3个字节。对于629行,这将产生1887个额外字节。如果你看看这些数字,你会发现缓冲区只有1884字节。3的差异只是因为我们不需要最后一行末尾的3个填充字节,因为没有下一行要开始,GL不会读取超过该数据结尾的数据


因此,这里有两个选项:按照预期的方式对齐图像数据(即,在每一行中添加一些额外的字节),或者-从用户的角度来看,更简单的方法-通过调用
(GL\u UNPACK\u alignment,1)告诉GL您的数据是紧密打包的(1字节对齐)
在指定图像数据之前。

这看起来像是解包对齐的问题。你的图像分辨率是多少?我打赌它恰好是宽度不能被4整除。尺寸是227 x 629。两者都需要被4整除吗?这就是红皮书在谈到需要使用gluScaleImage()使宽度和高度都是2的幂时的意思吗?