android OpenGL(一) 开始准备

写几篇文章记录一下我学习OpenGL的过程,这是第一篇。本片文章通过实现一个清屏操作,先了解一些基本知识。

1.创建一个activity,作为展示页面:

/**
 * 视图展示页面,只实现了清屏的操作<br/>
 * 1.创建GLSurfaceView<br/>
 * 2.调用GLSurfaceView的setRenderer方法,设置Renderer<br/>
 * 3.实现Renderer<br/>
 * 4.处理Activity的生命周期事件<br/>
 */
public class FirstOpenGLActivity extends AppCompatActivity {
    private static final String TAG = FirstOpenGLActivity.class.getSimpleName();

    private GLSurfaceView mGLSurfaceView;
    /**
     * is render seted
     */
    private boolean isRendererSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGLSurfaceView = new GLSurfaceView(this);

        //检察系统是否支持OpenGL ES 2.0
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        boolean isSupportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
        Log.d(TAG, "isSupportsEs2 =" + isSupportsEs2);

        if (isSupportsEs2) {
            //Request an OpenGL ES 2.0 compatible context
            mGLSurfaceView.setEGLContextClientVersion(2);

            //Assign our renderer
            //当surface创建或者发生变化的时候,以及要绘制一副新帧时,渲染器都会被GLSurfaceView调用
            mGLSurfaceView.setRenderer(new FirstOpenGLRenderer());
            isRendererSet = true;
        } else {
            Toast.makeText(this, "this device dose not support OpenGL ES 2.0", Toast.LENGTH_SHORT);
        }

        setContentView(mGLSurfaceView);
    }

    //页面恢复,继续后台渲染线程,续用OpenGL上下文
    @Override
    protected void onResume() {
        super.onResume();
        if (isRendererSet) {
            mGLSurfaceView.onResume();
        }
    }

    //页面不可见,暂停后台渲染线程,释放OpenGL上下文
    @Override
    protected void onPause() {
        super.onPause();
        if (isRendererSet) {
            mGLSurfaceView.onPause();
        }
    }
}

2.创建一个渲染器类实现Renderer接口:

/**
 * 渲染器类 实现了Renderer接口
 * Created by hsji on 16/1/10.
 */
public class FirstOpenGLRenderer implements GLSurfaceView.Renderer {
    /**
     * 当surface被创建的时候,GLSurfaceView会调用这个方法;
     * 这发生在应用程序第一次运行的时候,并且,当设备被唤醒或者用户从其他activity切换回来的时,这个方法也可能会被调用。
     * 在实践中,这意味着当程序运行时这个方法可能会被调用多次。
     *
     * @param gl10
     * @param eglConfig
     */
    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
        //设置清空屏幕所使用的颜色RGBA
        GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    }

    /**
     * 在surface被创建之后,每次surface尺寸发生变化时,这个方法都会被GLSurfaceView调用到。
     * 在横屏、竖屏之间来回切换的时候,Surface的尺寸会发生变化。
     *
     * @param gl10
     * @param width
     * @param height
     */
    @Override
    public void onSurfaceChanged(GL10 gl10, int width, int height) {
        //set the OpenGL viewport to to fill the entire surface
        GLES20.glViewport(0, 0, width, height);
    }

    /**
     * 当绘制一帧时,这个方法会被GLSurfaceView调用。
     * 在这个方法中我们一定要绘制一些东西,即使只是清空屏幕;
     * 因为,在这个方法返回之后,渲染缓冲区会被交换并显示在屏幕上,
     * 如果什么都没画,可能会看到闪烁效果
     *
     * @param gl10
     */
    @Override
    public void onDrawFrame(GL10 gl10) {
        //clear the rendering surface
        //清空屏幕,擦出屏幕上的所有颜色,并调用之前glClearColor()定义的颜色填充整个屏幕
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    }
}

一点解释:怎么会有一个未被使用的参数类型GL10呢?

* 他是OpenGL ES 1.0的API遗留下来的;* 如果要编写使用OpenGL ES 1.0的渲染器,就要使用这个参数,* 但是对于OpenGL ES 2.0,GLES20类提供了静态方法来存取。

3.渲染线程和主线程之间的交互(之后还会详细涉及,这里只是一个概要)

    GLSurfaceView会在一个单独的线程中调用渲染器的方法。默认情况下,GLSurfaceView会以显示设备的刷新频率不断的渲染,当然,它也可以配置为按请求渲染,只需要用GLSurfaceView.RENDERMODE_WHEN_DIRTY作为参数调用GLSurfaceView.setRenderMode()即可。    既然android的GLSurfaceView在后台县城中执行渲染,就必须要小心,只能在这个渲染线程中调用OpenGL,在android主线程中使用UI相关的调用;两个线程之间的通信可以使用如下方法:在主线程中的GLSurfaceView实例可以调用queueEvent()方法传递一个Runnable给后台渲染线程,渲染线程就可以调用Activity的runOnUIThread()来传递事件(event)给主线程。

