Android OpenGL ES画金字塔并为每一面贴不同的纹理图

这里记录下自己学习的小总结吧,前段时间常常看见有人问怎么为一个物体的每一面贴不同的纹理图,我这里给出为一个为金字塔形状四面贴不同纹理图的例子,有需要的朋友可以看看。下面上代码:

第一步: Main.java,在入口Activity中定义一个内部类,用于获取Bitmap用的。

class BitGL {
	public static Bitmap bitmap;
	public static void init(Resources resources) {
		bitmap = BitmapFactory.decodeResource(resources, R.drawable.walla);
	}
}

第二步:在MySurfaceView.java中的onSurfaceCreated()方法中初始化金字塔类,并赋相应的值。

py = new Pyramid(gl,15.0f, 2.6f, 5.0f, 0, mContext); // 初始化金子塔

绘制金字塔的时候在onDrawFrame()方法中调用py.drawSlef(gl); 画金字塔

第三步:然后就是画金字塔并贴图了,注意,这是一个单独的类。

public class Pyramid {
	Context mContext = null;
	private int one = 0x10000;
	public float mAngleX;
	public float mAngleY;

	private IntBuffer mVertexBuffer;
	private FloatBuffer mTexBuffer;

	FloatBuffer lightDiffuse = FloatBuffer.wrap(new float[] { 0.5f, 0.5f, 0.5f, 1.0f });

	FloatBuffer specularParams = FloatBuffer.wrap(new float[] { 0.5f, 1.0f, 0.5f, 1.0f });

	FloatBuffer lightPosition = FloatBuffer.wrap(new float[] { 0.3f, 0.0f, 2.0f, 1.0f });

	int vertices[] = { 0, one, 0, -one, -one, one, one, -one, one,

	0, one, 0, one, -one, one, one, -one, -one,

	0, one, 0, one, -one, -one, -one, -one, -one,

	0, one, 0, -one, -one, -one, -one, -one, one };

	// 纹理点
	private int[] texCoords = { 0, one, one, one, 0, 0, one, 0 };

	float x, y, z;

	boolean isY = true;

	private Bitmap bitmap;
	private int[] textureids = null;
	private IntBuffer texBuffer;
	private Bitmap[] bit = new Bitmap[4];

	public Pyramid(GL10 gl, float x, float y, float z, float rot, Context context) {
		this.mContext = context;
		this.x = x;
		this.y = y;
		this.z = z;
		ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
		vbb.order(ByteOrder.nativeOrder());
		mVertexBuffer = vbb.asIntBuffer();
		mVertexBuffer.put(vertices);
		mVertexBuffer.position(0);

		// 初始化
		textureids = new int[4];

		bit[0] = BitmapFactory.decodeResource(mContext.getResources(),
				R.drawable.walla);
		bit[1] = BitmapFactory.decodeResource(mContext.getResources(),
				R.drawable.wallb);
		bit[2] = BitmapFactory.decodeResource(mContext.getResources(),
				R.drawable.walld);
		bit[3] = BitmapFactory.decodeResource(mContext.getResources(),
				R.drawable.wallf);

		// 实例化bitmap
		bitmap = BitGL.bitmap;

		ByteBuffer tbbs = ByteBuffer.allocateDirect(texCoords.length * 3 * 4);
		tbbs.order(ByteOrder.nativeOrder());
		texBuffer = tbbs.asIntBuffer();
		// 为每一个面贴上纹理
		for (int i = 0; i < 3;="" i++)="" {="" texbuffer.put(texcoords);="" }="" texbuffer.position(0);="" ********="" 贴图开始="" ********/="" 打开纹理="" gl.glenable(gl10.gl_texture_2d);="" intbuffer="" ib="IntBuffer.allocate(4);" gl.glgentextures(4,="" ib);="" textureids="ib.array();" gl.glgentextures(4,="" textureids,="" 0);="" 4个纹理个数,用于四面="" 绑定要使用的纹理="" gl.glbindtexture(gl10.gl_texture_2d,="" textureids[0]);="" 生成纹理="" glutils.teximage2d(gl10.gl_texture_2d,="" 0,="" bit[0],="" 0);="" 线性滤波="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_min_filter,="" gl10.gl_linear);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_mag_filter,="" gl10.gl_linear);="" gl.glbindtexture(gl10.gl_texture_2d,="" textureids[1]);="" glutils.teximage2d(gl10.gl_texture_2d,="" 0,="" bit[1],="" 0);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_min_filter,="" gl10.gl_linear);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_mag_filter,="" gl10.gl_linear);="" gl.glbindtexture(gl10.gl_texture_2d,="" textureids[2]);="" glutils.teximage2d(gl10.gl_texture_2d,="" 0,="" bit[2],="" 0);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_min_filter,="" gl10.gl_linear);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_mag_filter,="" gl10.gl_linear);="" gl.glbindtexture(gl10.gl_texture_2d,="" textureids[3]);="" glutils.teximage2d(gl10.gl_texture_2d,="" 0,="" bit[3],="" 0);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_min_filter,="" gl10.gl_linear);="" gl.gltexparameterx(gl10.gl_texture_2d,="" gl10.gl_texture_mag_filter,="" gl10.gl_linear);="" ********="" 贴图结束="" ********/="" }="" public="" void="" drawslef(gl10="" gl)="" {="" gl.glpushmatrix();="" gl.gltranslatef(x,="" y,="" z);="" 绘制对象的位置="" gl.glrotatef(manglex,="" 0,="" 1,="" 0);="" 对象的x旋转角度="" gl.glrotatef(mangley,="" 1,="" 0,="" 0);="" 对象的y旋转角度="" gl.glenableclientstate(gl10.gl_vertex_array);="" gl.glenableclientstate(gl10.gl_texture_coord_array);//="" 使用纹理数组="" gl.glvertexpointer(3,="" gl.gl_fixed,="" 0,="" mvertexbuffer);="" gl.gltexcoordpointer(2,="" gl10.gl_fixed,="" 0,="" texbuffer);="" define="" for="" (int="" i="0;" i="">< 4;="" i++)="" {="" 创建纹理="" gl.glbindtexture(gl10.gl_texture_2d,="" textureids[i]);="" gl.gldrawarrays(gl10.gl_triangle_strip,="" i="" *="" 3,="" 3);="" }="" gl.gldisable(gl10.gl_texture_2d);//="" 关闭纹理="" gl.gldisableclientstate(gl10.gl_texture_coord_array);="" gl.gldisableclientstate(gl10.gl_vertex_array);="" gl.glloadidentity();="" manglex++;="" if="" (isy)="" {="" mangley="mAngleY" +="" 0.01f;="" if="" (mangley=""> 1.8) {
				isY = false;
			}
		} else {
			mAngleY = mAngleY - 0.01f;
			if (mAngleY < -2.5)="" {="" isy="true;" }="" }="" gl.glpopmatrix();="" }="" }="">

下面是Pyramid.java类的下载,有些多余的调试代码可以删掉。

Pyramid.rar

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心