没有光滑的OpenGL纹理

时间:2014-01-24 23:12:22

标签: java lwjgl graphics2d

我在没有Slick Utils库的情况下搜索了Texture Implementations。 我找到了两种方法来做到这一点:

第一个,在字节缓冲区中保存奇怪的字节移位像素:

int loadTexture(){
        try{
            BufferedImage img = ImageIO.read(getClass().getClassLoader().getResourceAsStream("background.png"));
            int pixels[] = new int[img.getWidth() * img.getHeight()];
            img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());
            ByteBuffer buffer = BufferUtils.createByteBuffer(img.getWidth() * img.getHeight() * 3);
            for(int x = 0; x < img.getWidth(); x++){
                for(int y = 0; y < img.getHeight(); y++){
                    int pixel = pixels[y * img.getWidth() + x];
                    buffer.put((byte) ((pixel >> 16) & 0xFF));
                    buffer.put((byte) ((pixel >> 8) & 0xFF));
                    buffer.put((byte) (pixel & 0xFF));
                }
            }
            buffer.flip();
            int textureId = glGenTextures();
            glBindTexture(GL_TEXTURE_2D, textureId);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, img.getWidth(), img.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);
            return textureId;
        }
        catch(Exception e){
            e.printStackTrace();
            return 0;
        }
    }

这也会返回一个纹理ID,我也不知道如何使用这个id。

第二种方法不进行任何字节移位,并使用IntBuffer:此外,它是一个现成的类来保存带有名称的不同纹理等等。 这些守则:

ublic class TextureIO {

    private final IntBuffer texture;
    private final int       width;
    private final int       height;

    private int             id;


    public TextureIO(final InputStream inputStream) throws IOException {

        BufferedImage image = ImageIO.read(inputStream);

        width = image.getWidth();
        height = image.getHeight();

        final AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
        tx.translate(0, -height);

        final AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
        image = op.filter(image, null);

        final int[] pixels = image.getRGB(0, 0, width, height, null, 0, width);
        texture = BufferUtils.createIntBuffer(pixels.length);
        texture.put(pixels);
        texture.rewind();

    }


    public void init() {

        GL11.glEnable(GL11.GL_TEXTURE_2D);

        final IntBuffer buffer = BufferUtils.createIntBuffer(1);
        GL11.glGenTextures(buffer);
        id = buffer.get(0);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);

        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, width, height, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, texture);

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);

    }


    public void bind() {

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);

    }


    public void unbind() {

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);

    }


}

我是lwjgl开发的新手,想知道哪个版本更好。因为我是朋友自己实现这样的事情,我希望lwjgl.jar成为我自己使用的库。

我在不同的网站上阅读,buffer.flip()方法是必要的。但为什么?为什么第二个版本不这样做?另外,我想了解这两种实现之间的区别,第一种情况发生了什么?第二种情况发生了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

这两个都是非常糟糕的实施IMO。我建议观看this视频以获得更标准的方法。虽然您还必须使用PNGDecoder.jar库,但它就像是lwjgl库的扩展。