【问题标题】:opengl java loading png textures not working properlyopengl java加载png纹理无法正常工作
【发布时间】:2015-04-05 23:52:28
【问题描述】:

我正在尝试将 png 文件加载为纹理,但即使我没有任何错误,我也无法看到纹理。我唯一得到的是一种颜色的正方形。我已经搜索了示例,但我看不出我在做什么错误。代码如下:

        final Image image = SWTImageFactory.getImage(ImageFactory.CROSS_SYMBOL_IMAGE);
        final ImageData imageData = image.getImageData();

        ByteBuffer buffer = ByteBuffer.allocate(4*imageData.width * imageData.height);
        int p, r, g, b, a;

        for (int y = 0; y<imageData.height; y++) {
            for (int x = 0; x < imageData.width; x++) {

                p =  imageData.getPixel(x, y);
                a = (p >> 24) & 0xFF;  // get pixel bytes in ARGB order
                r = (p >> 16) & 0xFF;
                g = (p >> 8) & 0xFF;
                b = (p >> 0) & 0xFF;

                buffer.put((byte)r);   // fill in bytes in RGBA order
                buffer.put((byte)g);
                buffer.put((byte)b);
                buffer.put((byte)a); 
             }
        }

        buffer.rewind();
        gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 4,imageData.width, imageData.height,0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buffer);

        gl.glEnable(GL.GL_TEXTURE_2D);
        int [] textures = new int [1];
        gl.glGenTextures(1, textures, 0); 

        gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]);

        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
        gl.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);

        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);  

        gl.glBegin(GL.GL_QUADS);

        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3f(100.0f, 100.0f, 0.0f);

        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3f(100.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3f(200.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3f(200.0f, 100.0f, 0.0f);

        gl.glEnd();
        gl.glDisable(GL.GL_TEXTURE_2D);

【问题讨论】:

  • 欢迎来到 StackOverflow,希望您阅读FAQ

标签: java opengl textures


【解决方案1】:

您在绑定任何纹理(或者可能绑定其他一些纹理)之前调用gl.glTexImage2D,但是此函数会更改当前绑定的纹理对象的纹理图像。所以在你的代码中你应该在gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0])之后调用它。

顺便说一下,我希望这段代码不会在每一帧(绘图函数暗示)都被调用,因为你不应该在每一帧(不管你实际上并没有删除它)。您实际上应该在一些初始化代码中创建纹理对象,将图像放入其中并调整其参数,这样在绘图代码中您只需调用glBindTexture(可能还有glEnable(GL_TEXTURE_2D)或类似的东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2011-05-18
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多