zoukankan      html  css  js  c++  java
  • 初探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);
    
        }
    }

     

     

  • 相关阅读:
    linux 下查看网速的方法 (不需要安装任何软件)
    Raspberry Pi Kernel Compilation 内核编译官方文档
    Kernel compiling for Pi 2
    从源码编译rpi的内核
    设备驱动调试和移植的一般方法
    爸爸的歌
    表扬?批评?
    日历插件js,jquery
    zepto jquery和zepto的区别?
    怎么学习PS快?
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/3455199.html
Copyright © 2011-2022 走看看