Hi all.
Today I will show my code for loading non-power of 2 bitmaps for textures.
Quite simple.
loadTexture():
MathUtils.java
Today I will show my code for loading non-power of 2 bitmaps for textures.
Quite simple.
loadTexture():
int imageWidth = mBitmap.getWidth();
int imageHeight = mBitmap.getHeight();
int height = imageHeight;
int width = imageWidth;
boolean convert = false;
if(!MathUtils.isPowerOfTwo(height)) {
height = MathUtils.nextPowerOfTwo(height);
convert = true;
}
if(!MathUtils.isPowerOfTwo(width)) {
width = MathUtils.nextPowerOfTwo(width);
convert = true;
}
float maxS = imageWidth / (float)width;
float maxT = imageHeight / (float)height;
setTextureCoordinates(new float[]{ 0f, maxT,
maxS, maxT,
0f, 0f,
maxS, 0f });
ByteBuffer data = ByteBuffer.allocateDirect(width * height * 4);
data.order(ByteOrder.nativeOrder());
if(convert) {
Bitmap tmpImage = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(tmpImage);
canvas.drawBitmap(mBitmap, new Matrix(), null);
mBitmap.recycle();
tmpImage.copyPixelsToBuffer(data);
tmpImage.recycle();
} else {
mBitmap.copyPixelsToBuffer(data);
mBitmap.recycle();
}
data.position(0);
gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, width, height, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE,
data);
data.clear();
data = null;
MathUtils.java
public class MathUtils {
static public int nextPowerOfTwo(int value) {
if (value == 0)
return 1;
if ((value & value - 1) == 0)
return value;
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
return value + 1;
}
static public boolean isPowerOfTwo(int value) {
return value != 0 && (value & value - 1) == 0;
}
}
So here if we have a non-power of 2, we set the convert falg to true and create a bitmap with closest size.
No comments:
Post a Comment