Android OpenGL ES从零开始

我的第一个Open GL ES程序

本节要点:

  • OpenGL ES 简介
  • 开发工具简介
  • 第一个OpenGLES程序的编码
  • 相关名词简介

下面就让我们一起开始学习吧。


1. OpenGLES 简介
说到Open GL或许大多数人都知道,那么Open GL ES究竟是个什么鬼,好嘛,让我来告诉你,Open GL ES是Open GL三维图形API的子集,针对手机,PDA和游戏主机等嵌入式设备而设计,目前主要发展为三个版本:

  1. Open GL ES 1.x
    OpenGL ES 1.x 针对固定管线硬件的
  2. Open GL ES 2.0
    OpenGL ES 2.x 针对可编程管线硬件,支持Android 2.2以上系统,支持Android NDK2.0以上版本,支持IPad,IPhone3G及后续版本,相关详细信息参见 [ 百度百科 ]
  3. Open GL ES 3.0
    1、渲染管线多重增强,实现先进视觉效果的加速,包括遮挡查询(Occlusion Query)、变缓反馈(Transform Feedback)、实例渲染(Instanced Rendering)、四个或更多渲染目标支持。
    2、高质量ETC2/EAC纹理压缩格式成为一项标准功能,不同平台上不再需要需要不同的纹理集。
    3、新版GLSL ES 3.0着色语言,全面支持整数和32位浮点操作。
    4、纹理功能大幅增强,支持浮点纹理、3D纹理、深度纹理、顶点纹理、NPOT纹理、R/RG单双通道纹理、不可变纹理、2D阵列纹理、无二次幂限制纹理、阴影对比、调配(swizzle)、LOD与mip level clamps、无缝立方体贴图、采样对象、纹理MSAA抗锯齿渲染器。
    5、一系列广泛的精确尺寸纹理和渲染缓冲格式,便携移动应用更简单。
    OpenGL ES工作组会在六个月内更新OpenGL ES采纳者项目,提供广泛的兼容性测试,并提供相关源代码。

2.开发工具简介
本次开发工具主要有:

  1. Android Studio 1.4正式版
  2. Android SDK
  3. Android NDK
  4. JDK 1.8
  5. Ubuntu 14.04
    环境是软件开发的前提,还没有装好环境的伙伴们快去装软件吧。环境尚未装好的伙伴快去看一下吧。

3.开发第一个Open GL ES程序

  1. 新建项目
    Android Studio->start new Android Application->…->FirstOpenGLProjectActivity.java->finish
    注意事项:
    OpenGL ES2.0目前最低支持Android 2.2以上系统版本,所有选择在>2.2
  2. 打开FirstOpenGLProjectActivity.java并加入如下代码:
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.opengl.GLSurfaceView;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class FirstOpenGLProjectActivity extends AppCompatActivity {
    //声明GlSurfaceView
    private GLSurfaceView glSurfaceView;
    //声明Render
    private boolean renderSet = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //实例化GlSurfaceView
        glSurfaceView = new GLSurfaceView(this);
        if (isSupportedOpenGlEs2()){
            //如果支持OpenGLES2以上,绑定renderer
            glSurfaceView.setRenderer(new FirstOpenGLProjectRender());
            renderSet = true;
        }else{
            Toast.makeText(this,"Not Supported OpenGLES",Toast.LENGTH_LONG).show();
        }
        //将GlSurfaceView实例装入当前activity
        setContentView(glSurfaceView);
    }
    //判断设备是否支持OpenGlES2.0以上
    public boolean isSupportedOpenGlEs2(){
        final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        //如果在真机上判断只需要configurationInfo.reqGlEsVersion>=0x20000即可,后面的一部分是用来判定模拟器是否支持
        final boolean suppotrOpenGles2=configurationInfo.reqGlEsVersion>=0x20000||(Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)&&(Build.FINGERPRINT.startsWith("generic")||Build.FINGERPRINT.startsWith("unknown")||Build.MODEL.contains("google_sdk")||Build.MODEL.contains("Emulator")||Build.MODEL.contains("Android SDK built for x86"));
        return suppotrOpenGles2;
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (renderSet){
            glSurfaceView.onPause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (renderSet){
            glSurfaceView.onResume();
        }
    }
3. 新建FirstOpenGLESProjectRender.java
     FirstOpenGLESProjectRender类需要实现Renderer接口并实现其内定义的三个抽象方法:        
     @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
     //当surface大小发生变化时调用,例如横竖屏切换
    }
     @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //当surface创建时调用
    }
    @Override
    public void onDrawFrame(GL10 gl) {
     //绘画当前帧时调用该方法
    }       

完整的FirstOpenGLProjectRender代码如下
import android.opengl.GLSurfaceView;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class FirstOpenGLProjectRender implements GLSurfaceView.Renderer{
public FirstOpenGLProjectRender() {
} @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(1.0f,1.0f,0.0f,0.0f);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    gl.glViewport(0,0,width,height);
}

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}

}

 4. 运行项目
 ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/42255cd700839e29bd331a5d9002d9ef.png)
----------


**4.相关名词简介**

 1. GLSurfaceView
     GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。
        GLSurfaceView提供了下列特性:
                1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
                2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
                3> 用户自定义渲染器(render)。
                4> 让渲染器在独立的线程里运作,和UI线程分离。
                5> 支持按需渲染(on-demand)和连续渲染(continuous)。
                6> 一些可选工具,如调试。
           GlSurfaceView的初始化关键就在于为它设置一个渲染器,可以通过setRenderer(Renderer)设置一个渲染器(render)
 
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值