初探OpenGL(一)
OPenGL ES 1.X 面向功能固定的硬件所涉及并提供加速支持,图形质量以及性能标准。
OpenGL ES2.X则提供包括着色器技术在内的全编程3D图形算法。----硬件要求比较高。
OpenGL ES-SC 专为有高安全型需求的特殊市场精心打造的。
OPenGL ES 与OpenGL的不同
1 浮点数和定点数
OPenGL ES 不支持double型双精度浮点数。有单精度浮点数代替。
2 引入新的定点数据类型
32位整型数据才存储,高16位表示整数,低16位表示小数。
浮点数乘以2的16次方------>转化为定点数;
定点数除以2的16次方,就转化成浮点数。
3 图元
OpenGL ES仅仅支持三角,线,点。
四角和多边形不支持。
4 变化和光照
OpenGL ES 丢弃颜色矩阵堆栈,并限定模型视图矩阵堆栈的深度为16;原生转化矩阵不被支持;纹路坐标不被支持。对于颜色,只支持RGBA模式,不支持索引色。
5 纹理映射
openGL ES仅仅支持2D纹理映射,但是1D映射可以用2D纹理来模拟。
3d----开销太大----摒弃。
openGL ES支持调色板纹理,这是一种高效纹理数据的方式。
6 帧缓存操作
只保留渲染缓存,累积缓存被丢弃。
OpenGL Demo1
1 import android.app.Activity; 2 import android.opengl.GLSurfaceView; 3 import android.os.Bundle; 4 5 import com.doodev.chapter12.renderer.HelloOpenGLESRenderer; 6 7 public class HelloOpenGLES extends Activity { 8 /** 9 * 这里是我们的OpenGL ES渲染View 10 */ 11 private GLSurfaceView mGLSurfaceView; 12 13 /** Called when the activity is first created. */ 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 18 /** 19 * 初始化OpenGL ES View 20 */ 21 mGLSurfaceView = new GLSurfaceView(this); 22 /** 23 * 设置渲染器为我们具体实现的渲染器 24 */ 25 mGLSurfaceView.setRenderer(new HelloOpenGLESRenderer()); 26 27 setContentView(mGLSurfaceView); 28 } 29 30 @Override 31 protected void onResume() { 32 super.onResume(); 33 /** 34 * 这里需要同步调用OpenGL ES View的onResume操作, 通知底层OpenGL ES从挂起状态中返回 35 */ 36 mGLSurfaceView.onResume(); 37 } 38 39 @Override 40 protected void onPause() { 41 super.onPause(); 42 /** 43 * 这里需要同步调用OpenGL ES View的onPause操作, 通知底层OpenGL ES停止后台更新,处于挂起状态 44 */ 45 mGLSurfaceView.onPause(); 46 } 47 }
package com.doodev.chapter12.renderer; import android.opengl.GLSurfaceView; import android.opengl.GLU; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class HelloOpenGLESRenderer implements GLSurfaceView.Renderer { /** * * @Name onDrawFrame * @Description TODO(绘图操作) * @param gl * @see android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax.microedition.khronos.opengles.GL10) * @Date 2013-12-3 上午10:02:42 * */ @Override public void onDrawFrame(GL10 gl) { // 一般的opengl程序,首先要做的就是清屏 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 紧接着设置模型视图矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0); // 渲染物体 } /** * @Name onSurfaceChanged * @Description TODO(当窗口的大小发生改变时) * @param gl * @param width * @param height * @see android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax.microedition.khronos.opengles.GL10, int, int) * @Date 2013-12-3 上午10:55:22 * */ @Override public void onSurfaceChanged(GL10 gl, int width, int height) { /*设置OPenGL场景大小*/ gl.glViewport(0, 0, width, height); float ratio = (float) width / height; //设置投影矩阵----为场景增加透视 gl.glMatrixMode(GL10.GL_PROJECTION); //近似重置----将矩阵恢复到原始状态 gl.glLoadIdentity(); //设置视口大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); gl.glMatrixMode(GL10.GL_MODELVIEW); } /** * * @Name onSurfaceCreated * @Description TODO(对openGL做初始化工作) * @param gl * @param config * @see android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax.microedition.khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig) * @Date 2013-12-3 上午9:44:43 * */ @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { /*告诉系统对透视进行修正*/ gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); /*设置最亮的颜色 * arg1--red * arg2--green * arg3--blue * 最小值0.0 做大1.0 * */ gl.glClearColor(1, 1, 1, 1); /*设置阴影平滑*/ gl.glShadeModel(GL10.GL_SMOOTH); /*设置深度缓存*/ gl.glClearDepthf(1.0f); /*设置深度缓存*/ gl.glEnable(GL10.GL_DEPTH_TEST); /*设置深度测试类型*/ gl.glDepthFunc(GL10.GL_LEQUAL); } }