OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集字逗,針對手機俺驶、PDA和游戲主機等嵌入式設(shè)備而設(shè)計。
OpenGL(Open Graphics Library)是一個跨編程語言、跨平臺的3D圖形庫。廣泛應(yīng)用于游戲跳仿、娛樂、VR等領(lǐng)域.安卓系統(tǒng)中的核心庫層就有這個捐晶。
OpenGL ES是在OpenGL基礎(chǔ)上針對移動端而裁剪的 菲语。
OpenGL ES由當初的1.0、2.0發(fā)展到現(xiàn)在的3.0了惑灵。我這個系列是針對2.0的.因為3.0的只支持android 4.3以上的版本,即時是4.3以上山上,有的手機硬件也還不支持3.0 。
一英支、GLSurfaceView介紹
在Android平臺上實現(xiàn)OpenGL的view很簡單,只需要用到GLSurfaceView
和GLSurfaceView.Renderer
佩憾。
GLSurfaceView是用來連接OpenGL ES和android的view結(jié)構(gòu)的.GLSurfaceView位于android.opengl包類,繼承自SurfaceView
public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
......
}
二、GLSurfaceView.Renderer介紹
Renderer
也叫渲染器,是一個接口潭辈,位于GLSurfaceView類中.
public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
......
public interface Renderer {
void onSurfaceCreated(GL10 gl, EGLConfig config);
void onSurfaceChanged(GL10 gl, int width, int height);
void onDrawFrame(GL10 gl);
......
}
}
提供了三個方法
- onSurfaceCreated -------- 在Surface創(chuàng)建的時候調(diào)用
- onSurfaceChanged-------- 在Surface改變的的時候調(diào)用
- onDrawFrame ------------- 在Surface上繪制的時候調(diào)用
三鸯屿、搭建一個最基本的框架
按照以下步驟
1.新建一個Android項目
2.新建GLSurfaceView實例
3.創(chuàng)建渲染器Renderer實例
4.給GLSurfaceView設(shè)置Renderer實例
5.顯示GLSurfaceView
一言不合貼代碼
public class MainActivity extends Activity {
private GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果本設(shè)備支持OpenGl ES 2.0
if (IsSupported()) {
//新建GLSurfaceView實例
glSurfaceView = new GLSurfaceView(this);
// 創(chuàng)建渲染器實例
MyRenderer mRenderer = new MyRenderer();
// 設(shè)置渲染器
glSurfaceView.setRenderer(mRenderer);
//顯示SurfaceView
setContentView(glSurfaceView);
}
}
IsSupported()方法的代碼如下
private boolean IsSupported() {
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;
return supportsEs2;
}
實際中我們以后所有的處理都實現(xiàn)在MyRenderer這個接口的實現(xiàn)類,我在這里顯示一個綠色的空白屏幕
public class MyRenderer implements GLSurfaceView.Renderer {
// Surface創(chuàng)建的時候調(diào)用
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 設(shè)置清屏顏色
gl.glClearColor(0f, 1f, 0f, 0f);
}
// Surface改變的的時候調(diào)用
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 設(shè)置窗口大小
gl.glViewport(width / 4, width / 2, width / 2, height / 2);
}
// 在Surface上繪制的時候調(diào)用
@Override
public void onDrawFrame(GL10 gl) {
//設(shè)置渲染模式
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
// 清除屏幕
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
最后為了配合Activity的生命周期,我們加上如下代碼
@Override
protected void onPause() {
super.onPause();
if (glSurfaceView != null) {
glSurfaceView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (glSurfaceView != null) {
glSurfaceView.onResume();
}
}
我詳細的介紹以下三個方法.
onSurfaceCreated
它是在Surface創(chuàng)建的時候調(diào)用,可以在這里進行一些初始化操作澈吨,它攜帶兩個參數(shù)GL10 和 EGLConfig把敢。
- GL10 繼承自GL的一個接口,封裝了程序語言為OpenGL綁定的核心功能,我們可以把它理解為一個“畫筆”,操作它提供的的方法來在GLSurfaceView上這塊“畫布”繪制
- EGLConfig 是一個抽象類谅辣,但是沒有任何實現(xiàn),不管它
我在這里調(diào)用gl.glClearColor(0f, 1f, 0f, 0f)
設(shè)置清屏顏色為綠色,所謂清屏顏色就是當開始繪制時修赞,屏幕所顯示的顏色。glClearColor(float red, float green, float blue, float alpha)四個參數(shù)對應(yīng)紅桑阶、綠柏副、藍、透明度蚣录。這里的取值范圍是0到1f割择。不是RGB中0~255
。
onSurfaceChanged
它是在Surface大小改變的時候調(diào)用,這個方法只會執(zhí)行一次,Surface創(chuàng)建時初始大小為0萎河,所以需要指定窗口大小,調(diào)用glViewport(int x, int y, int width, int height)方法傳入四個參數(shù),x,y坐標和寬高
荔泳。
這里要注意一點,這個窗口坐標原點是位于屏幕左下角,與android中的屏幕坐標系不一樣
Android中的屏幕坐標系如圖所示
OpenGl中的窗口坐標系
onDrawFrame
它是在Surface上繪制的時候調(diào)用。
1.通過setRenderMode
設(shè)置渲染模式,有兩種供選擇
GLSurfaceView.RENDERMODE_CONTINUOUSLY 不間斷的繪制,默認渲染模式是這種
GLSurfaceView.RENDERMODE_WHEN_DIRTY 在屏幕變臟時繪制,也就是當調(diào)用GLSurfaceView的requestRender ()方法后才會執(zhí)行一次(第一次運行的時候會自動繪制一次)
2.調(diào)用glClear(GL10.GL_COLOR_BUFFER_BIT)
方法清除屏幕顏色,執(zhí)行這個方法之后,屏幕就會渲染之前通過glClearColor設(shè)置的清屏顏色.如下圖所示
如果設(shè)置渲染模式為GLSurfaceView.RENDERMODE_CONTINUOUSLY那么onDrawFrame方法會一直執(zhí)行,看打印
如果想看得更直觀一點,那么打開手機開發(fā)者選項虐杯,打開顯示Surface更新,你會看到屏幕一直在閃