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