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



    }

}

 

 

 

你可能感兴趣的:(OpenGL)