Android OpenGL ES 简明开发教程七:材质渲染
2012-07-14 15:54
357 查看
前面讨论了如何给3D图形染色,更一般的情况是使用位图来给Mesh上色(渲染材质)。主要步骤如下:
创建Bitmap对象
使用材质渲染,首先需要构造用来渲染的Bitmap对象,Bitmap对象可以从资源文件中读取或是从网络下载或是使用代码构造。为简单起见,本例从资源中读取:
帮助
要注意的是,有些设备对使用的Bitmap的大小有要求,要求Bitmap的宽度和长度为2的几次幂(1,2,4,8,16,32,64.。。。),如果使用不和要求的Bitmap来渲染,可能只会显示白色。
创建材质(Generating a texture)
下一步使用OpenGL库创建一个材质(Texture),首先是获取一个Texture Id。
帮助
textures中存放了创建的Texture ID,使用同样的Texture Id ,也可以来删除一个Texture:
帮助
有了Texture Id之后,就可以通知OpenGL库使用这个Texture:
帮助
设置Texture参数glTexParameter
下一步需要给Texture填充设置参数,用来渲染的Texture可能比要渲染的区域大或者小,这是需要设置Texture需要放大或是缩小时OpenGL的模式:
帮助
常用的两种模式为GL10.GL_LINEAR和GL10.GL_NEAREST。
需要比较清晰的图像使用GL10.GL_NEAREST:
而使用GL10.GL_LINEAR则会得到一个较模糊的图像:
UV
Mapping
下一步要告知OpenGL库如何将Bitmap的像素映射到Mesh上。这可以分为两步来完成:
定义UV坐标
UV Mapping指将Bitmap的像素映射到Mesh上的顶点。UV坐标定义为左上角(0,0),右下角(1,1)(因为使用的2D Texture),下图坐标显示了UV坐标,右边为我们需要染色的平面的顶点顺序:
为了能正确的匹配,需要把UV坐标中的(0,1)映射到顶点0,(1,1)映射到顶点2等等。
帮助
如果使用如下坐标定义:
帮助
Texture匹配到Plane的左上角部分。
而
帮助
将使用一些不存在的Texture去渲染平面(UV坐标为0,0-1,1 而 (0,0)-(2,2)定义超过UV定义的大小),这时需要告诉OpenGL库如何去渲染这些不存在的Texture部分。
有两种设置
GL_REPEAT 重复Texture。
GL_CLAMP_TO_EDGE 只靠边线绘制一次。
下面有四种不同组合:
本例使用如下配置:
帮助
然后是将Bitmap资源和Texture绑定起来:
帮助
使用Texture
为了能够使用上面定义的Texture,需要创建一Buffer来存储UV坐标:
帮助
渲染
帮助
本例代码是在一个平面上(SimplePlane)下使用Texture来渲染,首先是修改Mesh基类,使它能够支持定义UV 坐标:
帮助
并添加设置Bitmap和创建Texture的方法:
帮助
最后修改draw方法来渲染材质:
帮助
本例使用的SimplePlane定义如下:
帮助
本例示例代码下载 ,到本篇为止介绍了OpenGL ES开发的基本方法,更详细的教程将在以后发布,后面先回到Android ApiDemos中OpenGL ES的示例。
创建Bitmap对象
使用材质渲染,首先需要构造用来渲染的Bitmap对象,Bitmap对象可以从资源文件中读取或是从网络下载或是使用代码构造。为简单起见,本例从资源中读取:
帮助
创建材质(Generating a texture)
下一步使用OpenGL库创建一个材质(Texture),首先是获取一个Texture Id。
帮助
帮助
帮助
下一步需要给Texture填充设置参数,用来渲染的Texture可能比要渲染的区域大或者小,这是需要设置Texture需要放大或是缩小时OpenGL的模式:
帮助
需要比较清晰的图像使用GL10.GL_NEAREST:
而使用GL10.GL_LINEAR则会得到一个较模糊的图像:
UV
Mapping
下一步要告知OpenGL库如何将Bitmap的像素映射到Mesh上。这可以分为两步来完成:
定义UV坐标
UV Mapping指将Bitmap的像素映射到Mesh上的顶点。UV坐标定义为左上角(0,0),右下角(1,1)(因为使用的2D Texture),下图坐标显示了UV坐标,右边为我们需要染色的平面的顶点顺序:
为了能正确的匹配,需要把UV坐标中的(0,1)映射到顶点0,(1,1)映射到顶点2等等。
帮助
如果使用如下坐标定义:
帮助
Texture匹配到Plane的左上角部分。
而
帮助
有两种设置
GL_REPEAT 重复Texture。
GL_CLAMP_TO_EDGE 只靠边线绘制一次。
下面有四种不同组合:
本例使用如下配置:
帮助
帮助
为了能够使用上面定义的Texture,需要创建一Buffer来存储UV坐标:
帮助
帮助
帮助
帮助
帮助
帮助
本例示例代码下载 ,到本篇为止介绍了OpenGL ES开发的基本方法,更详细的教程将在以后发布,后面先回到Android ApiDemos中OpenGL ES的示例。
相关文章推荐
- Android OpenGL ES 简明开发教程七:材质渲染
- Android OpenGL ES 简明开发教程七:材质渲染
- Android OpenGL ES 简明开发教程七:材质渲染
- Android OpenGL ES 简明开发教程七:材质渲染
- Android OpenGL ES 简明开发教程 07 <材质渲染>
- Android OpenGL ES 简明开发教程_材质渲染
- Android OpenGL ES 简明开发教程四:3D 坐标变换
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- Android OpenGL ES 简明开发教程四:3D 坐标变换
- Android OpenGL ES 简明开发教程四:3D 坐标变换
- Android OpenGL ES 简明开发教程二:构造OpenGL ES View
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- Android OpenGL ES 简明开发教程 01
- Android OpenGL ES 开发教程(27):材质及光照示例
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- Android OpenGL ES 简明开发教程五:添加颜色
- Android OpenGL ES 简明开发教程小结