在android中使用Texture atlas和openGL 1.1进行纹理化处理

时间:2012-03-12 05:44:56

标签: android opengl-es textures

我在使用纹理图集在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 个答案:

答案 0 :(得分:1)

回复您的评论,您不会绑定子图像。 glTexSubImage仅用于替换存储纹理中的像素。如果您的位图已经作为您显示的地图集存在,那么您只需通过glTexImage2d加载整个纹理并绑定它。

如果要访问该图像的特定部分(比如第一行左边第3个黄色圆形炸弹),则只需修改用于访问它的纹理坐标。如果那个圆圈在它自己的图像中,你只需要使用(0,0)到(1,1)坐标,但因为它是另一个图像的一部分,你必须只选择它的一个特定部分。在你的照片中,它会有以下的texcoords:

(.50,.75) //bottom left
(.75,.75) //bottom right
(.75,1.0) //top right
(.50,1.0) //top left

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