android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础
效果图:。。。。。。
编写Dad.java
*在Dad构造器中创建和设置场景渲染器为主动渲染,并设置重写触屏时间回调方法以记录触控笔坐标,改变三角形坐标系的位置,使三角形能够在场景中转动
*为声明场景渲染类,在该类中首先设置场景属性,移动坐标系可以绘制三角形
*定义生成纹理ID的方法initTexture,该方法通过接受图片ID和gl引用,将图片转换成Bitmap
package com.scout.eeeeeee; /** * Created by liuguodong on 2017/10/28. */ import java.io.IOException; import java.io.InputStream; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLUtils; import android.view.MotionEvent; public class dad extends GLSurfaceView{ private SceneRenderer mRenderer;//场景渲染器 private float mPreviousY;//上次的触控位置Y坐标 private float mPreviousX;//上次的触控位置X坐标 private float TOUCH_SCALE_FACTOR=180.0f/320;;//角度缩放比例 public int textureId;//纹理的名称ID public dad(Context context) { super(context); // TODO Auto-generated constructor stub mRenderer = new SceneRenderer(); //创建场景渲染器 setRenderer(mRenderer); //设置渲染器 setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染 } @Override public boolean onTouchEvent(MotionEvent e) { float y = e.getY(); float x = e.getX(); switch (e.getAction()) { case MotionEvent.ACTION_MOVE: float dy = y - mPreviousY;//计算触控笔Y位移 float dx = x - mPreviousX;//计算触控笔Y位移 mRenderer.texTri.jiaoY += dy * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度 mRenderer.texTri.mAngleZ += dx * TOUCH_SCALE_FACTOR;//设置沿z轴旋转角度 requestRender();//重绘画面 } mPreviousY = y;//记录触控笔位置 mPreviousX = x;//记录触控笔位置 return true; } private class SceneRenderer implements GLSurfaceView.Renderer { yisuo texTri; int textureId; @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub //清除颜色缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //设置当前矩阵为模式矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); //设置当前矩阵为单位矩阵 gl.glLoadIdentity(); gl.glTranslatef(0, 0f, -2.5f); texTri.drawSelf(gl); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub //设置视窗大小及位置 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, 20); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub //关闭抗抖动 gl.glDisable(GL10.GL_DITHER); //设置特定Hint项目的模式,这里为设置为使用快速模式 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST); //设置屏幕背景色黑色RGBA gl.glClearColor(0,255,255,0); //打开背面剪裁 //gl.glEnable(GL10.GL_CULL_FACE); //设置着色模型为平滑着色 gl.glShadeModel(GL10.GL_SMOOTH);//GL10.GL_SMOOTH GL10.GL_FLAT //启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); //初始化纹理 textureId=initTexture(gl,R.drawable.su); texTri=new yisuo(textureId); } } public int initTexture(GL10 gl,int textureId)//textureId { int[] textures = new int[1]; gl.glGenTextures(1, textures, 0); int currTextureId=textures[0]; gl.glBindTexture(GL10.GL_TEXTURE_2D, currTextureId); 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); InputStream is = this.getResources().openRawResource(textureId); Bitmap bitmapTmp; try { bitmapTmp = BitmapFactory.decodeStream(is); } finally { try { is.close(); } catch(IOException e) { e.printStackTrace(); } } GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapTmp, 0); bitmapTmp.recycle(); return currTextureId; } }
编写yisuo.java,定义三角形类Texture
*创建顶点数组,并将顶点数组放入顶点缓冲区内,为绘制三角形做好准备
*创建纹理坐标数组,并将纹理数组放入纹理坐标缓冲区内,为绘三角形做好准备
*绘制三角形
package com.scout.eeeeeee; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.microedition.khronos.opengles.GL10; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.microedition.khronos.opengles.GL10; public class yisuo { private IntBuffer mVertexBuffer;//顶点坐标数据缓冲 private FloatBuffer mTextureBuffer;//顶点纹理数据缓冲 public float jiaoY;//沿y轴旋转角度 public float mAngleZ;//沿z轴旋转角度 int vCount=0;//顶点数量 int textureId; public yisuo(int textureId) { this.textureId=textureId; //顶点坐标数据的初始化 final int UNIT_SIZE=30000; vCount=3;//顶点的数量 int vertices[]=new int[]//顶点坐标数据数组 { 2*UNIT_SIZE,0,0, -2*UNIT_SIZE,0,0, 0,4*UNIT_SIZE,0 }; //创建顶点坐标数据缓冲 //vertices.length*4是因为一个整数四个字节 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder());//设置字节顺序 mVertexBuffer = vbb.asIntBuffer();//转换为int型缓冲 mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据 mVertexBuffer.position(0);//设置缓冲区起始位置 //初始化顶点纹理数据的 float textureCoors[]=new float[]//顶点纹理S、T坐标值数组 { 0,1, 1,1, 0.5f,0 }; //创建顶点纹理数据缓冲 ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4); cbb.order(ByteOrder.nativeOrder());//设置字节顺序 mTextureBuffer = cbb.asFloatBuffer();//转换为int型缓冲 mTextureBuffer.put(textureCoors);//向缓冲区中放入顶点着色数据 mTextureBuffer.position(0);//设置缓冲区起始位置 } public void drawSelf(GL10 gl) { gl.glRotatef(mAngleZ, 0, 0, 1);//沿Z轴旋转 gl.glRotatef(jiaoY, 0, 1, 0);//沿Y轴旋转 //顶点坐标,允许使用顶点数组 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //为画笔指定顶点坐标数据 gl.glVertexPointer ( 3, //每个顶点的坐标数量为3 xyz GL10.GL_FIXED, //顶点坐标值的类型为 GL_FIXED 0, //连续顶点坐标数据之间的间隔 mVertexBuffer //顶点坐标数据 ); //开启纹理 gl.glEnable(GL10.GL_TEXTURE_2D); //允许使用纹理数组 gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //为画笔指定纹理uv坐标数据 gl.glTexCoordPointer ( 2, //每个顶点两个纹理坐标数据 S、T GL10.GL_FLOAT, //数据类型 0, //连续纹理坐标数据之间的间隔 mTextureBuffer //纹理坐标数据 ); //为画笔绑定指定名称ID纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D,textureId); //绘制图形 gl.glDrawArrays ( GL10.GL_TRIANGLES, 0, vCount ); gl.glDisable(GL10.GL_TEXTURE_2D);//关闭纹理 } }
wenCH.java
package com.scout.eeeeeee; import android.app.Activity; import android.os.Bundle; import android.app.Activity; import android.os.Bundle; public class wenCH extends Activity { /** Called when the activity is first created. */ dad mGLSurfaceView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new dad(this); setContentView(mGLSurfaceView); mGLSurfaceView.requestFocus();//获取焦点 mGLSurfaceView.setFocusableInTouchMode(true);//设置为可触控 } @Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); } }
android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础相关推荐
- OpenGL ES之十——纹理贴图(展示一张图片)
概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...
- OpenGL ES绘制3D纹理贴图
最近看了<疯狂android讲义>的图形相关的内容,结合自己的理解,整理了一下. 下图是做出来的3D纹理贴图效果,手指在屏幕滑动时,图片可以随之转动. 要实现一个纹理贴图,很简单,大致需要 ...
- 适用于ios和android,适用于iOS和Android的OpenGL ES差异
我有一个适用于iOS和 Android的OpenGL ES应用程序.大多数代码是很久以前由另一个人编写的,现在我必须维护它. OpenGL的使用看起来相当简单(游戏是2D,只使用纹理精灵以简单的方式) ...
- 关于OpenGL ES中的纹理压缩
基于OpenGL ES的压缩纹理有常见的如下几种实现: 1. ETC1(Ericcson texture compression) 2. PVRTC(PowerVR texture compressi ...
- Android平台OpenGL ES图像处理(improving)
在Android平台一般使用OpenGL ES进行图像处理.在OpenGL ES中编写算法,实现效果,最后将处理的结果传输给 CPU,然后生成最终的照片. 直播中的美颜,对性能有很高的要求,无法使用特 ...
- OpenGL基本概念入门——纹理贴图
1. 创建纹理图像 OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的. 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生 ...
- Android Studio OpenGL ES绘制三棱锥/四面体的多纹理贴图 每个面使用一张图片渲染
本文参考了王刚的<疯狂Android讲义(第3版)>P554-P559 要求:利用OpenGL ES绘制一个三棱锥,并对每个面进行纹理贴图,每个面使用不同的图片进行渲染. 环境:Andro ...
- opengl android 纹理贴图 代码,Android 使用opengl es的纹理贴图白屏问题请教。
各位大侠好: 我在使用open gl es的做显示的时候,发现一个问题,请各位帮助一下,谢谢. 环境:opengl es 1.x,2D的模式显示纹理图片. 在LG-P990,HTC-C510E上显示附 ...
- android纹理坐标,Android OpenGL ES 7.1纹理绘制
基本原理 与渐变色接近,但有些区别: 渐变色:光栅化过程中,计算出颜色值,然后在片段着色器的时候可以直接赋值 纹理:光栅化过程中,计算出当前片段在纹理上的坐标位置,然后在片段着色器的中,根据这个纹理上 ...
最新文章
- 微信电视来了 微信遥控传屏弹幕统统有
- Windows Mobile下使用ZLIB压缩
- python的运行窗口-Python初学——窗口视窗Tkinter
- 【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案
- ms sql server 系统表详细说明
- 编程人员应该忙里偷闲
- Mysql数据库的备份与恢复
- 移动研发平台EMAS 3.0全新升级,欢迎登陆阿里云官网搜索EMAS进行体验
- php爆路径方法总结
- 四川省评高级教师考职称计算机,四川省中学教师中、高级职称评审条件
- vue-currency-input 金额组件的安装及使用
- Python+PIL 轻松制作九宫格图片
- [附源码]Node.js计算机毕业设计大学生学科竞赛管理系统Express
- 斜度线在CAD中你是怎么画的?
- DB2 for fetch only VS with ur
- 【论文笔记】Map-Based Localization Method for Autonomous Vehicles Using 3D-LIDAR
- java 循环依赖_浅谈Spring解决循环依赖的三种方式
- 交通银行香港分行实施Linux前端系统的开发手记
- SQL 开发应有的一种思维
- PMP认证与企业项目管理的进化之旅
热门文章
- Google 宣布将 Istio 商标转让给 Open Usage Commons 组织
- 计算机病毒由 编制出来,计算机病毒是不是人为编制的呢
- hadoop学习笔记于骑士物语,感谢骑士感谢赵老师。
- JAVA-调用电脑摄像头
- 机器学习-K-近邻算法
- 分布式锁详解及实现案例
- 基于xilinx fpga的ofdm通信系统基带设计_仪器设备研制 | 基于AD9361的雷达干扰信号模拟器设计...
- 一文带你搞定线程池原理
- 计算机网络课程教学,计算机网络课程教学新道路
- android加载url显示图片,如何从android imageview中的dataurl加载图像?