android opengl es总结(转)
?
?
?创建简单的opengl es实例http://developer.Android.com/resources/tutorials/opengl/opengl-es10.html???OpenGL ES提供了两类方法来绘制一个空间几何图形:
对应顶点除了可以为其定义坐标外,还可以指定颜色,材质,法线(用于光照处理)等。
glEnableClientState 和 glDisableClientState 可以控制的pipeline开关可以有:GL_COLOR_ARRAY (颜色) ,GL_NORMAL_ARRAY (法线), GL_TEXTURE_COORD_ARRAY (材质), GL_VERTEX_ARRAY(顶点), GL_POINT_SIZE_ARRAY_OES等。
对应的传入颜色,顶点,材质,法线的方法如下:
glColorPointer(int size,int type,int stride,Buffer pointer)在OpenGL ES 中,
在进行平移,旋转,缩放变换时,所有的变换都是针对当前的矩阵(与当前矩阵相乘),如果需要将当前矩阵回复最初的无变换的矩阵,可以使用单位矩阵(无平移,缩放,旋转)。
public abstract void?glLoadIdentity()。
在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用public abstract void?glPushMatrix()
和
public abstract void?glPopMatrix()。
在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。??ndroid OpenGL ES 的GLU包有一个辅助函数gluLookAt提供一个更直观的方法来设置modelview 变换矩阵:
void gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)GLU.gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)
下面给出了OpenGL ES中与Depth Buffer相关的几个方法:

Emitted : 一般只发光物体或者光源,这种光不受其它光源的影响。
ambient: 环境光如果射到某个平面,其反射方向为所有方向。Ambient 没有位置方向,只有颜色。
diffuse:当一束平行的入射光线射到粗糙的表面时,因面上凹凸不平,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同 的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这个反射的光则称为漫射光。漫射光射到某个平面时,其反射方向也为所有方向。diffuse 只依赖于光源的方向和法线的方向。
specular : 一般指物体被光源直射的高亮区域,也可以成为镜面反射区,如金属。specular依赖于光源的方向,法线的方向和视角的方向。???光源
OpenGL ES中可以最多同时使用八个光源,分别使用0到7表示。
OpenGL ES光源可以分为
?
打开法线数组gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);?
?和设置颜色类似,有两个方法可以为平面设置法线,一是public void glNormal3f(float nx,float ny,float nz)这个方法为后续所有平面设置同样的方向,直到重新设置新的法线为止。
为某个顶点设置法线:public void glNormalPointer(int type,int stride, Buffer pointer)
设置物体表面材料(Material)的反光属性(颜色和材质)的方法如下:
? ? ? ? gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0);?? ? ? ? gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0);?? ? ? ? gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0); ??
? ? ? ? gl.glEnable(GL10.GL_COLOR_MATERIAL);??
?此外,方法glLightModleXX给出了光照模型的参数
public void glLightModelf(int pname,float param)
public void glLightModelfv(int pname,float[] params,int offset)
public void glLightModelfv(int pname,FloatBuffer params)
最终顶点的颜色由这些参数(光源,材质光学属性,光照模型)综合决定(光照方程计算出)。