`

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类的下载,有些多余的调试代码,可以删掉
1
3
分享到:
评论

相关推荐

    opengles画中画功能

    OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个精简版本,专为嵌入式设备,特别是移动设备如智能手机和平板电脑设计,用于处理2D和3D图形。在Android系统中,OpenGL ES是主要的图形库,它允许开发者创建...

    Android OpenGL ES分小块贴图并画点画线(10x10矩形)

    本主题将深入探讨如何在Android环境下使用OpenGL ES进行分小块贴图,并实现画点、画线功能,特别是在10x10矩形范围内操作。 首先,了解基本概念: 1. **纹理贴图(Texture Mapping)**:在OpenGL ES中,贴图是二维...

    Android平台OpenGLES生成使用Mipmap纹理

    该案例代码为Android 平台OpenGL ES实现举例,有两个作用: ...2、使用 OpenGLES 生成与使用Mipmap纹理,构建远处模糊,近处清晰的效果。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/8873106

    opengles多重纹理动画

    在"opengles多重纹理动画"这个主题中,我们将深入探讨如何在OpenGL ES中实现多重纹理效果,以及如何将这些效果应用到动态动画中。 在OpenGL ES中,多重纹理是一种高级图形技术,它允许在一个像素着色过程中同时使用...

    Android openGL ES 画球

    Android openGL ES 画球

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    Android OpenGl ES绘制圆点与优化圆点锯齿

    在Android平台上,OpenGL ES是一种广泛使用的图形库,用于在移动设备上实现高性能的2D和3D图形渲染。本文将深入探讨如何使用OpenGL ES来绘制圆点,并介绍一种方法来优化圆点边缘的锯齿问题,提升视觉效果。 首先,...

    Android平台 使用OpenGLES3.0实现纹理纹理、颜色混合

    在Android平台,使用OpenGLES3.0实现纹理纹理、颜色混合代码实现举例。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/121634894

    android openGL ES 2.0画等边三角形,正方形

    android openGL ES 2.0画等边三角形,正方形

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    为了在OpenGL ES中显示图片,你需要定义一个顶点数组,指定每个像素的位置,以及一个纹理坐标数组,告诉OpenGL如何映射纹理到几何形状。 在JNI中,可以创建一个简单的四边形(如一个矩形)作为渲染的目标,然后使用...

    Android OpenGL ES 2.0学习书籍.rar

    最后,了解如何与硬件加速的OpenGLES API交互,以及熟悉GLSL语言(OpenGL Shading Language),是成为OpenGL ES 2.0专家的必经之路。通过编写高效、可读性强的着色器代码,可以创造出各种复杂的视觉效果,实现令人...

    android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码

    OpenGL ES 是 Android 平台上用于高性能图形渲染的重要框架,它基于 OpenGL 标准,专为嵌入式系统设计,如移动设备。在Android应用中,OpenGL ES 常用于游戏开发、3D图形显示和复杂视觉效果的实现。本教程将深入探讨...

    android opengl es 圆锥纹理贴图

    这个教程或代码示例可能是为了帮助开发者理解如何在Android平台上使用OpenGL ES为圆锥形几何体添加纹理。 在OpenGL ES中,纹理贴图是通过将二维图像映射到三维模型表面来实现的。这涉及到几个关键概念: 1. **纹理...

    Android平台使用OpenGLES2.0显示YUV数据

    总结起来,这个项目涉及到Android Camera API的使用,YUV到RGB的数据转换,OpenGLES2.0纹理处理,以及`GLSurfaceView`的使用。通过实践和学习这些知识点,开发者可以实现高效、流畅的摄像头预览效果,并为后续的视频...

    Android OpenGL实现立方体多纹理图片映射

    为了在立方体的六个面上分别应用不同的纹理,我们需要准备六张独立的2D纹理图片,并确保它们与立方体的面一一对应。 接着,我们将讨论如何构建立方体的顶点数据。一个简单的立方体由六个正方形面组成,每个面有四个...

    Android OpenGL ES 绘制三维/空间坐标系透明

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建高性能的2D和3D图形。在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程...

    Android平台OpenGLES3将GL-TEXTURE-2D纹理id渲染到ImageReader提供的Surface上

    1、OpenGLES3中加载GL_TEXTURE_2D纹理,生成纹理ID; 2、通过EGL构建EGLDisplay虚拟屏幕,并绑定ImageReader提供的Surface; 3、在EGL线程中,渲染GL_TEXTURE_2D对应的纹理图形; 4、在EGL线程中,完成渲染后,通过...

Global site tag (gtag.js) - Google Analytics