在网上发现这些讲纹理的文章,非常不错

android 游戏导引(4. 简单纹理贴图)

http://www.cnblogs.com/shengdoushi/archive/2011/01/13/1934181.html


Android OpenGL es 纹理坐标设定与贴图规则

http://blog.csdn.net/cjkwin/article/details/6016224


Android OpenGL | ES给立方体进行纹理映射

http://www.ourunix.org/android/post/34.html


这篇的例子也是立方体的纹理,不过是用手指划过让立方体旋转


使用纹理的重要代码如下

private void loadTexture(GL10 gl){Bitmap bitmap = null;try{// 加载位图bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.sand);int[] textures = new int[1];// 指定生成N个纹理(第一个参数指定生成1个纹理),// textures数组将负责存储所有纹理的代号。gl.glGenTextures(1, textures, 0);// 获取textures纹理数组中的第一个纹理texture = textures[0];// 通知OpenGL将texture纹理绑定到GL10.GL_TEXTURE_2D目标中gl.glBindTexture(GL10.GL_TEXTURE_2D, 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);// 设置在横向、纵向上都是平铺纹理gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);// 加载位图生成纹理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);}finally{// 生成纹理之后,回收位图if (bitmap != null)bitmap.recycle();}}

纹理的装载则是在方法void onSurfaceCreated(GL10 gl, EGLConfig config) 中

在Renderer的 void onDrawFrame(GL10 gl)方法中要启用纹理的数组数据,坐标数据,执行纹理贴图

// 启用贴图座标数组数据gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 设置贴图的的座标数据gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);// 执行纹理贴图gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

完整代码如下

public class Texture3D extends Activityimplements OnGestureListener{// 定义旋转角度private float anglex = 0f;private float angley = 0f;static final float ROTATE_FACTOR = 60;// 定义手势检测器实例GestureDetector detector;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 创建一个GLSurfaceView,用于显示OpenGL绘制的图形GLSurfaceView glView = new GLSurfaceView(this);// 创建GLSurfaceView的内容绘制器MyRenderer myRender = new MyRenderer(this);// 为GLSurfaceView设置绘制器glView.setRenderer(myRender);setContentView(glView);// 创建手势检测器detector = new GestureDetector(this);}@Overridepublic boolean onTouchEvent(MotionEvent me){// 将该Activity上的触碰事件交给GestureDetector处理return detector.onTouchEvent(me);}@Overridepublic boolean onFling(MotionEvent event1, MotionEvent event2,float velocityX, float velocityY){velocityX = velocityX > 4000 ? 4000 : velocityX;velocityX = velocityX < -4000 ? -4000 : velocityX;velocityY = velocityY > 4000 ? 4000 : velocityY;velocityY = velocityY < -4000 ? -4000 : velocityY;// 根据横向上的速度计算沿Y轴旋转的角度angley += velocityX * ROTATE_FACTOR / 4000;// 根据纵向上的速度计算沿X轴旋转的角度anglex += velocityY * ROTATE_FACTOR / 4000;return true;}@Overridepublic boolean onDown(MotionEvent arg0){return false;}@Overridepublic void onLongPress(MotionEvent event){}@Overridepublic boolean onScroll(MotionEvent event1, MotionEvent event2,float distanceX, float distanceY){return false;}@Overridepublic void onShowPress(MotionEvent event){}@Overridepublic boolean onSingleTapUp(MotionEvent event){return false;}public class MyRenderer implements Renderer{// 立方体的顶点座标(一共是36个顶点,组成12个三角形)private float[] cubeVertices = { -0.6f, -0.6f, -0.6f, -0.6f, 0.6f,-0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, -0.6f, -0.6f,-0.6f, -0.6f, -0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f,0.6f, 0.6f, 0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f,0.6f, -0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, 0.6f,0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, -0.6f, 0.6f,-0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f,0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f,-0.6f, 0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, 0.6f,0.6f, 0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, -0.6f,-0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, 0.6f, 0.6f,-0.6f, 0.6f, -0.6f, };// 定义立方体所需要的6个面(一共是12个三角形所需的顶点)private byte[] cubeFacets = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,30, 31, 32, 33, 34, 35, };// 定义纹理贴图的座标数据private float[] cubeTextures = { 1.0000f, 1.0000f, 1.0000f, 0.0000f,0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f, 1.0000f,1.0000f, 0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f,1.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f, 0.0000f,1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f, 1.0000f, 0.0000f,0.0000f, 0.0000f, 0.0000f, 1.0000f, 0.0000f, 1.0000f, 1.0000f,1.0000f, 1.0000f, 0.0000f, 1.0000f, 0.0000f, 0.0000f, 0.0000f,0.0000f, 1.0000f, 0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f,0.0000f, 1.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f,0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f, 1.0000f,0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f };private Context context;private FloatBuffer cubeVerticesBuffer;private ByteBuffer cubeFacetsBuffer;private FloatBuffer cubeTexturesBuffer;// 定义本程序所使用的纹理private int texture;public MyRenderer(Context main){this.context = main;// 将立方体的顶点位置数据数组包装成FloatBuffer;cubeVerticesBuffer = FloatBuffer.wrap(cubeVertices);// 将立方体的6个面(12个三角形)的数组包装成ByteBuffercubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);// 将立方体的纹理贴图的座标数据包装成FloatBuffercubeTexturesBuffer = FloatBuffer.wrap(cubeTextures);}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config){// 关闭抗抖动gl.glDisable(GL10.GL_DITHER);// 设置系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);gl.glClearColor(0, 0, 0, 0);// 设置阴影平滑模式gl.glShadeModel(GL10.GL_SMOOTH);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 设置深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);// 启用2D纹理贴图gl.glEnable(GL10.GL_TEXTURE_2D);// 装载纹理loadTexture(gl);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height){// 设置3D视窗的大小及位置gl.glViewport(0, 0, width, height);// 将当前矩阵模式设为投影矩阵gl.glMatrixMode(GL10.GL_PROJECTION);// 初始化单位矩阵gl.glLoadIdentity();// 计算透视视窗的宽度、高度比float ratio = (float) width / height;// 调用此方法设置透视视窗的空间大小。gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);}public void onDrawFrame(GL10 gl){// 清除屏幕缓存和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 启用顶点座标数据gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// 启用贴图座标数组数据gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 设置当前矩阵模式为模型视图。gl.glMatrixMode(GL10.GL_MODELVIEW);// --------------------绘制第一个图形---------------------gl.glLoadIdentity();// 把绘图中心移入屏幕2个单位gl.glTranslatef(0f, 0.0f, -2.0f);// 旋转图形gl.glRotatef(angley, 0, 1, 0);gl.glRotatef(anglex, 1, 0, 0);// 设置顶点的位置数据gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);// 设置贴图的的座标数据gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);// 执行纹理贴图gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);// 按cubeFacetsBuffer指定的面绘制三角形gl.glDrawElements(GL10.GL_TRIANGLES, cubeFacetsBuffer.remaining(),GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);// 绘制结束gl.glFinish();// 禁用顶点、纹理座标数组gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 递增角度值以便每次以不同角度绘制}private void loadTexture(GL10 gl){Bitmap bitmap = null;try{// 加载位图bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.sand);int[] textures = new int[1];// 指定生成N个纹理(第一个参数指定生成1个纹理),// textures数组将负责存储所有纹理的代号。gl.glGenTextures(1, textures, 0);// 获取textures纹理数组中的第一个纹理texture = textures[0];// 通知OpenGL将texture纹理绑定到GL10.GL_TEXTURE_2D目标中gl.glBindTexture(GL10.GL_TEXTURE_2D, 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);// 设置在横向、纵向上都是平铺纹理gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);// 加载位图生成纹理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);}finally{// 生成纹理之后,回收位图if (bitmap != null)bitmap.recycle();}}}}



更多相关文章

  1. Android(安卓)OpenGLES绘制yuv420纹理
  2. Android(安卓)shap Animation
  3. android图形系统详解六:View layer
  4. android Gallery镜像倒影特效另一种方法
  5. android 游戏引擎libgdx demo cuboc分析
  6. 使用OpenGLES 在 android 上显示摄像头滤镜效果
  7. Android(安卓)OpenGLES2.0(十五)——利用EGL后台处理图像
  8. Android(安卓)关于美颜/滤镜 利用PBO从OpenGL录制视频
  9. Android(安卓)OpenGL——GL10方法介绍

随机推荐

  1. MySQL学习笔记01安装MySQL服务器软件
  2. mysql--查看mysql状态的常用命令
  3. oracle --sql--转换表字段日期格式(年月日
  4. 不制作证书是否能加密SQLSERVER与客户端
  5. 带有GROUP BY id的T-SQL SELECT
  6. 第15天(就业班) 课程回顾、mysql安装、管
  7. Mysql 创建,授权,删除,修改用户
  8. 创业团队为什么要选择Oracle而不是MySQL?
  9. MySQL 的COUNT(x)性能怎么样?
  10. 在CMD查看Mysql数据时出现中文乱码