我在使用纹理图集在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]);
这是我假设的纹理位图
答案 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绘制四边形,它应该看起来就像黄色圆形炸弹有自己的图像,但你不必一直保持重新绑定纹理(因此性能提高)。