GLSurfaceView

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

  1、提供粘合代码把 OpenGL ES连接到你的视图系统
  2、提供粘合代码使得 OpenGL ES按照 Acticity(活动)的生命周期工作
  3、使它容易选择一款合适的框架缓冲区像素格式
  4、创建和管理一个独立的渲染线程,产生平滑的动画
  5、提供更容易使用的调试工具来跟踪 OpenGL ESAPI 并能找出错误。

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

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

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

Java代码:

  1. package eoe.googlers

  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import android.app.Activity;
  5. import android.opengl.GLSurfaceView;
  6. import android.os.Bundle;

  7. public class ClearActivity extends Activity {

  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {

  10. super.onCreate(savedInstanceState);

  11. mGLView = new GLSurfaceView(this);

  12. mGLView.setRenderer(new ClearRenderer());

  13. setContentView(mGLView);

  14. }

  15. @Override
  16. protected void onPause() {

  17. super.onPause();

  18. mGLView.onPause();

  19. }

  20. @Override
  21. protected void onResume() {

  22. super.onResume();

  23. mGLView.onResume();

  24. }

  25. private GLSurfaceView mGLView;

  26. }


  27. class ClearRenderer implements GLSurfaceView.Renderer {

  28. public void onSurfaceCreated(GL10 gl, EGLConfig config) {

  29. }

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

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

  32. }

  33. public void onDrawFrame(GL10 gl) {

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

  35. }

  36. }

复制代码

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

   GLSurfaceView.Renderer 有三个方法:

   onSurfaceCreated() :在开始渲染的时候被调用,无论什么时候OpenGL ES 渲染不得不重新被创建。(渲染是典型的丢失并重新创建当活动被暂停或恢复。)该方法一个创建长生命周期OpenGL资源(如材质)的好地方。
   onSurfaceChanged():该方法在surface大小改变时被调用。这是设置你opengl视图端的好地方。如果相机是固定的,不会围着场景移动,你也可以在这里设置你的相机。
   onDrawFrame():每帧的时候该方法都会被调用,这个用于画场景是可靠的。你完全可以通过调用glClear方法开清楚帧缓存,接着通过其他的opengl ES来调用画当前的场景。

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

Java代码:

  1. package eoe.googlers;

  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.opengl.GLSurfaceView;
  7. import android.os.Bundle;
  8. import android.view.MotionEvent;

  9. public class ClearActivity extends Activity {

  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {

  12. super.onCreate(savedInstanceState);

  13. mGLView = new ClearGLSurfaceView(this);

  14. setContentView(mGLView);

  15. }

  16. @Override
  17. protected void onPause() {

  18. super.onPause();

  19. mGLView.onPause();

  20. }

  21. @Override
  22. protected void onResume() {

  23. super.onResume();

  24. mGLView.onResume();

  25. }

  26. private GLSurfaceView mGLView;

  27. }

  28. class ClearGLSurfaceView extends GLSurfaceView {

  29. public ClearGLSurfaceView(Context context) {

  30. super(context);

  31. mRenderer = new ClearRenderer();

  32. setRenderer(mRenderer);

  33. }

  34. public boolean onTouchEvent(final MotionEvent event) {

  35. queueEvent(new Runnable(){

  36. public void run() {

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

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

  39. }

  40. });

  41. return true;

  42. }

  43. ClearRenderer mRenderer;

  44. }

  45. class ClearRenderer implements GLSurfaceView.Renderer {

  46. public void onSurfaceCreated(GL10 gl, EGLConfig config) {

  47. }

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

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

  50. }

  51. public void onDrawFrame(GL10 gl) {

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

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

  54. }

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

  56. mRed = r;

  57. mGreen = g;

  58. mBlue = b;

  59. }

  60. private float mRed;

  61. private float mGreen;

  62. private float mBlue;

  63. }

复制代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值