天天看點

【Qt for Android】OpenGL ES 繪制彩色立方體

Qt 内置對OpenGL ES的支援。選用Qt進行OpenGL ES的開發是很友善的,很多輔助類都已經具備。從Qt 5.0開始添加了一個QWindow類,該類既能夠使用OpenGL繪制3D圖形,也能夠使用QPainter繪制2D傳統的GDI+圖形。5.0曾經的QGLWidget不推薦再使用。在即将到來(官方時間是今年秋天)Qt 5.4會全然廢棄QGLWidget。作為替代将會新增QOpenGLWidget和QOpenGLWindow類來友善OpenGL的程式設計。

好了廢話不多說了。今天我會使用OpenGL ES繪制一個彩色立方體,先在桌面平台編譯執行成功後,再針對Android平台編譯一次就可以。以下是在Android上的執行效果。基于同一個着色器繪制了四個同樣的彩色立方體。

【Qt for Android】OpenGL ES 繪制彩色立方體
【Qt for Android】OpenGL ES 繪制彩色立方體

為了使用OpenGL,我從QWindow類和QOpenGLFunctions類派生出了一個OpenGLWindow類。該類聲明例如以下:

因為繼承自QWindow是以能夠使用QWindow提供的OpenGL環境,不須要EGL來控制本地窗體顯示圖形。同一時候因為繼承自QOpenGLFunctions,是以在OpenGLWindow類的成員函數中能夠直接使用 gl* 風格的原生的OpenGL API。

在Qt中提供了非常多封裝好的OpenGL便捷類,如QOpenGLShaderProgram能夠非常友善的對着色器程式進行操作,但這樣做可能對不熟悉Qt的人不友好,是以這裡我不用Qt提供的便捷類,而直接使用原生的C風格的 OpenGL API進行操作。這全然是能夠的(這也是我喜歡Qt的原因之中的一個:提供自身類庫的同一時候,同意你使用非Qt的類,并提供二者之間的轉換。如Qt中的容器類QVector、QMap、QString能夠和C++标準庫中的對應容器互相轉換)。

甚至你能夠混合使用Qt的OpenGL類和原生的OpenGL API。

以下看看幾個關鍵的函數。

首先是initialize()負責着色器的建立、編譯、連結等操作。并設定背景色。

代碼例如以下。當中被凝視的部分是使用Qt自帶類庫實作同樣的功能。

再來看看QWindow的QExposeEvent事件,當QWindow須要重繪時會調用該事件的處理函數exposeEvent()。這裡我對該事件的處理函數進行了重寫。isExposed()用來推斷目前窗體是否顯示在螢幕上(onScreen or offScreen)。僅僅有顯示在螢幕上時才重繪(盡管窗體須要重繪,可是因為沒有顯示在螢幕上。重繪了也沒人看得見,是以加這個推斷能夠降低不必要的畫圖操作)。

首先建立OpenGL上下文,然後進行調用對應的初始化函數,這兩步僅僅在第一次被運作,以後不會再運作。接下來是該函數的核心部分,調用render()函數在後端緩沖區進行圖形渲染,然後交換前端和後端緩沖區,讓後端緩沖區圖形顯示到界面上。

最後看看render()渲染函數,這個也是學習OpenGL的主要部分。

在render()函數的開始部分建立了一個QOpenGLPaintDevice執行個體,該示範樣例用于繪制QPainter的畫圖操作。這裡能夠忽略,删掉也能夠。

接下來就是定義立方體的頂點位置,以及頂點索引。建立2個頂點緩沖區對象(vertex buffer object),通過glBufferData()函數将立方體的頂點位置和頂點是以放到頂點緩沖區對象中,将頂點位置通過glVertexAttribPointer()傳遞給頂點着色器。計算model/view/projection。然後将結果通過glUniformMatrix4fv()傳遞給頂點着色器中的mvp。最後使用glDrawElement()繪制立方體。

立方體每一個點的顔色由其所在的位置決定,是以不同位置的頂點具有不同顔色。

好了大緻就這樣了~

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5093679.html,如需轉載請自行聯系原作者

繼續閱讀