1. SurfaceView在游戏中的使用:
SurfaceView继承自View,但它与View不同,View是在UI的主线程中更新画面,而
SurfaceView是在一个新线程中更新画面。View的特性决定了其不适合做动画,因为
如果更新画面事件过长,那么住UI线程就会被正在画的函数阻塞。所以android通常用
SurfaceView显示动画效果。
SurfaceView主要有三个方法:
1. public abstract void surfaceCreated(SurfaceHolder holder);
在SurfaceView创建时调用该函数
2. public abstract void surfaceChanged(SurfaceHolder holder);
在SurfaceView改变时调用该函数
3. public abstract void surfaceDestroyed(SurfaceHolder holder);
在SurfaceView销毁前调用该函数
abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),
表示其为抽象成员。它不可以和 static 、virtual 一起使用。声明为 abstract
成员可以不包括实现代码,但只要类中存在未实现的抽象成员,那么它的对象就不能
被实例化。abstract通常用来强制继承类必须实现基类的某一抽象成员。
2. OpenGL ES: OpenGL for Embedded Systems
3. 设置三角形自定义卷绕顺序:
glFrontFace(GL_CCW); //设置逆时针(CCW:CounterClockWise)为正面
glFrontFace(GL_CW); //设置顺时针(CW:ClockWise)为正面
4. glDrawArrays(int mode, int first, int count) //绘制函数
glDrawElements(int mode, int count, int type, Buffer indices)//绘制函数
glDrawArrays创建一个集合图元序列,使用数组中从first开始,到first+count-1结束
的数组元素。mode为绘制模式。
glDrawElements使用count个元素定义一个图元序列,type为indices(索引)数组中的
数据类型,mode为绘制模式,indices数组存储顶点的索引值。
5. 渲染及绘制模式:
渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的联系
这个关系通过绘制模式给出。常用的绘制模式有
GL_POINTS :把每个顶点作为一个点处理。顶点n定义里点n,共绘制n个点。
GL_LINES :把没两个顶点作为一个独立的线段,n个顶点定义n/2个线段。如果n是
奇数,则忽略最后一个顶点。
GL_LINE_STRIP :绘制从第一个顶点到最后一个顶点依次相连的一组线段,n个顶点共绘制
n-1条线段。
GL_LINE_LOOP :绘制从第一个顶点到最后一个顶点依次相连的线段,然后最后一个顶点与
第一个顶点相连。n个顶点共绘制n条线段。
GL_TRIANGLES :把没三个顶点作为一个独立的三角形,n个顶点共绘制n/3个三角形。
GL_TRIANGLE_STRIP :绘制一组相连的三角形,n个顶点共绘制n-2个三角形
GL_TRIANGLE_FAN :绘制一组相连的三角形,三角形是由第一个顶点及以后所给定的顶点组成
,每个三角形中都有第一个顶点。n个顶点共绘制n-2个三角形。
6. 设置着色模式
gl.glShadeModel(GL10.GL_SMOOTH); //设置着色模式为平滑着色
gl.glShadeModel(GL10.GL_FLAT); //设置着色模式为不平滑着色
在不平滑着色模式下,三角形三个顶点中最后一个顶点的颜色决定三角形的颜色。
7. 背面剪裁:
gl.glEnable(GL10.GL_CULL_FACE); //设置打开背景剪裁
gl.glDisable(GL10.GL_CULL_FACE); //设置关闭背景剪裁
8. 投影方式(透视投影/正交投影):
float ratio = (float)320/480; //透视投影的比例
gl.glFrustumf(-ratio, ratio, -1, 1, 1f, 10); //计算产生透视投影矩阵
gl.glOrthof(-ratio, ratio, -1, 1, 1, 10); //计算产生正交投影矩阵
9. 加载单位变换矩阵:
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
此工作将清除虚拟世界中的一切平移、旋转、缩放或其他变化,并将观察者置于原点。
10. 一个三角形的绘制方法:
1.索引法
gl.glDrawElements(填充方式,索引数量,索引类型,顶点数量);
2.顶点法
gl.glDrawArrys(填充方式,开始点编号,顶点数量);
光照效果:
=================================================
11. 光源的开启和关闭:
gl.glEnable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_LIGHTING);
只启动Enable()是没有光的。必须得进行其他的设置。
12. 光的设置方法:
glLightfv(int light, int pname, float[] params, int offset);
参数light:该参数指定OpenGL ES中的灯,用GL_LIGHT0到GL_LIGHT7来表示8盏灯
13. 定向光和定位光:
设定定向光和定位光,参数:pname应该设置成GL_POSITION。
参数params:是一个float数组,这个数组中一共有4个值,
在定向光中
前3个数值表示光的方向,光的方向为从向量点处向原点处照射。如{0,1,0,0}表示沿Y轴
负方向的光。最后的0表示此光源发出的光是定向光。
在定位光中
前3个数值表示光的位置坐标。如{0,1,0,1}表示位于{0,1,0}处的定位光。最后的1表示
此光源发出的是定向光。
14. 光源的颜色设定:
OpenGL ES允许把与颜色相关的3个不同参数(pname)GL_AMBIENT, GL_DIFFUSE,
GL_SPECULAR与任何特定的光源相关联
在光颜色设定中params[]数组中一共也是有4个数值,分别代表RGBA四个彩色通道。
ambient即环境光,表示一个特定的光源在场景中所添加的环境光的RGBA强度,一般
环境光的值偏小。
diffuse即散射光,数值大小居中。light0的默认值为白色,其它灯的默认值为黑色。
specular即反射光,数值大小偏大。light0的默认值为白色,其它灯的默认值为黑色。
15. GL_LIGHT0的初始化举例:
private void initLight0(GL10 gl){
//****打开light0
gl.glEnable(GL10.GL_LIGHT0);
//****设置环境光
float[] ambientParams = {0.1f, 0.1f, 0.0f, 1.0f};
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientParams, 0);
//****设置散射光
float[] diffuseParams = {0.5f, 0.5f, 0.0f, 1.0f};
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseParams, 0);
//****设置反射光
float[] specularParams = {1.0f, 1.0f, 0.0f, 1.0f};
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularParams, 0);
}
16. 物体的材质设置方法:
设置材质的主要工作就是设置材质对于环境光,散射光,镜面光的反射能力,也就是说材质能
反射什么颜色的光。例如,白色的材质能反射所有颜色的光,红色的材质只能反射红色光。
相关属性通过方法
public abstract void gl
params, int offset);进行设置。
参数face:设置材质能反光的面,设置为GL10.GL_FRONT_AND_BACK,可以实现正面
反面均可反射光线。
参数pname:如果要设置环境光--GL10.GL_AMBIENT
如果要设置散射光--GL10.GL_DIFFUSE
如果要设置反射光--GL10.GL_SPECULAR
还有一种参数,刚光反射区域 --GL10.GL_SHININESS
高光反射区域,数值越大,高亮区域越小,越暗。
17. 初始化材质为白色的举例:
private void initMaterialWhite(GL10 gl){
//**** 设置环境光
float ambientMaterial[] = {0.4f, 0.4f, 0.4f, 1.0f};
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,
ambientMaterial, 0);
//**** 设置散射光
float diffusParams[] = {0.8f, 0.8f, 0.8f, 1.0f};
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,
diffusParams, 0);
//**** 设置反射光
float specularMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,
specularMaterial, 0);
//**** 设置高光反射区域
float shininessMaterial[] = {1.5f};
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS,
shininessMaterial, 0);
}