在Android中使用纹理集和OpenGL 1.1进行样本纹理化

3

我在使用纹理图集时遇到了OpenGL中的物体纹理问题,我正在创建一个2D游戏,知道如何将POT位图纹理化到对象上,但是,出于性能原因,我无法找到使用纹理图集的教程。这里是我当前工作中对象创建和纹理实现的代码。

public void createTexture(Bitmap bmp, GL10 gls, int texturename)
    {
        this.gl = (GL11) gls;

        this.TextureName = texturename;
        bombBmp = bmp;

        VertexBuffer = null;
        TextureBuffer = null;
        IndexBuffer = null;

        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(12 * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
        VertexBuffer = byteBuffer.asFloatBuffer();
        VertexBuffer.put(new float[] { 0, 0, 0.0f, 0, -h, 0.0f, w, 0, 0.0f, w, -h, 0.0f });
        VertexBuffer.position(0);

        byteBuffer = ByteBuffer.allocateDirect(8 * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
        TextureBuffer = byteBuffer.asFloatBuffer();
        TextureBuffer.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f });
        TextureBuffer.position(0);

        byteBuffer = ByteBuffer.allocateDirect(6 * 2);
        byteBuffer.order(ByteOrder.nativeOrder());
        IndexBuffer = byteBuffer.asShortBuffer();
        IndexBuffer.put(new short[] { 0, 1, 2, 1, 3, 2 });
        IndexBuffer.position(0);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, this.TextureName);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bombBmp, 0);
        bombBmp.recycle();
        bombBmp = null;
    }

我从genTexture生成我的Texturename,并将POT位图传递给此函数。
gl.glGenTextures(1, textures, 0);
bomb.createTexture(bombBmp, gl, textures[0]);

这是我假定的纹理位图。

bomb_atlas.png


1
关于纹理图集,你具体不明白什么?你知道纹理坐标是如何工作的吗?我认为没有人会为你重写代码,但如果有一些你不理解的特定概念,你可能会找到一些帮助。 - Tim
1
我不知道如何将纹理图集中的子图像绑定到程序中,我只知道如何将整张图像绑定,比如说,我是应该先使用texImage2d再用texSubImage绑定吗?还是直接使用texSubImage就可以了?谢谢。 - Karl John Hernandez
你是怎么修复这个问题的? - hadez30
1个回答

1
回应您的评论,您不需要绑定子图像。glTexSubImage仅用于替换存储纹理中的像素。如果您的位图已经存在于图集中,就像您展示的那样,那么您只需通过glTexImage2d加载整个纹理并将其绑定即可。
如果您想访问该图像的特定部分(例如第一行左起第三个黄色圆形炸弹),则只需修改用于访问它的纹理坐标即可。如果该圆形是自己的图像,则只需使用(0,0)到(1,1)的坐标,但由于它是另一个图像的一部分,因此您必须选择其中的特定部分。在您的图片中,它的纹理坐标将为:
(.50,.75) //bottom left
(.75,.75) //bottom right
(.75,1.0) //top right
(.50,1.0) //top left

如果您使用这些纹理坐标绘制四边形,它应该看起来就像黄色圆形炸弹有自己的图像,但是您不必一直重新绑定纹理(因此性能会提高)。

非常感谢您为我澄清事情,这将对我有很大的帮助 :) - Karl John Hernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接