初探OpenGL(一)

OPenGL ES 1.X 面向功能固定的硬件所涉及并提供加速支持,图形质量以及性能标准。

OpenGL ES2.X则提供包括着色器技术在内的全编程3D图形算法。----硬件要求比较高。

OpenGL ES-SC 专为有高安全型需求的特殊市场精心打造的。

 

OPenGL ES OpenGL的不同

浮点数和定点数

OPenGL ES 不支持double型双精度浮点数。有单精度浮点数代替。

引入新的定点数据类型

32位整型数据才存储,高16位表示整数,低16位表示小数。

浮点数乘以216次方------>转化为定点数;

定点数除以216次方,就转化成浮点数。

图元

OpenGL ES仅仅支持三角,线,点。

四角和多边形不支持。

变化和光照

OpenGL ES 丢弃颜色矩阵堆栈,并限定模型视图矩阵堆栈的深度为16;原生转化矩阵不被支持;纹路坐标不被支持。对于颜色,只支持RGBA模式,不支持索引色。

纹理映射

openGL ES仅仅支持2D纹理映射,但是1D映射可以用2D纹理来模拟。

3d----开销太大----摒弃。

openGL ES支持调色板纹理,这是一种高效纹理数据的方式。

帧缓存操作

只保留渲染缓存,累积缓存被丢弃。

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

    }
}

 

 

 

posted @ 2013-12-03 10:06  西北野狼  阅读(449)  评论(0编辑  收藏  举报