1.加載着色器
1.1 從資源中加載文本
創建名爲TextResourceReader的新類,如圖所示:
1.2 讀入着色器代碼
加入調用真正地讀取着色器的代碼。切換到AirHockeyRenderer.java文件,並在onSurfaceCreated()中的glClearColor()調用後面加入如下代碼:
在類的頂部加入如下代碼:
改變構造函數的起始行:
打開AirHockeyActivity.java,把android上下文的引用傳遞進去;按如下方法改變glSurfaceView.setRenderer()的調用:
1.3 記錄發生 的一切
添加如下LoggerConfig的新類:
無論何時想要記錄一些事情時,就要檢查這個常量時true還是false。打開或者關閉這些記錄,需要我們自己修改這個常量。
2.編譯着色器
創建一個名爲ShaderHelper的 新類,並添加如下代碼:
2.1 創建一個新的着色器對象
創建一個新的着色器對象,並檢查是否創建成功
在compileShader()中加入如下代碼:
用glCreateShader()調用創建一個對象,這個調用會返回這個對象的ID賦值給shaderObjectId
記住我們是如何創建對象並檢查它是否有效的;這個模式是在OpenGL裏廣泛使用:
- 首先使用一個如glCreateShader() 一樣調用創建一個對象,這個調用會返回一個整型值(integer)。
- 這個整型值就是OpenGL對象的引用。無論後面什麼時候想要引用這個對象,就要把這個徵信值傳回OpenGL。
- 返回值0表示這個對象創建失敗。
2.2 上傳和編譯着色器源代碼
加入如下代碼吧着色器源碼上傳到着色器對象裏,然後再編譯她:
2.3 取出編譯狀態
繼續加入如下代碼:
2.4 取出着色器信息日誌
繼續加入如下代碼:
2.5 驗證編譯狀態並返回着色器對象ID
繼續加入如下代碼:
最後添加:
2.6 在Renderer類中編譯着色器
切換到AirHockeyRenderer.java,並在onSurfaceCreated()結尾處加入如下代碼:
3.把着色器一起鏈接進OpenGL程序
既然我們已經 加載並編譯了一個頂點着色器和一個片段着色器,下一步就是把它們棒定在一起放入一個單個的程序(program)裏。
3.1 理解OpenGL的程序
簡單來說,一個OpenGL程序就是把一個頂點着色器和一個片段着色器鏈接在一起變成單個對象。雖然頂點着色器和片段着色器總是要一起工作,但並不意味着它們必須是一對一匹配的,我們可以同時在多個程序中使用同一個着色器。
打開ShaderHelper,並在類的結尾加入如下代碼:
這個跟compileShader()構建的差不多一樣
3.2 懶得解釋了,看圖
3.3 給渲染類加入代碼
既然我們已經有代碼把這些着色器鏈接在一起了,我們繼續,從程序中調用它。在AirHockeyRenderer的頂部加入如下成員變量:
這個整型值用來存儲那個鏈接的程序的ID。在onSurfaceCreated()的結尾處加入如下代碼把着色器連接起來:
4.做最後的拼接
在ShaderHelper中加入如下代碼:
在AirHockeyRenderer的onSurfaceCreated()結尾處加入如下代碼
AirHockeyRenderer的頂部添加如下:
5.在屏幕上繪製
運行起來如下圖:
6.小結
- 如何創建和編譯着色器
- 頂點着色器和片段着色器總是一起工作的,也學到了如何把它們鏈接到一起形成一個OpenGL程序對象。
- 如何把一個頂點着色器內部的屬性變量與頂點屬性數組關聯起來