您的位置:首页 > 运维架构

OpenGL ES 基础知识笔记

2011-08-19 08:56 162 查看
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<aterialfv(int face, int pname, flot[]

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: