学习《Android3D游戏开发技术宝典:OpenGL.ES.2.0》二:着色器语言基础

一:着色器语言概述

        OpenGL ES 着色语言是一种高级的图形编程语言,起源自于C语言,同时具有RenderMan 以及其他着色语言的一些优良特性,易于被开发人员掌握。、
        与传统的编程语言有很大不同的是,器提供了更加丰富的原生类型,入向量、矩阵等。主要有以下特征:
1.OpenGL ES 着色语言是一种高级的过程语言(注意 ,不是面向对象)。
2.对顶点着色器、片元着色器使用的是同样的语言,不做区分。
3.基于C/C++的语法即流程控制。
4.完美支持向量与矩阵的各种操作。
5.通过类型限定符来管理输入与输出。
6.拥有大量的内置函数来提供丰富的功能。

二:着色语言基础:
OpenGL ES 着色语言虽然基于C/C++语法的语言,但又有很大的不同,主要是不支持double,byte,short,long,并取消了C中的union,enum。unsigned以及位运算。
2.1 数据类型的概述:
 2.1.1 标量 :也叫无向量,只有大小而没有方向,如质量、密度、体积、时间、温度等等,直接运算。有三种标量类型:
 bool --布尔型 
1   bool b;             //声明一个布尔型的变量
 int --整形
1 int a = 15;        //十进制
2 int b = 036;        //0 开头的是八进制,代表十进制的是30
3 int c = 0x3D;      //0x开头的是十六进制,代表的是十进制的58
float --浮点型
1 float f                  //声明一个float 型的变量
2 float g=2.0;       //在声明变量的同时为变量赋初值
3 float h,j;           //同时声明多个变量
4 float j, k = 2.56,  l ;    //    声明多个变量的时候。可以为其中的某些变量赋初值
注意:不需要在数值后面加 f 。

2.1.2 向量:向量可以看成是用同样类型的标量组成的,也有3种类型:int float bool 。每个向量可由 2个、3个、4个相同的标量组成。具体如下:
                                                    各向量类型及说明
向量类型
说明
向量类型
说明
vec2
包含2个浮点数的向量
ivec4
包含4个整数的向量
vec3
包含3个浮点数的向量
bvec2
包含2个布尔型向量
vec4
包含4个浮点数的向量
bvec3
包含3个布尔型向量
ivec2
包含2个整数的向量
bvec4
包含4个布尔型向量
ivec3
包含3个整数的向量


声明向量类型变量的基本语法:
1 vec2 v2;             //声明一个vec2 类型的向量
1 vec3 v3;             //声明一个vec3类型的向量
1 vec4 v4;             //声明一个vec4 类型的向量

向量在着色器代码的开发中有十分重要的作用,可以非常方便的存储以及操作颜色、位置、纹理坐标。语法是“<向量名>.<分量名>
如: 向量看做是颜色的时候,可以试用 r, g,b,a 4个分量名分别代表 红、绿、蓝、透明度:
1 aColor . r = 0.6;             //给向量aColor   的红色通道分量赋值
2 aColor . g = 0.6;             //给向量aColor  的绿色通道分量赋值
同理,如果是看做位置的时候可以用 x,y,z,w 代表 X轴Y轴Z轴记忆向量的模。

1 aPosition.x = 67.2 ;         //给向量aPosition 的X轴分量赋值
2 aPosition.y = 67.2 ;         //给向量aPosition 的Y轴分量赋值

向量看做是纹理坐标时,可用 s,t,p,q 代表纹理的不用分量 
1.aTexCoor.s = 0.65;         //给向量aTexCoor的s分量赋值
2.aTexCoor.t= 0.65;         //给向量aTexCoor的t分量赋值

也可直接把向量当作数组,通过下标来访问.
1 aColor  [0] = 0.6;            //给向量aColor  的红色通道分量赋值
2 aPosition[2] = 48.0;         //给向量aPosition 的Z轴分量赋值
3 aTexCoor[1] = 0.34;          //给向量aTexCoor的t分量赋值

2.1.3 矩阵
用于3D场景中的移位、旋转、缩放等变换
   矩阵的类型及说明
矩阵类型
说明
mat2
2*2的浮点数矩阵
mat3
3*3的浮点数矩阵
mat4
4*4的浮点数矩阵
基本语法:
1 mat2 m2;                 //声明一个mat2 类型的矩阵
2 mat3 m3;                  //声明一个mat3 类型的矩阵 
3 mat4 m4;                  //声明一个mat4 类型的矩阵 