4.运行程序即可看到一个纯红色的屏幕。

时间: 2024-09-30 10:52:30

android OpenGL(一) 开始准备的相关文章

Android OpenGL ES

1.Android OpenGL ES 简明开发教程3D 坐标变换: http://www.linuxidc.com/Linux/2011-10/45756p4.htm

Android OpenGL ES零基础系列(一):理解GLSurfaceView,GLSurfaceView.Render的基本用法

转载请注明出处 前言 OpenGL ES是OpenGL的一个子集,是针对手机.PDA和游戏主机等嵌入式设备而设计的.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 因此OpenGL ES作为第三方库被应用在android中. 到目前为止,OpenGL ES已经发展有了3个版本,OpenGL ES 1.0 , OpenGL ES 2.0 , OpenGL ES 3.0.其中OpenGL ES 1.0 是以OpenGL 1.3

[工作记录] Android OpenGL ES: non-square texture - continue

previous: [工作记录] Android OpenGL ES 2.0: square texture not supported on some device recently I found that it is the mipmap of a non-square texture that cause the black texture problem: http://stackoverflow.com/questions/5052762/using-mipmaps-results-

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形.尽管功能简单,可是我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了. 第一个文件:MainActivity.java package com.example.learnopengl1; import android.opengl.GLSurface

Android OpenGL ES 开发教程 从入门到精通

From:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

Android OpenGL ES(一)----必备知识

1.手机的坐标空间 我们都知道要想在手机上随心所欲的绘制图形,就必须了解手机的坐标体系.下图就是将坐标映射到手机屏幕的坐标. 图1 手机屏幕基本坐标系 2.OpenGL基本图形 在OpenGL里,只能绘制点,直线以及三角形. 三角形是最基本的图形,因为它的结构如此稳定,它随处可见,比如桥梁的结构化构件,它有三条边用来连接它的三个顶点,如果我们拿掉其中一个顶点,剩下的就是一条直线,如果我们再拿掉一个点,就只剩下一个点了. 点和直线可以用于某些效果,但是只有三角形才能用来构造拥有复杂的对象和纹理的场

Android OpenGL ES 应用(一)

OpenGL已经成了3D的一个"标准" 因为它能跨平台,接口也比较丰富,几乎大部分的手机3D游戏都和OpenGL有关系. 当然还有微软有direct X 但只能在微软平台上使用. OpenGL底层是c/c++实现,JAVA中使用都是用封装好的类库.Android提供了以下几个接口包 可使用,基本能达到3D技术的要求. Android平台用OpenGL ES 这个子集来处理图像,现在OpenGL ES基本用2.0的了,很少再用1.0的,3.0还未流行起来. 首先编写判断Android设备

[工作记录] Android OpenGL ES 2.0: square texture not supported on some device

npot texture: non-power-of-two texture.rectangle texture: non-square (height != wdith) 在测试Samsumg Galaxy S4的时候, 发现rectangle texture支持不好, 虽然创建成功, 但是绘制有问题. 不同的模块出现类似的情况: 纹理采样出的颜色是(0,0,0,1). 在排除了所有可能的runtime问题以后, 尝试性改了纹理格式无果, 又尝试性的改了下尺寸, 竟然好了. 我擦... 而Ga

Android OpenGL ES(四)----调整屏幕的宽高比

1.宽高比问题 我们现在相当熟悉这样一个事实,在OpenGL里,我们要渲染的一切物体都要映射到X轴和Y轴上[-1,1]的范围内,对于Z轴也一样.这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际尺寸或形状. 不幸的是,因为它们独立于实际的屏幕尺寸,如果直接使用它们,我们就会遇到问题,例如在横屏模式下被压扁的桌子. 假设实际的设备分辨率以像素为单位是1280*720,这在新的Android设备上是一个常用的分辨率.为了使讨论更加容易,让我们也暂时假定OpenGL占用整个显示屏. 如果设备是在竖

Android OpenGL ES 画球体

最近因为兴趣所向,开始学习OpenGL绘图.本文以"画球体"为点,小结一下最近所学. > 初识OpenGL ES 接触OpenGL是从Android开始的.众所周知,Android View 是线程不安全的,于是只允许在主线程中对View进行操作.然而假如我们需要实现复杂的界面,特别是开发游戏,在主线程中画大量图像,会耗费比较长的时间,使得主线程没能及时响应用户输入,甚至出现ANR.于是Android提供了一个 SurfaceView类,通过双缓冲机制(两块画布?三块画布?),允