- OpenGL(全寫Open Graphics Library)是指定義了一個(gè)跨編程語言、跨平臺(tái)的編程接口規(guī)格的專業(yè)的圖形程序接口。它用于三維圖像(二維的亦可)形庭,是一個(gè)功能強(qiáng)大延旧,調(diào)用方便的底層圖形庫。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集葵礼,所以更加輕便号阿,在OpenGL ES的世界里,沒有四邊形鸳粉、多邊形扔涧,無論多復(fù)雜的圖形都是由點(diǎn)、線和三角形組成的届谈。
OpenGL ES 2.0中基本概念
- 著色器(Shader):是在GPU上運(yùn)行的小程序枯夜,使用OpenGL ES SL語言來編寫,它是一個(gè)描述頂點(diǎn)或像素特性的簡(jiǎn)單程序艰山。
- 頂點(diǎn)著色器:對(duì)于發(fā)送給GPU的每一個(gè)頂點(diǎn)湖雹,都要執(zhí)行一次頂點(diǎn)著色器。其功能是把每個(gè)頂點(diǎn)在虛擬空間中的三維坐標(biāo)變換為可以在屏幕上顯示的二維坐標(biāo)曙搬,并帶有用于z-buffer的深度信息摔吏。頂點(diǎn)著色器可以操作的屬性有:位置鸽嫂、顏色、紋理坐標(biāo)征讲,但是不能創(chuàng)建新的頂點(diǎn)据某。
- 片元著色器:為組成點(diǎn)線三角形的每個(gè)片段生成最終的顏色,針對(duì)每個(gè)片段诗箍,它都會(huì)執(zhí)行一次哗脖;一個(gè)片段是一個(gè)小的,單一顏色的長方形區(qū)域扳还,類似于屏幕像素
OpenGL ES中有兩種投影方式:正交投影和透視投影才避。正交投影,物體不會(huì)隨距離觀測(cè)點(diǎn)的位置而大小發(fā)生變化氨距。而透視投影桑逝,距離觀測(cè)點(diǎn)越遠(yuǎn),物體越小俏让,距離觀測(cè)點(diǎn)越近楞遏,物體越大。
OpenGL ES 2.0過程及理解
讀取頂點(diǎn)數(shù)據(jù)——執(zhí)行頂點(diǎn)著色器——組裝圖元——光柵化圖元——執(zhí)行片元著色器——寫入幀緩沖區(qū)——顯示到屏幕上
- OpenGL作為本地庫直接運(yùn)行在硬件上首昔,沒有虛擬機(jī)寡喝,也沒有垃圾回收或者內(nèi)存壓縮。在Java層定義圖像的數(shù)據(jù)需要能被OpenGL存取勒奇,因此预鬓,需要把內(nèi)存從Java堆復(fù)制到本地堆。
- 頂點(diǎn)著色器是針對(duì)每個(gè)頂點(diǎn)都會(huì)執(zhí)行的程序赊颠,是確定每個(gè)頂點(diǎn)的位置格二。同理,片元著色器是針對(duì)每個(gè)片元都會(huì)執(zhí)行的程序竣蹦,確定每個(gè)片元的顏色顶猜。
- 著色器需要進(jìn)行編譯,然后鏈接到OpenGL程序中痘括。一個(gè)OpenGL的程序就是把一個(gè)頂點(diǎn)著色器和一個(gè)片段著色器鏈接在一起變成單個(gè)對(duì)象长窄。
使用步驟概括
- 在AndroidManifest.xml文件中設(shè)置使用的OpenGL ES的版本:
<!-- 3.0的版本為0x00030000,3.1的版本為0x00030001。--> <!-- Tell the system this app requires OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" />
// 動(dòng)態(tài)代碼 ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); if (configurationInfo.reqGlEsVersion >= 0x2000) { glSurfaceView.setEGLContextClientVersion(2); }
- 用GLSurfaceView作為顯示三角形的View纲菌,圖形的具體渲染工作都是在Render
中完成的挠日。- 實(shí)現(xiàn)GLSurfaceView的Render,在Render中完成三角形的繪制驰后,具體行為有
- 加載頂點(diǎn)和片元著色器
- 確定需要繪制圖形的坐標(biāo)和顏色數(shù)據(jù)
- 創(chuàng)建program對(duì)象肆资,連接頂點(diǎn)和片元著色器,鏈接program對(duì)象灶芝。
- 設(shè)置視圖窗口(viewport)郑原。
- 將坐標(biāo)數(shù)據(jù)顏色數(shù)據(jù)傳入OpenGL ES程序中
- 使顏色緩沖區(qū)的內(nèi)容顯示到屏幕上唉韭。
一般繪制圖形流程
1. 創(chuàng)建頂點(diǎn)著色器和片元著色器
2. 創(chuàng)建程序
3. 添加頂點(diǎn)著色器和片元著色器到程序
4. 連接程序
5. 使用程序
6. 獲取頂點(diǎn)著色器句柄
7. 啟用句柄
8. 設(shè)置頂點(diǎn)著色器句柄數(shù)據(jù)
9. 獲取片元著色器句柄
10. 設(shè)置片元著色器句柄數(shù)據(jù)
11. 繪制
12. 禁用頂點(diǎn)著色器句柄