一、一些概念:
GLTools: 一些有用且可復用的函數
GLEW: OpenGL API的一些擴展機制
GLUT: OpenGL Utility toolkit, OpenGL跨平台相關,隱藏平台相關細節
RC代表渲染環境(Rendering Context),是運行中的OpenGL狀態機句柄
固定渲染模式限制了開發者的自由,目前一般都是采用核心模式(Core-profile)。
跨距Stride
可以用2個數組分別描述位置和顏色信息,這樣必須保證兩個數組中頂點的位置和顏色是否一一對應。
除了這種方式,還可以選擇一個數組存儲兩種信息的方式:“頂點1位置+頂點1顏色+頂點2位置+頂點2顏色+”,這樣就引出了跨距的概念,即一個頂點和顏色占用的空間個數之和。
OpenGL的操作方式
由跨距可以看出,OpenGL操作時,一般都是將所需的數據准備好,然后調用glDrawElements函數一次繪制完成,而不是通過某個函數一個頂點一個頂點的去渲染,這是OpenGL渲染的一個特點。
二、開發重點
1. 頂點着色器
每個頂點執行一次,比如我們繪制一個線段,包含了2個頂點,那就是執行2次頂點着色器。我們傳遞給頂點着色器的數據不僅包含了每個頂點的位置,也包含顏色
2. 片段着色器
3. 將數據傳遞給着色器
頂點和片段着色器用於描述如何繪制圖形圖像的環節;
GLSL:OpenGL編寫着色器具體實現的編程語言;
三、歸一化坐標
頂點的歸一化坐標是[-1,1];
紋理的歸一化坐標是[0,1],兩位維度分別是S、T,一般稱為ST紋理坐標或UV坐標;如果設置的紋理坐標小於1,意思是將紋理的一小部分貼到頂點坐標中去;大於1,紋理邊界將會拉伸。
紋理坐標方向性在Android上與我們平時熟悉的Bitmap、Canvas等一致,都是頂點在左上角。
四、紋理
1. 紋理:在OpenGL中簡單理解就是一張圖片
2. 紋理ID:紋理的直接引用
3. 紋理單元:紋理的操作容器,有GL_TEXTURE0、GL_TEXTURE1、GL_TEXTURE2等,紋理單元的數量是有限的,最多16個。所以最多只能同時操作16個紋理。在切換使用紋理單元的使用,使用glActiveTexture方法。
4. 紋理目標:一個紋理單元中包含了多個類型的紋理目標,有GL_TEXTURE_1D,GL_TEXTURE_2D等;
5. 紋理ID與紋理單元的關系
OpenGL要操作一個紋理,那么是將紋理ID裝進紋理單元這個容器里,然后再通過操作紋理單元的方式去實現。
OpenGL的大部分紋理一般都只接受RGBA類型的數據,如果不是RGBA,比如YUV420P格式,可以在顯卡中進行轉換。
五、glDrawArrays頂點法和glDrawElements索引法的繪制區別
1. glDrawArrays只能是依次輸入所繪制的每個三角形的每個數據,而glDrawElements需要輸入每個定點(無需重復),外加一個繪制時的索引數組。
glDrawArrays傳輸或指定的數據是最終的真實數據,在繪制時效能更好;
glDrawElements指定的是真實數據的調用索引,在內存/顯存占用上更節省;
glDrawArrays的數據空間損耗在頂點定義處;glDrawElements的數據空間損耗在頂點索引的定義處;
2. 適用情況
如果頂點復用情況較少,可以采用glDrawArrays;如果頂點復用情況多,畫的圖形較多,而且大不相同的時候,優先采用glDrawElements。
頂點法內存計算方式:頂點數 * 頂點屬性數 * 頂點數據格式類型;
索引法內存計算方式:頂點數 * 頂點屬性數 * 頂點數據格式類型 + 索引數 * 索引數據格式類型
3. 輸入坐標時一定要輸入完整,比如帶.0f。
4. draw mode
比較關鍵的一個參數,2D繪制一般采用GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN。
GL_TRIANGLE_STRIP:相鄰3個點構成一個三角形,不包括首位兩個點,例如ABC、BCD、CDE、DEF
GL_TRIANGLE_FAN:第一個點和之后所有相鄰的2個點構成一個三角形,例如ABC、ACD、ADE、AEF
六、紋理
1. 環繞方式
GL_CLAMP_TO_EDGE:紋理坐標會被約束在0到1之間,超出的部分會重復紋理坐標的邊緣,產生一種邊緣被拉伸的效果
GL_REPEAT:對紋理的默認行為。重復紋理圖像。
2. 紋理過濾
GL_NEAREST鄰近過濾,是OpenGL默認的紋理過濾方式。當設置為GL_NEAREST的時候,OpenGL會選擇中心點最接近紋理坐標的那個像素。
GL_LINEAR線性過濾,它會基於紋理坐標附近的紋理像素,計算出一個插值,近似出這些紋理像素之間的顏色。