您的位置:首页 > 移动开发 > Android开发

android OpenGLES开发 第五课 纹理映射

2011-08-16 18:54 387 查看
这里我们将加入纹理来代替颜色设置不同表面的内容,和上一课不同的地方是在Polygon类中加入了一些纹理的设置,下面将一一描述,代码如下:

public class Polygon {
// 保存纹理的FloatBuffer

private FloatBuffer[] textureBuffer;

// 用来加载纹理的数组
private int[] textures = new int[8];

// 保存纹理顶点坐标的数组

private float[][] texture = {
new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.5f, 0.0f,
1.0f, 1.0f, 1.0f,

},
new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.5f, 0.0f,
1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

}, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

} };

public Polygon() {
ByteBuffer bb;
// 初始化保存纹理的FloatBuffer

textureBuffer = new FloatBuffer[8];
for (int i = 0; i < 8; i++) {
bb = ByteBuffer.allocateDirect(texture[i].length * 4);
bb.order(ByteOrder.nativeOrder());
textureBuffer[i] = bb.asFloatBuffer();
textureBuffer[i].put(texture[i]);
textureBuffer[i].position(0);
}

}

public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CW);

for (int i = 0; i < 8; i++) {
// Generate one texture pointer...
// ...and bind it to our array

// 生成一个纹理引用,并把它和当前的数组绑定
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
// Point to our buffers
// 设置纹理坐标

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer[i]);
// Enable the texture state
// 加入纹理坐标的权限

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Disable the client state before leaving
// 取消纹理坐标的权限

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

}

// 加载和绑定纹理的方法
public void loadTexture(GL10 gl, Context context) {
// define the resourcesId
int[] resourcesIds = { R.drawable.gou, R.drawable.hou,
R.drawable.laohu, R.drawable.laoshu, R.drawable.tuzi,
R.drawable.xiaolong, R.drawable.xiaoniu, R.drawable.zhu };
gl.glGenTextures(8, textures, 0);
// Get the texture from the Android resource directory
for (int i = 0; i < 8; i++) {
Bitmap bitmap = loadBitmap(context, resourcesIds[i]);
// Generate one texture pointer...
// ...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);

// Create Nearest Filtered Texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
// Use the Android GLUtils to specify a two-dimensional texture
// image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
// Clean up
bitmap.recycle();
}
}

// 加载bitmap

public Bitmap loadBitmap(Context context, int resourceid) {

InputStream is = context.getResources().openRawResource(resourceid);
try {
// BitmapFactory is an Android graphics utility for images
return BitmapFactory.decodeStream(is);

} finally {
// Always clear and close
try {
is.close();
is = null;
} catch (IOException e) {
}
}
}
}


 

可以到网上找一些256x256的图片代替文中的图片资源。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息