android openGl纹理的使用
今天,简单讲讲android关于纹理的知识。
一、纹理的概念
纹理(texture) 在游戏制作里面指贴图,计算机图形学中的纹理既包括通常意义上物体表面的纹理即使物体表面呈现凹凸不平的沟纹,同时也包括在物体的光滑表面上的彩色图案。
OpenGL中的纹理可以用来表示图像,照片,甚至由一个数学算法生成的分形数据。每个二维的纹理都由许多小的纹理元素组成,它们是小块的数据,类似于我们前面讨论过的片段和像素。要使用纹理,最常用的方式是直接从一个图像文件加载数据。
二、添加纹理
添加纹理分为以下几个步骤
- 打开纹理开关
- 创建纹理
- 绑定纹理
- 设置纹理参数
- 生成纹理
- 设置纹理顶点数据
1. 打开纹理开关
// 启动纹理坐标数据gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//打开纹理gl.glEnable(GL10.GL_TEXTURE_2D);
2. 创建纹理
先要创建纹理名称数组
//纹理名称数组
int [] textureids = new int[1];
然后
//创建纹理gl.glGenTextures(1, textureids, 0);
传入3个参数
void glGenTextures(int n, //数量int[] textures, //纹理名称数组int offset //偏移量);
3. 绑定纹理
前一个参数固定,后一个传入数组元素
//绑定纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]);
有两个参数需要设置下,当纹理比被渲染区域大或者小时,要设置纹理放大或者缩小情况下,OpenG纹理过滤模式
1.
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 1
有以下几种
- GL_NEAREST————最近邻过滤- GL_NEAREST_MIPMAP_NEAREST————使用MIP贴图的最近邻过滤- GL_NEAREST_MIPMAP_LINEAR————使用MIP贴图级别之间插值的最近邻过滤- GL_LINEAR————双线性过滤- GL_LINEAR_MIPMAP_NEAREST————使用MIP贴图的双线性过滤- GL_LINEAR_MIPMAP_LINEAR————三线性过滤(使用MIP贴图级别之间插值的双线性过滤)
2.
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);
在使用纹理的时候,有时候会出现超过纹理边界的问题,GL_TEXTURE_WRAP系列参数用来设置当这些超出边界时应该怎样处理。
- GL_TEXTURE_WRAP_S————S方向(X方向)- GL_TEXTURE_WRAP_T————T方向(Y方向)
第三个参数有以下几种
- GL_REPEAT————重复边界的纹理- GL_CLAMP————opengl就在一个2X2的加权纹理单元数组中使用取自边框的纹理单元。这时候的边框如果没有设置的话,应该就是原纹理的边界的像素值- GL_CLAMP_TO_EDGE————边框始终被忽略。位于纹理边缘或者靠近纹理边缘的纹理单元将用于纹理计算,但不使用纹理边框上的纹理单元- GL_CLAMP_TO_BORDER————如果纹理坐标位于范围[0,1]之外,那么只用边框纹理单元(如果没有边框,则使用常量边框颜色,我想常量边框颜色就是黑色)用于纹理
5. 生成纹理
先获取到Bitmap
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.texture_img);
然后调用GLUtils的texImage2D方法,传入4个参数。
// 生成纹理 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);
后三个参数含义如下
- level———— 提供多种分辨率的纹理. 如纹理只有一种分辨率,level 则设置为0.- bitmap————Bitmap对象- border————边框,设置为0
6. 设置纹理顶点数据
新建纹理浮点数组
float texCoords[] = {0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
这里要注意纹理坐标和OpenGL ES中坐标不一样,它的原点位于左下角
需要按照图示方式连接
再获取纹理缓冲数组
//获取纹理缓冲数组TextureBuffer= Utils.getFloatBuffer(texCoords);
这个其实就是把float转成floatBuffer,分配的内存大小为数组的长度乘以4.
最后设置纹理顶点数据
// 设置纹理顶点数据gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TextureBuffer);
之前的讲的比较复杂,下面把这些简单总结一下。
1) glGenTextures()
2) glBindTexture()
3) glTexParameteri()
GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
和纹理在放大和缩小(同样纹理离远和离近)时的处理,这种设置主要是为了避免同一个纹理反复使用时,远处的纹理反而比近处的清晰
GL_TEXTURE_MAG_FILTER
GL_TEXTURE_MIN_FILTER
4) GLUtils.texImage2D()
下面给一个较为完整的例子
int[] textureHandle = new int[1];
GLES20.glGenTextures(1, textureHandle, 0);
int TextureID = textureHandle[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, TextureID);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
android openGl纹理的使用就讲完了。
就这么简单。
android openGl纹理的使用相关推荐
- android openGL ES2 一切从绘制纹理開始
纹理.在openGL中,能够理解为载入到显卡显存中的图片.Android设备在2.2開始支持openGL ES2.0.从前都是ES1.0 和 ES1.1的版本号.简单来说,openGL ES是为了嵌入 ...
- android纹理坐标,Android OpenGL ES 7.1纹理绘制
基本原理 与渐变色接近,但有些区别: 渐变色:光栅化过程中,计算出颜色值,然后在片段着色器的时候可以直接赋值 纹理:光栅化过程中,计算出当前片段在纹理上的坐标位置,然后在片段着色器的中,根据这个纹理上 ...
- Android OpenGL ES (八)纹理绘制
基本原理 与渐变色接近,但有些区别: 渐变色:光栅化过程中,计算出颜色值,然后在片段着色器的时候可以直接赋值 纹理:光栅化过程中,计算出当前片段在纹理上的坐标位置,然后在片段着色器的中,根据这个纹理上 ...
- android 图片浏览器旋转,OpenGL纹理旋转及翻转问题详解
大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的.纹理旋转的问题一定要搞清楚 ...
- Android OpenGL ES 应用(二) 纹理
上一篇讲了基础入门 OpenGL (一) ,这一次主要学习OpenGL 纹理基本学习总结 要是做复杂的OpenGL应用程序,一定会用到纹理技术.纹理说白了就是把图片或者视频图像绘制到OpenGL空间中 ...
- Android OpenGL使用GLSurfaceView预览视频
Android OpenGL使用GLSurfaceView预览视频 第一章 相关知识介绍 在介绍具体的功能之前,先对一些主要的类和方法进行一些介绍,这样可以更好的理解整个程序 1.1 GLSurfac ...
- EGL接口介绍-----Android OpenGL ES底层开发
引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...
- Android OpenGL射线拾取手势旋转(二)
上回分解-_-!,Android OpenGL射线拾取&手势旋转(一). 3)Renderer:RayPickRenderer.java OpenGL渲染器,比较多的东西都在这里面了. pub ...
- android opengl es 粒子效果实例代码
概述:粒子系统采用许多形状简单的微小粒子作为基本元素,用它们来表示不规则模糊物体,系统中的每个粒子都有各自的生命周期,我们可以管理它们从创建到消亡的时间,它们都要经历"产生".&q ...
最新文章
- ESP8266 D1-UNO-R3开发板的初步测试
- 我国光纤速率创世界记录
- 设计模式 之 单例模式
- (3)PCIE中断简介(学无止境)
- 在vivo面试 java_面试代码题(vivo)数位之积
- 刚刚,微软发出警告:这个 IE 0day 影响所有 Windows 版本,已遭用且无补丁!
- 九大类背包问题专题1---01背包问题(二维和优化一维法附代码)
- Atitit webclient httpclient技术总结 RestTemplate Atitit CateIT重要技术httpclient iduah2 impt 体系树路径:CS
- 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
- 三分钟带你了解PPT图标
- 一种海量矢量数据分布式渲染技术方案
- 配置jetson的usb转串口驱动
- 页眉---header
- ​​​​尚硅谷—尚医通—前台用户系统—预约挂号—预约下单功能实现(155-160)
- matlab有LLG方程的解么,matlab在常微分方程数值解中应用.docx
- linux中的setenv命令
- WIA的使用及自定义可拖拽大小的picturebox
- Amazon AppStream服务介绍
- 【Unity3D插件】AVPro Video2.x rtmp流媒体播放设置问题
- 高仿 IOS遨游哈哈最新版