Android OpenGL是开放图形库

重点:
OpenGL是开放图形库
OpenGL是个专业的3D程序接口,是一个功能强大调用方便的底层 3D 图形库。

1.定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)
2.是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库
3.帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发
----------------------------------------------
Android引擎采用的是OpenGL ES ,是一套为手持和嵌入式系统设计的 3D 引擎 API
==============================================================================
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的可视化应用如谷歌地图。
--------------------------------------------------
一、在Activity中:
public class TestActivity extends Activity {
public GLSurfaceView mGLView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mGLView=new GLSurfaceView(this); //建立动画显示视图
        mGLView.setRenderer(new CubeRenderer());//设置渲染对象
        setContentView(mGLView); //作为Activity的界面
    }

@Override
protected void onPause() {
super.onPause();
mGLView.onPause(); //打开其它Activity时暂停渲染
}

@Override
protected void onResume() {
super.onResume();
mGLView.onResume(); //恢复Activity时恢复渲染
}
}

二、实现Renderer的类
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.GLWrapper;
import android.opengl.GLSurfaceView.Renderer;

public class CubeRenderer implements Renderer, GLWrapper {
//1每帧动画需要做的操作
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BITS);//重设背景色
}
//2动画显示视图变化时的操作
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {//当GLsurface大小改变时调用该方法
gl.glViewport(0, 0, width, height);//保存场景大小

}
//3动画显示视图建立时的操作
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.7f, 0.7f, 0.9f, 1.0f);//清屏
}
@Override
public GL wrap(GL gl) {
return null;
}
}



上面是一个简单的GLSurfaceView实例。

这个程序并没有做太多东西:它在每帧是清除屏幕到黑色。但是它是一个完整的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视图转变的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值