我的第一个OpenGL ES程序
本节要点:
- Open GL ES简介
- 开发工具简介
- 编写第一个Open GL ES程序
- 相关名词简介
1.Open GL ES 简介
说到Open GL或许大多数人都知道,那么Open GL ES究竟是个什么鬼,好嘛,让我来告诉你,Open GL ES是Open GL三维图形API的子集,针对手机,PDA和游戏主机等嵌入式设备而设计,目前主要发展为三个版本:
- Open GL ES1.x
OpenGL ES 1.x 针对固定管线硬件的 - Open GL ES 2.0
OpenGL ES 2.x 针对可编程管线硬件,支持Android 2.2以上系统,支持Android NDK2.0以上版本,支持IPad,IPhone3G及后续版本。 - 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.开发工具简介
本次开发用到的主要工具软件有:
- Android Studio1.4正式版
- Android SDK
- Android NDK
- JDK
- 操作系统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();
}
}
. 新建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.相关名词简介
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)