通过学习《OpenGL ES应用开发实践指南》总结如何在安卓上创建一个OpenGL程序,并且在屏幕上绘制图案。
一、OpenGL管道
首先知道OpenGL在把本地内存中的数据绘制到屏幕所经历的步骤
- Read Vertex Data:读取顶点数据
Execute Vertex Shader:执行顶点着色器
顶点着色器:生成每个顶点的最终位置,每个顶点都会执行一次,一旦顶点的最终位置确定,OpenGL就把这些可见的顶点集合组装成点、线和三角形。
Assemble Primitives:组装图元
图元:组成图像的基本单元
Rasterize Primitives:光栅化图元
光栅化:即把每个点、直线及三角形分解成小片段
Execute Fragment Shader:执行片段着色器
片段着色器:组成点、直线或者三角形的每个片段的最终颜色,针对每个片段,它都会执行一次,一个片段是一个小的、单一的长方形区域,类似于计算机屏幕上的一个像素
- Write to Frame Buffer:写入帧缓冲区
- See It on the Screen: 显示在屏幕上
上述过程描:
1. 先读取保存在内存的顶点数据;
2. 执行顶点着色器把顶点数据转化成为点、线或者三角形,并且确定在屏幕上的位置;
3. 之后为了确定这些点、线和三角形的颜色,而光栅化它们,即把它们分解成一个个的小片段
4. 执行片段着色器,确定每一个小片段的颜色
5. 确定完位置和颜色后,写入一个叫帧缓冲区的内存区域
6. 显示在屏幕上
二、创建程序
2.1 创建一个初始化OpenGL的实例
2.1.1 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.opengl.GLSurfaceView
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
2.1.2 初始化类
public class MainActivity extends AppCompatActivity{
private GLSurfaceView mGLSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGLSurfaceView = (GLSurfaceView)findViewById(R.id.surface);
//checking if the system supports OpenGL ES 2.0
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000
|| (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
&&(Build.FINGERPRINT.startsWith("generic"))
|| Build.FINGERPRINT.startsWith("unknow")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86");
if(supportsEs2){
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setRenderer(new MyRenderer());
}
}
@Override
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
}
}
创建GLSurfaceView实例
setContentView(R.layout.activity