shader的使用流程:
1. 編寫(xiě)vertex Shader和fragment shader源碼。
2. 創(chuàng)建兩個(gè)shader 實(shí)例:GLuint glCreateShader(GLenum type); [gl.createShader]
3. 給Shader實(shí)例指定源碼。 glShaderSource [gl.shaderSource]
4. 編譯shaer源碼 void glCompileShader(GLuint shader) [gl.compileShader]
5. 創(chuàng)建shader program -- GLuint glCreateProgram(void) [gl.createProgram]
6. 綁定shader到program 。 void glAttachShader(GLuint program, GLuint shader)。每個(gè)program必須綁定一個(gè)vertex shader 和一個(gè)fragment shader。 [gl.attachShader]
7. 鏈接program 。 void glLinkProgram(GLuint program) [gl.linkProgram]
8. 使用porgram 。 void glUseProgram(GLuint program) [gl.useProgram]
attribute變量
attribute是頂點(diǎn)屬性,每個(gè)頂點(diǎn)都會(huì)有,但只存在于vertex Shader中,由應(yīng)用程序傳入其值。
因?yàn)樵阪溄觩rogram之前,attribute變量是還沒(méi)有分配內(nèi)存的,為了給shader中的attribute變量傳值,首先需要將其綁定到program上,并指定他的位置attr_pos,鏈接program之后,可以通過(guò)這個(gè)位置attr_pos來(lái)給這個(gè)變量傳值。加入shader中有一個(gè)
這樣就將attr_name(字符串)綁定到了attr_pos(無(wú)符號(hào)值)位置。
這樣就把vert_data傳遞給了attribute變量attr_name。
因?yàn)槊總€(gè)頂點(diǎn)屬性的數(shù)據(jù)都依托在一個(gè)VBO中了,因此要想給一個(gè)attrbute變量傳遞數(shù)據(jù),需要先把把數(shù)據(jù)交給一個(gè)VBO對(duì)象。
如果我們?cè)冁溄觩rogram之前并沒(méi)有指定他的位置,我們還可以去查找這個(gè)變量。
uniform變量
uniform變量在shader中時(shí)只讀,隨不同圖元變化的全局變量,其值也由應(yīng)用程序傳入。
這樣就可以給unif_pos設(shè)置1個(gè)浮點(diǎn)數(shù)的值,除glUniform1f之外,還可以使用如下方法:
可以看到,根據(jù)參數(shù)個(gè)數(shù)和類型不同,需要使用不同的方法設(shè)置。
varying變量
shader之間傳遞值用的變量類型了。在編寫(xiě)vertex shader 中寫(xiě)入,在fragment shader中只讀出
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7085瀏覽量
89220 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28413
原文標(biāo)題:shader中的數(shù)據(jù)是怎么傳遞的?
文章出處:【微信號(hào):Imgtec,微信公眾號(hào):Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論