Displaying Graphics with OpenGL ES(一)——构建一个OpenGL ES环境

本文介绍如何在Android应用中使用GLSurfaceView和GLSurfaceView.Renderer接口绘制OpenGLES图形。首先需要在AndroidManifest.xml文件中声明OpenGL ES 2.0 API的使用权限,并创建一个继承自Activity的类,将GLSurfaceView作为ContentView。接着定义一个GLSurfaceView子类,用于接收触摸事件,并设置OpenGL ES 2.0上下文版本。

翻译自官方文档http://developer.android.com

为了在app里绘制图形,你必须创建一个容器。最直接的方式就是实现GLSurfaceView和GLSurfaceView.Render接口。GLSurfaceView是图形和OpenGL绘图的视图控制器而GLSurefaceView.Renderer控制在视图里绘图(理解为画笔)。想了解更多这些classes,点击OpenGL ES

GLSurfaceView 只是一种在app里包含OpenGL ES图形的方式,对于全屏或接近全屏的图形视图,他是一个合理的选择。开发者们如果想在layout的小部分里体现OpenGL ES图形,你应该看一下TextureView。说真的,程序猿自己动手,也可以构建一个OpenGL ES视图用SurfaceView,但是得写相当多得额外代码。

本课程介绍怎样实现用GLSurfaceView和GLSurfaceView.Renderer做一个简单的app

1. 在Manifests声明

为了能够使用OpenGL ES 2.0 API,必须添加如下声明。

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

如果app使用了纹理压缩,必须声明压缩格式,使其只在兼容设备安装。

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

关于更多纹理压缩的格式,可参考OpenGL

2.创建一个OpenGL ES图形Activity

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 需要api 2.2以上

3.构建一个GLSuerfaceView

GLSurfaceView 是一个特殊的veiw, 你可以在其中画OpenGL ES 图形,它本身虽然没有太多代码实现,但你也别不实现它或者直接使用它,你实现它为了获得touch events,

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.RENDERMODE_WHEN_DIRTY ,这样仅在你的数据有变化时重新进行渲染。

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

除非你调用requestRender(),这个设置会阻止帧被重画,有些情况下这样效率更高。

4.构建一个Render

这是一个渲染类,它控制着与之关联的GLSuerfaceView在上面画什么东西,其中3个方法需要被重写:

onSurfaceCreated() - 调用一次以建立视图的OpenGL ES的环境。
onDrawFrame() - 被执行每个重绘。

onSurfaceChanged() - 视图改变时被调用,比如屏幕方向改变

一个非常简单的实例:

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);
    }
}

一切就是这么简单!上面的例子使用OpenGL 显示一个黑色背景的app。尽管此代码不能做任何事情很有意思,通过创建这些类,你已经奠定需要开始绘制用OpenGL图形元素的基础。

你可能想知道为什么这些方法都有一个GL10参数,当您使用的OpenGL ES2.0 API。这些方法签名只是重复使用为2.0 API来保持Android框架代码更简单。

如果你熟悉了OpenGL ES APIS,你应该能建立一个OpenGL ES 在app里绘图。如果你需要更多的了解,请看下一课

>>Defining Shapes

乐播投屏是款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值