图片和图形之构建一个OpenGL ES环境(10)

原文

概要


构建一个OpenGL ES环境
为了在Android应用程序中使用OpenGL ES绘制图形,您必须为它们创建一个视图容器。其中一种更直接的方法是实现a GLSurfaceView和a GLSurfaceView.Renderer。A GLSurfaceView是使用OpenGL绘制的图形的视图容器,并 GLSurfaceView.Renderer控制该视图内绘制的内容。有关这些类的更多信息,请参阅OpenGL ES 开发人员指南。

GLSurfaceView只是将OpenGL ES图形集成到您的应用程序中的一种方法。对于全屏或近满屏图形视图,这是一个合理的选择。希望将OpenGL ES图形集成到其小部分布局中的开发人员应该关注一下TextureView。对于真正的自己动手的开发人员,也可以使用OpenGL ES视图来构建SurfaceView,但这需要编写相当多的附加代码。

本课程介绍了如何完成一个最小的实现GLSurfaceView,并GLSurfaceView.Renderer在一个简单的应用程序活动。

声明OpenGL ES在清单中的使用


为了让您的应用程序使用OpenGL ES 2.0 API,您必须将以下声明添加到清单中:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果您的应用程序使用纹理压缩,则还必须声明您的应用支持哪种压缩格式,以便它仅安装在兼容设备上。

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

有关纹理压缩格式的更多信息,请参阅 OpenGL开发人员指南。

为OpenGL ES图形创建一个活动


使用OpenGL ES的Android应用程序具有与具有用户界面的任何其他应用程序一样的活动。与其他应用程序的主要区别在于您为活动布置的内容。虽然在许多应用程序中您可能会使用TextView,Button而ListView在使用OpenGL ES的应用程序中,您也可以添加一个GLSurfaceView。

以下代码示例显示了使用GLSurfaceView作为主视图的活动的最小实现 :

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}

注意: OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本,因此请确保您的Android项目针对的是API或更高版本。

构建一个GLSurfaceView对象


A GLSurfaceView是您可以绘制OpenGL ES图形的专用视图。它本身并没有多大作用。对象的实际绘制由GLSurfaceView.Renderer您在此视图中设置的控制 。实际上,这个对象的代码太稀薄了,你可能会试图跳过扩展它,只是创建一个未修改的 GLSurfaceView实例,但不这样做。您需要扩展此类以捕获触摸事件,这在“ 触摸事件的响应”课程中有介绍。

a的基本代码GLSurfaceView是最小的,所以为了快速实现,通常在使用它的活动中创建一个内部类:

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer mRenderer;

    public MyGLSurfaceView(Context context){
        super(context);

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        mRenderer = new MyGLRenderer();

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(mRenderer);
    }
}

另一个可选的GLSurfaceView实现方式是将渲染模式设置为仅在使用以下GLSurfaceView.RENDERMODE_WHEN_DIRTY 设置更改绘图数据时绘制视图 :

// 呈现视图时,才会有在绘图数据的变化
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

构建一个渲染器类


GLSurfaceView.Renderer在使用OpenGL ES的应用程序中实现类或渲染器是开始变得有趣的地方。这个类控制GLSurfaceView与它关联的内容。在渲染器中有三种方法由Android系统调用,以便找出在a GLSurfaceView:上绘制什么和如何绘制:

  • onSurfaceCreated() - 调用一次以设置视图的OpenGL ES环境。
  • onDrawFrame() - 为视图的每次重绘调用。
  • onSurfaceChanged() - 如果视图的几何结构发生变化(例如,当设备的屏幕方向改变时),则调用此方法。

这是OpenGL ES渲染器的一个非常基本的实现,它只不过是在以下内容中绘制黑色背景GLSurfaceView:

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

这里的所有都是它的!上面的代码示例创建了一个简单的Android应用程序,该应用程序使用OpenGL显示黑屏。虽然这段代码没有做任何有趣的事情,但通过创建这些类,您已经奠定了开始使用OpenGL绘制图形元素所需的基础。

注意:您可能想知道为什么这些方法有一个GL10参数,当您使用OpengGL ES 2.0 API时。这些方法签名仅用于2.0 API以保持Android框架代码更简单。

如果您熟悉OpenGL ES API,则现在应该能够在您的应用程序中设置OpenGL ES环境并开始绘制图形。但是,如果您需要更多的OpenGL入门帮助,请继续阅读下一课以获取更多提示。

    Lastest Update:2018.04.25

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

图片和图形之构建一个OpenGL ES环境(10)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章