zoukankan      html  css  js  c++  java
  • 介绍GLSurfaceView

    android.opengl.GLSurfaceView类让你更容易地使用OpenGL ES渲染你的应用程序,其主要通过一下几点:

    1、提供粘合代码把OpenGL ES连接到你的视图系统

    2、提供粘合代码使得OpenGL ES按照Acticity(活动)的生命周期工作

    3、使它容易选择一款合适的框架缓冲区像素格式

    4、创建和管理一个独立的渲染线程,产生平滑的动画

    5、提供更容易使用的调试工具来跟踪OpenGL ES 的API 并能找出错误。

    GLSurfaceView是一个很好的基类对于构建一个使用OpenGL ES进行部分或全部渲染的应用程序。一个2D或3D的动作游戏就是一个很好的例子,例如一个2D或3D的可视化应用如谷歌地图。

    以下是一个简单的GLSurfaceView的应用:

    一个最简单的OpenGL ES应用代码如下:

    package  com.javaeye.googlers

    import javax.microedition.khronos.egl.EGLConfig;

    import javax.microedition.khronos.opengles.GL10;

    import android.app.Activity;

    import android.opengl.GLSurfaceView;

    import android.os.Bundle;

    public class ClearActivity extends Activity {

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            mGLView = new GLSurfaceView(this);

            mGLView.setRenderer(new ClearRenderer());

            setContentView(mGLView);

        }

        @Override

        protected void onPause() {

            super.onPause();

            mGLView.onPause();

        }

        @Override

        protected void onResume() {

            super.onResume();

            mGLView.onResume();

        }

        private GLSurfaceView mGLView;

    }

    class ClearRenderer implements GLSurfaceView.Renderer {

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

            // Do nothing special.

        }

        public void onSurfaceChanged(GL10 gl, int w, int h) {

            gl.glViewport(0, 0, w, h);

        }

        public void onDrawFrame(GL10 gl) {

            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        }

    }

    这个程序并没有做太多东西:它在每帧是清除屏幕到黑色。但是它是一个完整的OpenGL应用程序,正确地按照Activity(活动)的生命周期实现。当活动暂停渲染它也暂停渲染,活动恢复它也恢复。你可以把这个例子作为一个基本的交互的示例程序。仅仅更多地调用了ClearRenderer.onDrawFrame() 方法。注意你甚至不需要子类化一个GLSurfaceView视图。

    GLSurfaceView.Renderer 有三个方法:

    onSurfaceCreated() :在开始渲染的时候被调用,无论什么时候OpenGL ES 渲染不得不重新被创建。(渲染是典型的丢失并重新创建当活动被暂停或恢复。)该方法一个创建长生命周期OpenGL资源(如材质)的好地方。

    onSurfaceChanged():该方法在surface大小改变时被调用。这是设置你opengl视图端的好地方。如果相机是固定的,不会围着场景移动,你也可以在这里设置你的相机。

    onDrawFrame():每帧的时候该方法都会被调用,这个用于画场景是可靠的。你完全可以通过调用glClear方法开清楚帧缓存,接着通过其他的opengl ES来调用画当前的场景。

    用户如何输入?

    假如你想做一个可以交互的程序(如游戏),通常你会实现GLSurfaceView子类,因为这是很容易获取用户输入事件。以下代码是一个清晰的长例子展示给你怎样做到这个:

    package com.javaeye.googlers;

    import javax.microedition.khronos.egl.EGLConfig;

    import javax.microedition.khronos.opengles.GL10;

    import android.app.Activity;

    import android.content.Context;

    import android.opengl.GLSurfaceView;

    import android.os.Bundle;

    import android.view.MotionEvent;

    public class ClearActivity extends Activity {

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            mGLView = new ClearGLSurfaceView(this);

            setContentView(mGLView);

        }

        @Override

        protected void onPause() {

            super.onPause();

            mGLView.onPause();

        }

        @Override

        protected void onResume() {

            super.onResume();

            mGLView.onResume();

        }

        private GLSurfaceView mGLView;

    }

    class ClearGLSurfaceView extends GLSurfaceView {

        public ClearGLSurfaceView(Context context) {

            super(context);

            mRenderer = new ClearRenderer();

            setRenderer(mRenderer);

        }

        public boolean onTouchEvent(final MotionEvent event) {

            queueEvent(new Runnable(){

                public void run() {

                    mRenderer.setColor(event.getX() / getWidth(),

                            event.getY() / getHeight(), 1.0f);

                }});

                return true;

            }

            ClearRenderer mRenderer;

    }

    class ClearRenderer implements GLSurfaceView.Renderer {

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

            // Do nothing special.

        }

        public void onSurfaceChanged(GL10 gl, int w, int h) {

            gl.glViewport(0, 0, w, h);

        }

        public void onDrawFrame(GL10 gl) {

            gl.glClearColor(mRed, mGreen, mBlue, 1.0f);

            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        }

        public void setColor(float r, float g, float b) {

            mRed = r;

            mGreen = g;

            mBlue = b;

        }

        private float mRed;

        private float mGreen;

        private float mBlue;

    }

    这个应用每帧都在清楚屏幕。当你点击屏幕时,它清除颜色基于你触屏时间的X、Y坐标。注意在 ClearGLSurfaceView.onTouchEvent()中使用queueEvent()。queueEvent()方法被安全地用于在UI线程和渲染线程之间进行交流。如果你愿意,你还可以使用一些其他的java线程间交流技术,例如Renderer 类本身的同步方法。然而,queueing 事件经常是一种用于处理线程间信息交流的更简单方式。

    其他的GLSurfaceView示例:

    如果你厌烦了上面的示例,你还可以从android的ApiDemo中找到更经典的示例,所有的openGL ES示例都是用GLSurfaceView视图转变的:

    GLSurfaceView - 一个旋转的三角形

    Kube - 一个魔方例子

    Translucent GLSurfaceView - 展示在一个透明的背景上显示3d动画

    Textured Triangle - 显示一个带纹理的3D三角形

    Sprite Text - 展示怎样用材质画出文字并混合进一个3d的场景中

    Touch Rotate - 展示怎样旋转一个3D物体来响应用户的输入

  • 相关阅读:
    使用四元数点乘比较插值是否即将完成
    ShadowGun Demo学习(非技术向)
    测试-关于Unity获取子层级内容的几种接口(Transform FindChild, Component GetComponentInChildren,...)
    Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
    Javascript事件模型系列(一)事件及事件的三种模型
    在代码中设置IE9的默认文档模式
    如何在博客园的文章/随笔中添加可运行的js代码
    jquery插件:仿百度首页可展开收起的消息提示控件
    有“镜头感”的网页是如何实现的
    HTML5 history API实践
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/FSDF32423434.html
Copyright © 2011-2022 走看看