王玉峰
摘要
案例驅(qū)動(dòng)的OpenGLES教學(xué)改革,突出了GLSL的核心地位,也和游戲引擎、Android、圖形處理等技術(shù)做了一定的融合,還借鑒了優(yōu)秀的英文網(wǎng)絡(luò)教程并制作了在線案例,努力使課程豐富、生動(dòng)起來。
【關(guān)鍵詞】OpenGL ES 案例驅(qū)動(dòng)
OpenGL作為圖形硬件的軟件接口,被廣泛應(yīng)用于計(jì)算機(jī)圖形學(xué)理論研究、視頻游戲開發(fā)、并行計(jì)算、計(jì)算機(jī)仿真、三維可視化等領(lǐng)域。隨著OpenGL接口的進(jìn)化,其日益強(qiáng)大、復(fù)雜,有必要將其作為一門單獨(dú)的課程來教授。在教學(xué)實(shí)踐中,限于課時(shí)數(shù)和學(xué)生基礎(chǔ),我們把OpenGL ES(OpenGL的嵌入式設(shè)備版本)作為主線來講解,而且嘗試將基礎(chǔ)知識的講解與其它課程、技術(shù)結(jié)合起來,增強(qiáng)課程的吸引力和授課效果。
1 OpenGL ES及其授課面臨的挑戰(zhàn)
Android、IOS兩個(gè)手機(jī)操作系統(tǒng)均對OpenGL ES提供了良好的發(fā)展。隨著智能手機(jī)的普及,OpenGL ES的應(yīng)用范圍得以大范圍擴(kuò)展,其也得以蓬勃發(fā)展。
用戶界面、視頻游戲等都依賴于OpenGL去驅(qū)動(dòng)顯示硬件來加速渲染,探究其后的原理、機(jī)制和技術(shù),對于深入把握計(jì)算機(jī)圖形學(xué)理論、理解游戲引擎、優(yōu)化程序設(shè)計(jì)等都具有重要的現(xiàn)實(shí)意義。
OpenGL ES即使是作為OpenGL的裁剪版本,仍然是龐大的,把握其中的關(guān)鍵點(diǎn)尤為重要。渲染流水線、狀態(tài)機(jī)兩個(gè)機(jī)制,學(xué)生難以轉(zhuǎn)換思維方式,需要花費(fèi)較長的時(shí)間去理解。矩陣變換、光照計(jì)算涉及到數(shù)學(xué)運(yùn)算和基本理論,學(xué)生學(xué)習(xí)起來相對枯燥吃力。
2 案例驅(qū)動(dòng)OpenGL授課的相關(guān)實(shí)踐
案例設(shè)計(jì)突出了以下幾個(gè)要點(diǎn):
2.1 實(shí)現(xiàn)固定渲染流水線功能,把4屋可編程流水線精髓
早期的OpenGL是固定渲染渲染流水線,從OpenGL 2.0(OpenGL ES也是從2.0)開始支持可編程渲染流水線,也即可以使用GLSL(OpenGL著色語言)來為圖形硬件編寫可在其上執(zhí)行的程序(shader),大大增強(qiáng)了圖形硬件的功能和靈活性。
固定渲染流水線時(shí)期的部分API(應(yīng)用程序接口)已經(jīng)不推薦使用,這意味著我們需要自己編寫shader來實(shí)現(xiàn)固定流水線階段提供的矩陣變換、光照計(jì)算等功能,這些功能在固定渲染流水線中是通過改變OpenGL內(nèi)部狀態(tài)就可以實(shí)現(xiàn)的。很多同學(xué)認(rèn)為這非常不方便,但是系統(tǒng)化地去編程實(shí)現(xiàn)這些功能對于把握背后的圖形學(xué)理論非常關(guān)鍵。
2.2 借鑒Cocos2d-x的著色器設(shè)計(jì),講解shader的基本運(yùn)用
應(yīng)用非常廣泛的2D游戲引擎Cocos2d-x采用了OpenGL/OpenGLES作為底層渲染技術(shù),它預(yù)定義了二十多組shader,用于濱染其中的精靈、UI組件、粒子、天空盒、地形等可視元素,這些shader并不復(fù)雜,容易理解,具有很好的借鑒價(jià)值,對于消除shader“神秘感”,開闊視野均有一定的價(jià)值。在教學(xué)實(shí)踐中,我們選擇了其中的一些shader.來進(jìn)行分析,借以講述頂點(diǎn)數(shù)據(jù)類型、頂點(diǎn)數(shù)據(jù)傳輸、shader間數(shù)據(jù)傳遞、片元顏色生成等。
2.3模仿Android動(dòng)畫相關(guān)類,實(shí)現(xiàn)基本的動(dòng)態(tài)渲染
Android本身依賴OpenGL ES來進(jìn)行硬件加速渲染,AndroidSDK(軟件開發(fā)套件)也提供了對OpenGL ES的支持。除此之外,Android的基本動(dòng)畫機(jī)制容易理解,也很容易使用OpenGL ES來模仿實(shí)現(xiàn)。
Android動(dòng)畫中,巾貞動(dòng)畫對應(yīng)的Java類是AnimationDrawable。在基本紋理濱染的基礎(chǔ)上,增加隨時(shí)間切換紋理的機(jī)制,就可以實(shí)現(xiàn)基本的幀動(dòng)畫。
Android的補(bǔ)間動(dòng)畫相關(guān)的Java類分別是AlphaAnimation、TranslateAnimation、ScaleAnimation、RotateAnimation。在基本紋理渲染的基礎(chǔ)上,增加隨時(shí)間改變目標(biāo)片元顏色的alpha值的機(jī)制,就可以實(shí)現(xiàn)淡入淡出效果。同樣,隨時(shí)間改變頂點(diǎn)著色器中的模型變換矩陣,就可以實(shí)現(xiàn)位移、縮放、旋轉(zhuǎn)的補(bǔ)間動(dòng)畫。
2.4 嘗試進(jìn)行基本的圖像處理,深入了解片元著色器的功能
運(yùn)用圖形硬件進(jìn)行基本的圖像處理包括:顏色通道提取、圖像彩色變成黑白、圖像縮小及放大、圖像倒置或水平鏡像、圖像裁剪、圖像混合、圖像遮罩顯示、圖像過渡漸變、圖像增加噪聲、去除背景綠幕等,還包括簡單的利用卷積進(jìn)行處理,如平滑過濾、邊緣檢測、銳化處理、浮雕效果等。
進(jìn)行基本的圖像處理大大激發(fā)了學(xué)生的學(xué)習(xí)興趣,也加深了對片元處理器的理解,提高了shader的編寫技能。
2.5 引入優(yōu)秀網(wǎng)絡(luò)教程相關(guān)案例,豐富實(shí)驗(yàn)內(nèi)容和課余練習(xí)素材
OpenGL的經(jīng)典書籍,比如《OpenGL超級寶典》、《OpenGL編程指南》等,涵蓋面較廣,篇幅較長,適合作為參考書籍。作為補(bǔ)充,有不少成體系的英文OpenGL網(wǎng)絡(luò)教程,部分被一些熱心的OpenGL愛好者翻譯成中文。這些英文教程的案例具有很好的參考價(jià)值,大大豐富了課程實(shí)驗(yàn)內(nèi)容。
網(wǎng)絡(luò)教程中,比較突出的有l(wèi)eamopengl.com網(wǎng)站的《Leam OpenGL》、www.opengl-tutorial.org網(wǎng)站的《OpenGL Tutorial》、ogldev.atspacexo.uk網(wǎng)站的《Model Opengl Tutorials》、www.tomdalling.com網(wǎng)站的《Modem Opengl Serials》等,其中前兩個(gè)都有中文譯文。在課程實(shí)踐中,要求學(xué)生把這些教程作為輔助讀物。
3 課程改革實(shí)踐的效果及改進(jìn)方向
相比于計(jì)算機(jī)圖形學(xué)課程,本課程側(cè)重于程序設(shè)計(jì),需要重點(diǎn)把握OpenGL的API使用和GLSL運(yùn)用。以案例驅(qū)動(dòng)為導(dǎo)向的課程實(shí)踐,突出了程序設(shè)計(jì)的核心地位,也使得基礎(chǔ)理論有了生動(dòng)的外在“表象”,便于加深理解,使得理論和實(shí)踐相輔相成。和C0C0s2d-x、Android、圖像處理等技術(shù)進(jìn)行一定程度的結(jié)合,使得課程更接“地氣”,增加了課程的“親和力”。過去幾年的實(shí)踐表明,學(xué)生普遍表示課程內(nèi)容豐富、有趣。
參考文獻(xiàn)
[1]王銳譯.[美]DaveShreiner,Graham Sellers,John Kessenich,Bill Licea-Kane.OpenGL編程指南[M].北京:機(jī)械工業(yè)出版社,2015.
[2]姚軍譯.[美]Dan Ginsburg,Budirijanto Purnomo.OpenGL ES3.0編程指南[M].北京:機(jī)械工業(yè)出版社,2015.