android OpenGLES开发 第五课 纹理映射

来源:互联网 发布:谷歌输入法 mac 编辑:程序博客网 时间:2024/06/05 01:06

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

public class Polygon {// 保存纹理的FloatBufferprivate 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;// 初始化保存纹理的FloatBuffertextureBuffer = 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 directoryfor (int i = 0; i < 8; i++) {Bitmap bitmap = loadBitmap(context, resourcesIds[i]);// Generate one texture pointer...// ...and bind it to our arraygl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);// Create Nearest Filtered Texturegl.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 bitmapGLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);// Clean upbitmap.recycle();}}// 加载bitmappublic Bitmap loadBitmap(Context context, int resourceid) {InputStream is = context.getResources().openRawResource(resourceid);try {// BitmapFactory is an Android graphics utility for imagesreturn BitmapFactory.decodeStream(is);} finally {// Always clear and closetry {is.close();is = null;} catch (IOException e) {}}}}


 

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