2012-03-12 122 views
3

我在使用纹理地图集在OpenGL中创建纹理对象时出现问题,我创建了2D游戏,并且知道如何纹理POT位图到对象,但是,我似乎无法找到教程在转换我的代码使用纹理地图集出于性能原因,这是我的代码为我的当前工作对象创建和纹理实现。在Android中使用纹理地图集和openGL 1.1的纹理示例

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 2012-03-12 06:17:50

+1

我不知道如何绑定纹理图集的子图像,我只知道如何将图像作为一个整体进行绑定,比如,我必须先使用texImage2d然后使用texSubImage?或者我必须立即使用texSubImage?谢谢 – Keiichi 2012-03-12 07:01:58

+0

你是怎么解决这个问题的? – hadez30 2014-10-08 11:37:31

回答

1

回应您的意见,你不”绑定子图像。 glTexSubImage仅用于替换存储纹理中的像素。如果你的位图像已经显示的那样已经存在,那么你只需通过glTexImage2d加载整个纹理并绑定它。

如果您想访问该图像的特定部分(比如第一行左边第三个黄色圆圈弹),那么您只需修改您用于访问它的纹理坐标。如果该圆圈在自己的图像中,则只需使用(0,0)到(1,1)坐标,但因为它是另一幅图像的一部分,所以只能选择其中的特定部分。在你的照片有它将有texcoords:

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

如果绘制这些texcoords四看起来应该完全一样,如果黄圈炸弹有它自己的形象,但你不必守重新绑定纹理所有的时间(因此表现增加)。

+0

感谢您为我澄清事情,这将帮助我大好时光:) – Keiichi 2012-03-13 03:53:31