android OpenGLES开发 第五课 纹理映射

这里我们将加入纹理来代替颜色设置不同表面的内容,和上一课不同的地方是在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的图片代替文中的图片资源。

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值