矩阵可以看做是几个列向量组成的,例如 mat3 其实是3个vec3 组成。

2.1.4 采样器
采样器是着色语言中不同于C语言的一种特殊的基本数据类型,是专门用来进行纹理采样的相关操作,一般情况下,一个采样器变量代表一副或一套纹理贴图。
采样器类型 说明
sampler2D
用于访问二维纹理
sampler3D
用于访问三维纹理
samplerCube
用于访问立方贴图纹理

注意:采样器不能在着色器中初始化,一般用uniform1限定符来修饰,从宿主语言(如java)接受传递着色器的值

2.1.5 结构体   
 
struct info{
     vec3 color;
     vec3 position;
     vec2 textureCoor;
}

info  CubeInfo;        //就可以声明一个info类型的变量CubeInfo

2.1.6  数组 
2.1.7 空类型 
void main()
{// .........................}
数据类型的基本使用:
1>初始化
2> 属性变量、一致变量以及易变变量在声明的时候一定不能初始化
如:
1 attribute float angleSpan;
2 uniform int k;
3 varying vec3 position;


2.2 运算符    
2.3限定符
                4种限定符及说明
限定符
说明
attribute
一般用于每个顶点都各不相同的量,如顶点位置、颜色等;
uniform
一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的量,如当前的光源位置
varying
用于从顶点着色器传递到片元着色器的量
const
用于声明常量

如:
1 uniform mat4 uMVPMatrix;
2 attribute vec3 aPosition;
3 varrying vec4 aaColor;
4 const int lightsCount = 4;

2.4程序的基本结构
一般有3大部分组成,主要有:全局变量的声明、自定义函数、main函数。
下面是顶点着色器的程序:
1 uniform mat4 uMVPMatrix;            //总变换矩阵
2 attribute vec3 aPosition;                //顶点位置
3 attribute vec2 aTexCoor;              // 顶点纹理坐标
4 varrying vec2 vTextureCoord;        //用于传递给片元着色器的变量
5 void positionShift()                        //根据总变化矩阵计算此次绘制顶点位置的方法
6 {    
7            gl_Position = uMVPMatrix * vec4(aPosition,1);   
8 }
9 void main()                                     //主函数
10  {
11             positionShift();                  //根据总变换矩阵计算此次绘制此顶点位置
12             vTextureCoord = aTexCoor;//将接受到的纹理坐标传递给片元着色器
13  }               

注意:着色器程序中要求被调用的函数必须在调用之前声明。

2.4特殊的内建变量
    分为输入与输出变量,输入变量负责将渲染管线中固定功能部分产生的信息传递进着色器,输出变量负责将着色器产生的信息传递给渲染管线中固定功能部分。
2.4.1 顶点着色器中的内建变量
    顶点着色器中的内建变量主要是输出变量,包括gl_Position(vrc4)、gl_PointSize(默认为1) 等。
2.4.2  片元着色器中的内建变量
    片元着色器中的内建变量分为输入变量和输出变量。
    1> 内建输入变量
       gl_FragCoord (vec4类型):包含有当前片元相对于窗口位置的坐标值x、y、z与1/w
       gl_FrontFacing(bool类型):判断片元是否是在光栅阶段生成此片元的对应图元的正面,值为true和false。
    2>内建输出变量
        gl_FragColor(vec4类型):
        gl_FragData(vec4类型的数组):

2.5着色语言的内置函数
        按照设计目的有3个类别:
               1> 提供独特的硬件功能的访问接口    
               2>简单的数学函数
               3>一些复杂的函数
2.5.1 角度转换与三角函数
        
内置函数签名
说明
genType radians(genType degrees)
此函数功能为将角度转换为弧度,即返回值 result = (x/180)*degrees ,degrees 参数表示需要转换的角度
genType degrees(genType radians)
此函数功能为将弧度转换为角度,即返回值 result = (180/π)*radians,radians参数表示需要转换的角度
genType sin(genType angle)
此函数为标准的正弦函数,返回值范围为[-1,1],radians为正弦函数的参数,单位为弧度









2.5.2指数函数
2.5.3常见函数 
        abs 、sign、floor、ceil、fract、min、max、clamp、step、shoothstep
2.5.4 几何函数
        dot、cross、reflect、refract、
2.5.5 矩阵函数 
    mat matrixCompMult(mat x, mat y): 此函数按各个部分将矩阵x与矩阵y相乘,即返回值result[i][j]是x[i][j]与y[i][j]标量的乘积
2.5.6 向量关系函数
    bvec lessThan(vec x,vex y)
2.5.7 纹理采样函数
    纹理采样函数是用来根据指定的纹理坐标从采样器对应的纹理中进行采样,返回值类型是vec4,代表采样得到的颜色值。
                        纹理采样函数
内置函数签名
说明
vec4 texture2D(sampler2D sampler,vec2 coord,[float bias])
vec4 texture2DProj(sampler2D sampler,vec3 coord,[float bias])
vec4 texture2DProj(sampler2D sampler,vec4coord,[float bias])
vec4 texture2DLod(sampler2D sampler,vec2 coord,float lod)
vec4 texture2DProjLod(sampler2D sampler,vec3 coord,float lod)
vec4 texture2DProjLod(sampler2D sampler,vec4coord,float lod)
此系列函数功能为使用二维纹理坐标coord 在由sample参数指定的2D纹理中执行纹理采样,对于带Proj后缀的函数,会将纹理坐标(coord.s,coord.t)除以coord的最后一个部分(coord.q).对于类型为vec4的coord,忽略其他三部分(coord.p)
vec4 textureCube(samplerCube sampler,vec3 coord)
vec4 textureCube(samplerCube sampler,vec3 coord,float bias)
vec4 textureCubeLod(samplerCube sampler,vec3 coord,float lod)

vec4 texture3D(sampler3D sampler,vec3 coord,[float bias])
vec4 texture3DProj(sampler3D sampler,vec4coord,[float bias])
vec4 texture3DLod(sampler3D sampler,vec3coord,float lod)
vec4  texture3DProjLod(sampler3D sampler,vec4coord,float lod)


注:1。bias参数 含有bias参数的纹理采样函数只能在片元着色器中调用,且此参数仅对sampler为mipmap类型的纹理时才有意义。
       2.Lod后缀 。仅能作用于顶点着色器。Lod是level of detail 的缩写。仅对sampler 为mipmap类型的纹理才有意义。
       3.texture3D 系列:
           部分厂家进行了扩展:
            1 #extension GL_OES_texture_3d:enable           //打开扩展后还需要硬件支持才可以真正使用

2.5.8 微分函数
        仅能作用于片元着色器,并且还没纳入OpenGL ES 2.0 的正式标准。
  1 #extension GL_OES_standard_derivatives:enable           //打开扩展后还需要硬件支持才可以真正使用
第1章 新一代的王者——android概览 1 1.1 智能手机市场现状 1 1.1.1 五大智能手机操作系统 1 1.1.2 智能手机市场的新星 2 1.2 android平台的特点及未来的趋势 3 1.2.1 全新理念带来的体验风暴 3 1.2.2 中国手机市场的主导性作用 4 1.2.3 手机3d游戏和应用增长迅速 4 1.3 如何搭建android开发环境 4 1.3.1 sdk的安装及环境配置 5 1.3.2 eclipse集成开发环境的搭建 7 1.3.3 创建并启动模拟器 9 1.4 hello android应用程序的开发 11 1.4.1 第一个android应用程序 12 1.4.2 android应用程序的项目结构 14 1.4.3 android应用程序的调试 16 1.4.4 实际设备的联机调试 18 1.5 android应用程序运行的机制 19 1.5.1 应用程序的系统架构 19 .1.5.2 应用程序框架 20 1.5.3 android运行时 20 1.5.4 系统库 21 1.5.5 底层linux内核 21 1.6 本章小结 22 第2章 游戏开发相关android基础知识 23 2.1 游戏中的音效 23 2.1.1 游戏中的即时音效 23 2.1.2 即时音效的一个案例 24 2.1.3 背景音乐播放技术 27 2.1.4 简易音乐播放器的实现 29 2.2 简单数据的存储——preferences 33 2.2.1 preferences简介 33 2.2.2 preferences实现访问时间的记录 33 2.3 手机自带数据库——sqlite 34 2.3.1 初识sqlite 35 2.3.2 sqlite数据库的基本操作 35 2.3.3 sqlite数据库的简单案例 37 2.3.4 使用contentprovider组件共享数据 40 2.3.5 使用contentresolver获取分享数据 42 2.4 文件i/o 43 2.4.1 访问sd卡中的文件 44 2.4.2 访问手机中的文件夹 46 2.4.3 读取assets文件夹下的内容 48 2.5 2d动画的开发 50 2.5.1 surfaceview用法简介 50 2.5.2 使用surfaceview实现2d动画 50 2.6 socket网络通信 56 2.6.1 socket开发基本知识 56 2.6.2 服务器端 57 2.6.3 客户端 58 2.7 蓝牙通信 59 2.7.1 蓝牙通信的基本知识 60 2.7.2 聊天案例概览 60 2.7.3 聊天案例的开发过程 62 2.8 本章小结 75 第3章 初识opengl es 2.0 77 3.1 opengl es 2.0概览 77 3.1.1 opengl es 2.0简介 77 3.1.2 初识opengl es 2.0应用程序 80 3.2 着色器与渲染管线 89 3.2.1 opengl es 1.x的渲染管线 89 3.2.2 opengl es 2.0的渲染管线 94 3.2.3 opengl es中立体物体的构建 97 3.3 主流android手机gpu大pk 98 3.3.1 手机gpu四大家族对比 99 3.3.2 主流gpu的性能参数比较 103 3.4 本章小结 104 第4章 着色语言shading language 105 4.1 着色语言概述 105 4.2 着色语言基础 106 4.2.1 数据类型概述 106 4.2.2 数据类型的基本使用 110 4.2.3 运算符 112 4.2.4 类型转换 114 4.2.5 限定符 115 4.2.6 流程控制 119 4.2.7 函数的声明与使用 121 4.2.8 片元着色器中浮点变量精度的指定 122 4.2.9 程序的基本结构 123 4.3 特殊的内建变量 123 4.3.1 顶点着色器中的内建变量 124 4.3.2 片元着色器中的内建变量 124 4.4 着色语言的内置函数 125 4.4.1 角度转换与三角函数 126 4.4.2 指数函数 127 4.4.3 常见函数 127 4.4.4 几何函数 130 4.4.5 矩阵函数 132 4.4.6 向量关系函数 133 4.4.7 纹理采样函数 134 4.4.8 微分函数 135 4.5 本章小结 135 第5章 投影及各种变换 136 5.1 摄像机的设置 136 5.2 两种投影方式 137 5.2.1 正交投影 137 5.2.2 透视投影 145 5.3 各种变换 148 5.3.1 基本变换的相关数学知识 148 5.3.2 平移变换 148 5.3.3 旋转变换 152 5.3.4 缩放变换 153 5.3.5 基本变换的实质 155 5.4 绘制方式 156 5.4.1 各种绘制方式概览 156 5.4.2 点与线段绘制方式 157 5.4.3 三角形条带与扇面绘制方式 159 5.4.4 顶点法与索引法 165 5.5 设置合理的视角 167 5.6 卷绕和背面剪裁 173 5.6.1 基本知识 173 5.6.2 一个简单的案例 174 5.7 本章小结 176 第6章 光照 177 6.1 曲面物体的构建 177 6.1.1 球体构建的基本原理 177 6.2.2 案例效果概览 178 6.2.3 开发步骤 179 6.2 基本光照效果 182 6.2.1 光照的基本模型 182 6.2.2 环境光 183 6.2.3 散射光 185 6.2.4 镜面光 190 6.2.5 三种光照通道的合成 194 6.3 定位光与定向光 196 6.4 点法向量和面法向量 199 6.5 光照的每顶点计算与每片元计算 202 6.6 本章小结 204 第7章 纹理映射 205 7.1 初识纹理映射 205 7.1.1 基本原理 205 7.1.2 纹理映射的简单案例 206 7.2 纹理拉伸 212 7.2.1 两种拉伸方式概览 212 7.2.2 不同拉伸方式的案例 214 7.3 纹理采样 217 7.3.1 纹理采样概述 217 7.3.2 最近点采样 218 7.3.3 线性纹理采样 219 7.3.4 min与mag采样 220 7.3.5 不同纹理采样方式的案例 221 7.4 mipmap纹理技术 226 7.5 多重纹理与过程纹理 227 7.5.1 案例概览 227 7.5.2 将2d纹理映射到球面上的策略 228 7.5.3 案例的场景结构 229 7.5.4 开发过程 230 7.6 本章小结 238 第8章 3d基本形状的构建 239 8.1 圆柱体 239 8.1.1 顶点原始位置的生成 239 8.1.2 案例的开发 241 8.2 圆锥体 244 8.2.1 顶点原始位置的生成 244 8.2.2 案例的开发 246 8.3 圆环体 248 8.3.1 顶点原始位置的生成 248 8.3.2 案例的开发 249 8.4 螺旋管 251 8.4.1 顶点原始位置的生成 252 8.4.2 案例的开发 252 8.5 几何球 253 8.5.1 顶点原始位置的生成 254 8.5.2 案例的开发 255 8.6 足球碳分子模型的搭建 262 8.6.1 搭建的基本原理 262 8.6.2 案例的开发 264 8.7 贝塞尔曲线及旋转面 270 8.7.1 三维旋转曲面的生成 270 8.7.2 贝塞尔曲线 270 8.7.3 bezier曲线生成工具 272 8.7.4 印度古典建筑场景的开发 274 8.8 本章小结 276 第9章 3d模型加载 277 9.1 obj模型文件概览 277 9.1.1 obj文件的格式 277 9.1.2 用3dmax设计3d模型 278 9.2 加载obj文件 279 9.2.1 加载仅有顶点坐标与面数据的obj文件 279 9.2.2 加载后自动计算面法向量 283 9.2.3 加载后自动计算平均法向量 286 9.2.4 加载纹理坐标 289 9.3 本章小结 292 第10章 混合与雾 293 10.1 混合技术 293 10.1.1 混合基本知识 293 10.1.2 源因子和目标因子 294 10.1.3 简单混合效果案例 295 10.2 地月系云层效果的实现 297 10.3 雾 300 10.3.1 雾的原理与优势 300 10.3.2 雾的简单实现 301 10.4 本章小结 304 第11章 常用3d开发技巧 305 11.1 标志板 305 11.1.1 案例效果与基本原理 305 11.1.2 开发步骤 306 11.2 灰度图地形 310 11.2.1 基本原理 311 11.2.2 普通灰度图地形 311 11.2.3 过程纹理地形 314 11.2.4 mipmap地形 317 11.3 天空盒与天空穹 318 11.3.1 天空盒 318 11.3.2 天空穹 320 11.3.3 天空盒与天空穹的使用技巧 321 11.4 镜像技术 322 11.4.1 镜像基本原理 322 11.4.2 基本效果案例 322 11.4.3 升级效果案例 325 11.5 动态文本输出 327 11.5.1 案例效果与基本原理 327 11.5.2 具体开发步骤 328 11.6 非真实感绘制 330 11.6.1 案例效果与基本原理 330 11.6.2 具体开发步骤 331 11.7 本章小结 332 第12章 几种剪裁与测试 333 12.1 剪裁测试 333 12.1.1 基本原理与核心代码 333 12.1.2 一个主次视角的简单案例 334 12.2 alpha测试 335 12.2.1 alpha测试基本原理 335 12.2.2 一个椭圆窗口的案例 335 12.3 模板测试 337 12.3.1 基本原理 337 12.3.2 一个简单的案例 340 12.4 任意剪裁平面 341 12.4.1 基本原理 341 12.4.2 茶壶被任意平面剪裁的案例 342 12.5 本章小结 344 第13章 顶点着色器的妙用 345 13.1 飘扬的旗帜 345 13.1.1 基本原理 345 13.1.2 开发步骤 346 13.2 扭动的软糖 349 13.2.1 基本原理 349 13.2.2 开发步骤 350 13.3 风吹椰林场景的开发 351 13.3.1 椰子树随风摇摆的基本原理 351 13.3.2 开发步骤 352 13.4 展翅飞翔的雄鹰 356 13.4.1 基本原理 356 13.4.2 开发步骤 357 13.5 维扭曲 359 13.5.1 基本原理 359 13.5.2 开发步骤 360 13.6 opengl es 1.x与opengl es 2.0实现方案的对比 363 13.7 本章小结 364 第14章 片元着色器的妙用 365 14.1 程序纹理技术 365 14.1.1 砖块着色器 365 14.1.2 沙滩球着色器 367 14.2 数字图像处理 368 14.2.1 卷积的基本知识 369 14.2.2 平滑过滤 369 14.2.3 边缘检测 371 14.2.4 锐化处理 372 14.2.5 浮雕效果 373 14.2.6 图像渐变 374 14.3 分形着色器 375 14.3.1 曼德布罗集简介 375 14.3.2 曼德布罗集着色器的实现 376 14.3.3 将曼德布罗集纹理应用到实际物体上 378 14.3.4 茱莉亚集着色器的实现 379 14.4 本章小结 380 第15章 真实光学环境的模拟 381 15.1 投影贴图 381 15.1.1 案例效果与基本原理 381 15.1.2 开发步骤 382 15.2 反射环境模拟 385 15.2.1 案例效果与基本原理 385 15.2.2 开发步骤 386 15.3 折射环境模拟 388 15.3.1 案例效果与基本原理 388 15.3.2 开发步骤 390 15.4 色散效果的模拟 391 15.4.1 案例效果与基本原理 391 15.4.2 开发步骤 392 15.5 菲涅尔效果的模拟 393 15.5.1 案例效果与基本原理 393 15.5.2 开发步骤 394 15.6 凹凸映射 395 15.6.1 案例效果与基本原理 395 15.6.2 法向量纹理图的生成 396 15.6.3 案例的开发 399 15.7 平面阴影 404 15.7.1 案例效果与基本原理 405 15.7.2 开发步骤 406 15.8 阴影映射 409 15.8.1 案例效果与基本原理 409 15.8.2 距离纹理图的生成 411 15.8.3 阴影场景的绘制 417 15.9 光线跟踪 419 15.9.1 案例效果与基本原理 419 15.9.2 开发步骤 423 15.10 本章小结 436 第16章 游戏开发中的物理学 437 16.1 碰撞检测基本技术 437 16.1.1 aabb包围盒的基本原理 437 16.1.2 aabb包围盒的计算 438 16.1.3 aabb包围盒的碰撞检测 440 16.1.4 一个aabb包围盒的案例 442 16.1.5 旋转后的aabb包围盒 444 16.1.6 aabb包围盒的使用要点 448 16.1.7 obb包围盒 448 16.2 穿透效应 449 16.2.1 案例的运行效果与基本原理 449 16.2.2 具体开发步骤 450 16.3 粒子系统 450 16.3.1 案例运行效果与基本原理 451 16.3.2 cpu版案例的开发 452 16.3.3 gpu版案例开发步骤 453 16.4 弹簧质点模型 455 16.4.1 案例运行效果与基本原理 455 16.4.2 具体开发步骤 457 16.5 本章小结 462 第17章 游戏的心脏——物理引擎 463 17.1 物理引擎很重要 463 17.1.1 什么是物理引擎 463 17.1.2 常见的物理引擎 463 17.2 jbullet物理引擎 466 17.2.1 基本的物理学概念 466 17.2.2 jbullet中常用类的介绍 468 17.3 箱子相互碰撞的案例 475 17.3.1 案例运行效果及准备工作 476 17.3.2 案例的基本框架结构 476 17.3.3 常量类——constant 477 17.3.4 3d场景渲染类——mysurfaceview 478 17.3.5 水平地面——texfloor类 480 17.3.6 箱子——texcube类 481 17.4 复合碰撞形状的使用 483 17.4.1 案例运行效果 483 17.4.2 立方体圆柱复合形状——cubecylinder类 483 17.5 凹凸地形的案例 486 17.5.1 案例运行效果 486 17.5.2 地形类——landform 486 17.6 任意形状物体的碰撞 488 17.6.1 案例运行效果 488 17.6.2 加载物体类——loadedobjectvertexnormal 488 17.6.3 加载物体刚体类——loadrigidbody 490 17.7 铰链关节 491 17.7.1 铰链关节的基本知识 491 17.7.2 案例的运行效果 492 17.7.3 铰链关节旋转角速度的计算 493 17.7.4 3d界面渲染类——mysurfaceview 494 17.8 滑动关节 496 17.8.1 滑动关节的基本知识 496 17.8.2 案例效果图 497 17.8.3 3d界面渲染类——mysurfaceview 498 17.9 六自由度关节 502 17.9.1 六自由度关节的基本知识 502 17.9.2 案例的运行效果 503 17.9.3 人偶类——doll 503 17.9.4 拾取时采用的点对点关节 505 17.10 本章小结 509 第18章 传感器应用的开发 510 18.1 基本的开发流程 510 18.2 加速度传感器 512 18.2.1 加速度传感器简介 513 18.2.2 案例的开发 514 18.3 磁场传感器 514 18.3.1 磁场传感器简介 514 18.3.2 案例的开发 514 18.4 光传感器 516 18.4.1 光传感器简介 516 18.4.2 案例的开发 516 18.5 温度传感器 518 18.5.1 温度传感器简介 518 18.5.2 案例的开发 518 18.6 接近传感器 519 18.6.1 接近传感器简介 519 18.6.2 案例的开发 520 18.7 姿态传感器 521 18.7.1 姿态传感器简介 521 18.7.2 案例的开发 522 18.8 本章小结 528 第19章 游戏开发小贴士 529 19.1 3d拾取技术 529 19.1.1 案例效果与基本原理 529 19.1.2 开发步骤 531 19.2 多点触控 537 19.2.1 案例效果与基本原理 537 19.2.2 开发步骤 538 19.3 多键监听 541 19.3.1 案例效果与基本原理 541 19.3.2 开发步骤 542 19.4 本章小结 544 第20章 bn赛艇 545 20.1 游戏背景及功能概述 545 20.1.1 背景概述 545 20.1.2 功能介绍 545 20.2 游戏的策划及准备工作 547 20.2.1 游戏的策划 547 20.2.2 android平台下游戏的准备工作 548 20.3 游戏的架构 552 20.3.1 各个类简要介绍 553 20.3.2 游戏框架简介 558 20.4 主控制类myactivity 559 20.5 2d界面相关类 563 20.5.1 欢迎界面类welcomeview 563 20.5.2 2d界面父类mysfview 565 20.5.3 主菜单类menuview 565 20.5.4 2d界面绘制类viewfordraw 566 20.5.5 数据库工具类dbutil 568 20.5.6 android系统版本对话框androidversiondialog 570 20.6 选船界面相关类 570 20.6.1 着色器管理类shadermanager 571 20.6.2 围墙类colorlightrect 571 20.6.3 选船房间类housefordraw 573 20.6.4 展台类displaystation 575 20.6.5 赛艇类boat 576 20.6.6 选船界面xcsurfaceview 576 20.7 游戏界面相关类 582 20.7.1 进度条类process 583 20.7.2 3d物体父类bndrawer 584 20.7.3 3d物体控制类tdobjectforcontrol 584 20.7.4 赛艇类boat 585 20.7.5 可碰撞物体父类kzbjdrawer 586 20.7.6 可碰撞物体控制类kzbjforcontr
随着智能手机移动嵌入式平台硬件性能的不断提升,3D游戏应用也逐渐普及开来。《Android 3D游戏开发技术宝典:OpenGL ES 2.0》结合作者多年从事3D游戏应用开发的宝贵经验,全面介绍了与Android平台相关的必知必会的基础知识及大型完整3D案例,讲解上由浅入深,循序渐进,起点低、终点高,既适合初学者学习,也适合有一定基础的读者进一步提升之用。另外,由于OpenGL ES 2.0的着色语言通用于各种移动嵌入式平台,因此,《Android 3D游戏开发技术宝典:OpenGL ES 2.0》中与着色器开发相关的60%左右的内容还可供iPhone、Windows Mobile、MeeGoo等平台的开发人员参考。 全书共22章,其中第1章与第2章为Android平台相关的一些基础知识;第3章~第10章介绍了基于OpenGL ES 2.0进行3D应用开发的一些必知必会的基本知识;第11章~第15章介绍了一些高级特效的实现方法;第16章~第17章介绍了3D游戏开发中相关的一些物理、碰撞检测知识以及常用的3D物理引擎JBullet;第19章介绍了3种人机交互的高级技术;第20章~第22章给出了3个完整的大型3D游戏案例,总代码量接近6万行。同时为了便于读者的学习,《Android 3D游戏开发技术宝典:OpenGL ES 2.0》附赠的光盘中包含了书中所有案例的完整源代码,同时给出了最后3个完整大型3D游戏案例的讲解视频,最大限度地帮助读者快速掌握相应的开发技术。 《Android 3D游戏开发技术宝典:OpenGL ES 2.0》适合Android程序员、游戏开发者及Android爱好者学习,也可以作为相关培训学校和大专院校相关专业的教学用书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值