OpenGL摘记

来源:互联网 发布:java api 1.7 中文 编辑:程序博客网 时间:2024/05/24 00:24

OpenGL ES 中有一项功能叫做背面裁剪,含义是打开背面裁剪功能后,视角在一个三角形的背面时不渲染此三角形,即看不到此三角形,此功能可以大大提高渲染效率。因此很重要的就是确定在既定的观察方向上渲染三角形,否则有可能出现看不到图像的情况。三角形的正反面是这样确定的,当面对一个三角形时,若顶点的顺序是逆时针则位于三角形的正面,反之则是反面。


OpenGL ES绘制方式:

1.GL_POINTS:

把每个顶点作为一个点进行处理,索引数组中的第n个顶点即定义点n,共绘制N个点

2.GL_LINES:

把每两个顶点作为一条独立的线段,索引数组中的第2n和2n+1顶点定义了第n条线段,共绘制了N/2条线段。如果N为奇数,则忽略最后一个顶点。例如索引数组{0,3,2,1}


3.GL_LINE_STRIF:

绘制索引数组中从第0个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制N-1条线段。例如,索引数组{0,3,2,1}


4.GL_LINE_LOOP:

绘制索引数组中从第0个顶点到最后一个顶点依次相连的一组线段,最终最后一个顶点与第0个顶点相连。总共绘制了N条线段,例如,索引{0,3,2,1}


5.GL_TRIANGLES:

把索引数组中的每3个顶点作为一个独立的三角形。索引数组中的第3n、3n+1、3n+2顶点定义了第n个三角形,总共绘制了N/3个三角形。例如,索引数组{0,1,2,2,1,3}


6.GL_TRIANGLE_STRIP:

绘制一个相连的三角形。总共绘制N-2个三角形。例如,索引数组{0,1,2,3,4}


7.GL_TRIANGLE_FAN:

绘制一组相连的三角形。总共绘制N-2个三角形。例如索引数组{0,1,2,3,4}



绘制的方式有两种,一种是索引法,通过调用gl.glDrawElements()方法绘制各种简单的几何图形。

gl.glDrawElements(int mode,int count,int type,Buffer indices);一共有4个参数,分别用mode定义什么样的图元被画出来,count定义一共有多少个索引值,type定义索引数组使用的类型,indices表示绘制顶点使用的索引缓存。

顶点法:gl.glDrawArrays(int mode,int first,int count);

顶点法绘制图形与索引法绘制图形的区别就是,顶点法没有建立索引缓冲,而是直接在建立顶点缓冲的同时,将顶点数组中的顶点排好顺序,最后在调用绘制方法时使用顶点缓冲。


OpenGL ES 在执行真正的绘制之前有很多的准备工作:

1.清楚颜色缓存和深度缓存

gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

OpenGL ES保存了一系列缓存(buffers),即用于绘制各方面的内存块。颜色缓存保存当前帧各像素的颜色。

深度缓存保存了每个潜在像素离观察者距离的信息。

2.加载单位变换矩阵

gl.glMatrixMode(GL10.GL_MODELVIEW)和gl.glLoadIdentity(),此工作将清除虚拟世界中的一切平移、旋转、缩放或其他变化,并将观察者置于原点。


在OpenGL ES中支持两种投影方式:正交投影和透视投影

1.正交投影:平行投影的一种,观察者的视线是平行的,不产生真实世界远大近小的透视效果。在正交投影中,可视的空间区域为长方体,设置正交投影的语句为:gl.glOrthof(left,right,bottom,top,near,far),其中left和right为视口左右侧对应的x坐标,bottom与top为视口上下侧对应的y坐标,near与far为可视空间区域最近端与最远端的z坐标。

2.透视投影:可以产生真实世界中近大远小的效果,语句为gl.glFrustumf(left,right,bottom,top,near,far);

设置视口:gl.glViewport(x,y,width,height);x,y为视口矩形在屏幕左上侧点的坐标,width,height为视口的宽度与高度。


开启光源:gl.glEnable(GL10.GL_LIGHTING)

OpenGL ES的场景中至少可以包含8个光源,它们可以是不同的颜色,除了0号灯之外的其他光源的颜色是黑色。

gl.glEnable()可以设定打开某盏灯,参数是GL_LIGHT0,GL_LIGHT1


定向光(像太阳这类被认为是从无穷远处发射的几乎平行的光):通过glLightfv(int light,int pname,float[] params,int offset)来射定向光

light:设置灯,用GL_LIGHT0到GL_LIGHT7来表示8盏灯。如果该处设置为GL_LIGHT0,即表示glLightfv这个方法其余的参数都是针对0号灯设置的。

pname:被设置的光源的属性

params:这个参数是一个float数组,该数组由4部分组成,前3个值组成表示定向光方向的向量,光的方向为从向量点处向原点处照射。如{0,1,0,0},表示沿Y轴负方向的光,最后的0表示此光源发出的是定向光

offset:偏移量,

定位光:如果定向光是太阳,那么定位光就像蜡烛或者电灯,设置的方法和定向光一样,仅仅是params参数略有不同

1.在定向光中,params参数的最后一个参数设置为0,在定位光中设置为1

2.在定向光中,params参数的前三个参数为设定光源的向量坐标,而在定位光中,这3个参数是光源的位置

3.在定向光中光的方向为给定的坐标点与原点之间的向量,所以params中的坐标不能设置为[0,0,0],而在定位光中给出的是光源的坐标位置,所以params前三个参数可以设置为[0,0,0];


光源的颜色,颜色相关的三个参数:GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR

环境光:pname属性设置为GL_AMBIENT

params:此参数给出的是灯光颜色的R.G.B.A 4个彩色通道的值,一般环境光设置的值比较小

散射光:pname属性设置为GL_DIFFUSE

镜面反射光:pname属性设置为GL_SPECULAR


在OpenGL ES 中决定物体光线反射的有物体各个顶点的法向量,以及物体的材质。

向量用一个三元组来表示,格式为(x,y,z),其表示为从(0,0,0)出发到(x,y,z)的一个向量,代表一个方向

指定法向量:glNormalPointer(int type, int stride, Buffer pointer)

设置材质就是设置材质对于环境光、散射光、镜面光的反射能力,也就是说材质能反射什么颜色的光。例如,白色的材质能反射所有颜色的光,红色的材质只能反射红色光。

通过glMaterialfv(int face,int pname,float[] params,int offset)可设置材质的相关属性

face:设置材质能反光的面,设置为GL10.GL_FRONT_AND_BACK,可以实现正反面均可反射光线。

pname:设置环境光,参数GL10.GL_AMBIENT。散射光,GL10.GL_DIFFUSE。镜面光,GL10.GL_SPECULAR。还有一种,高光反射区,通过GL10.GL_SHININESS设置。

params:对于环境光,散射光,镜面光,该参数设置一个一维四元的float数组,表示RGBA 4个参数,对于高光反射区域,则设置一个参数,数越大越亮,越小,越暗。

offset:为数组中的偏移量,一般设置为0.


纹理贴图的使用,首先需要去做的是开启纹理 gl.glEnable(GL10.GL_TEXTURE_2D)和允许使用纹理数组gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY)方法,使用gl.glDisable(GL10.GL_TEXTURE_2D)关闭纹理。

在opengl es 中,进行纹理映射时对纹理图片的尺寸是有规定的,要求纹理图片的宽度和高度必须为2的n次方,即32×32、256×256