天天看點

OpenGlES:如何加載着色器代碼

加載着色器程式:

參考連結:

https://juejin.cn/post/7134356782452834334

對應于代碼實作:

ps:一個是着色器對象,表示一段具體的着色器代碼的抽象,另一個是着色器程式,表示整個圖形渲染管線的着色器程式集合

initShader(vertexSimpleShape, GL_VERTEX_SHADER);

initShader(fragSimpleShape, GL_FRAGMENT_SHADER):建立着色器對象,加載着色器代碼到對應的着色器對線上面,編譯着色器對象

glCreateProgram();:建立程式Program對象

glAttachShader(program, vsh);:綁定着色器對象到Program程式對象上(attach)

glLinkProgram(program);:連結着色器到程式上

glGetProgramiv(program, GL_LINK_STATUS, &status);:列印連結異常資訊

glUseProgram(program);:使用程式Program(這步就意味着渲染流程管線被激活,可以使用具體的着色器代碼進行編輯了)

具體流程

建立着色器加載着色器代碼編譯着色器對象

initShader方法中接受兩個參數,一個是source代表着色器代碼,一個是type代表建立的着色器類型是什麼

其包含glCreateShader,glShaderSource,glShaderSource,glGetShaderiv四個方法

glCreateShader:建立着色器對象,type表示着色器類型,比如頂點着色器為GL_VERTEX_SHADER,片段着色器為GL_FRAGMENT_SHADER。傳回值為一個類似引用的數字。

ps:拿到這個引用整數,就猶如将綁着該着色器對象的繩子牢牢抓住,以後隻要操控着色器對象,就靠這根繩子。

glShaderSource:着色器對象加載着色器對象代碼source,可指定多個source着色器代碼

ps:此時的着色器對象還是空的,隻是一個殼,是以我們需要通過glShaderSource方法将着色器代碼注入進去。

glCompileShader:編譯着色器對象

ps:代碼注入進去了,就要類似C程式一樣需要一個編譯過程,用的是glCompileShader方法。

glGetShaderiv:列印出編譯異常資訊

ps:當然有編譯就有可能有編譯錯誤,由于着色器程式是在GPU中編譯運作的,是以目前并不像我們平時寫在CPU運作的程式那樣有詳細的編譯錯誤資訊以及可以斷點調試這些高端操作,但是至少還是可以通過glGetShaderiv方法看到一些報錯資訊的。

建立程式Program對象

通過glCreateProgram方法建立一個着色器程式對象。

glAttachShader(program, vsh)

此時着色器程式對象還是空空如也,是以需要glAttachShader方法,将前面建立的着色器對象關聯給它,它才是一個有實質内容的着色器程式對象。

glLinkProgram(program)

glGetProgramiv(program, GL_LINK_STATUS, &status)

glUseProgram(program)