第二章說了如何創(chuàng)建一個(gè)三角形另假,也使用了android進(jìn)行了繪制莺奔,我們在案例中使用了一個(gè)頂點(diǎn)著色器(這個(gè)好像有的地方叫片元)和一個(gè)片段著色器以及一個(gè)程序?qū)ο箜锬粒@里就對如何創(chuàng)建著色器通危、編譯他們以及連接到一個(gè)程序上熄守。
著色器和程序
創(chuàng)建著色器蜈垮,加載著色器耗跛,編譯著色器裕照,創(chuàng)建程序,附著在程序上调塌,連接之后使用晋南,從程序中得到句柄,通過句柄進(jìn)行傳值羔砾。
一個(gè)程序需要兩個(gè)著色器负间,一個(gè)片元一個(gè)片段,然后編譯成為可執(zhí)行文件進(jìn)行渲染姜凄,也就是一個(gè)程序可以附著多個(gè)著色器對象政溃。
創(chuàng)建著色器和編譯著色器
創(chuàng)建著色器
GLint glCreateShader(GLenum type);
根據(jù)傳入的類型,返回一個(gè)頂點(diǎn)和一個(gè)片段著色器的句柄态秧,完成之后董虱,可以使用glDeleteshader刪除。
void glDeleteshader(GLint shader)
如果執(zhí)行了刪除申鱼,但是它正好附著在程序上愤诱,就不會(huì)立即的刪除,只會(huì)標(biāo)記為刪除捐友,一旦不在附著就會(huì)立即刪除
創(chuàng)建著色器就需要附著著色器代碼淫半。
void glshaderSource(shader,size,string,length)
一旦加載了程序,就可以進(jìn)行編譯操作匣砖,但是并不是所有的都提供了編譯著色器的能力科吭。
void glCompileShader(shader)
編譯之后,查詢是否成功猴鲫,可以使用
glGetShaderiv(shader,name,param)
查詢一些其他信息
- GL_COMPILE_STATUS 編譯狀態(tài)
- GL_DELETE_STATUS 查詢刪除狀態(tài)
- GL_INFO_LOG_LENGTH :日志長度
- GL_SHADER_SOURCE_LENGTH
- GL_SHADER_TYPE
創(chuàng)建和連接程序
創(chuàng)建程序砌溺,程序作為一個(gè)容器對象,可以將著色器附著在該對象上最終連接到可執(zhí)行文件上变隔。
//創(chuàng)建程序
GLunit glCreateProgame()
它返回一個(gè)句柄规伐,可以使用glDeleteProgram(progame)刪除程序。
下來就是將著色器附加到它的上面匣缘,使用
void glAttachShader(progame,shader);
需要注意的是它是將一個(gè)著色器對象添加在它的上面猖闪,所以有沒有數(shù)據(jù)鲜棠,有沒有編譯成功與否都是無所謂的。
分離glDetachShader(program,shader)
下一步就是進(jìn)行連接程序培慌。
glLinkProgram(program)
uniform和屬性
一旦鏈接結(jié)束之后豁陆,需要進(jìn)行一些查詢,得到句柄吵护,uniform可以在一個(gè)程序之間共享盒音。
獲取和設(shè)置uniform
- 查詢活動(dòng)的:可以得到程序中活動(dòng)的數(shù)量,一般的馅而,使用之后的是活躍的祥诽,沒有使用不能稱之為活躍的
- 查詢unoiform的相關(guān)信息:
glGetActiveUniform(program,index,bufSize,length,size,typr,name)
使用glGetActiveUniform,您可以確定制服的幾乎所有屬性瓮恭。
- 統(tǒng)一變量的名稱及其類型雄坪。
- 您可以找出變量是否是數(shù)組,如果是屯蹦,數(shù)組中使用的最大元素是什么维哈。
- 找到制服的位置需要制服的名稱,類型和大小也需要弄清楚如何加載數(shù)據(jù)。一旦我們有了制服的名字登澜,我們就可以使用glGetUniformLocation找到它的位置阔挠。
制服位置是一個(gè)整數(shù)值,用于標(biāo)識制服在程序中的位置脑蠕。該位置值被隨后的調(diào)用用于加載帶有值的制服(例如购撼,glUniform1f)。
查詢uniform的位置
glGetUniformLocation
查詢uniform空郊,如果不是活動(dòng)份招,就返回-1,上面提到了可以查詢數(shù)組的大小狞甚,類型锁摔,這個(gè)函數(shù)有查詢到了位置,那么就可以根據(jù)不同的類型給uniform設(shè)置值了哼审。
一般的自己寫的shader就不需要查詢谐腰,自己寫,也可以知道類型和名稱涩盾,直接調(diào)用getUniformLocation就可以得到位置了
查詢屬性和設(shè)置屬性
同樣的可以查詢活躍的屬性十气,,您可以使用glGetActiveAttrib找到屬性的屬性春霍。然后有一組設(shè)置頂點(diǎn)數(shù)組的例程來加載頂點(diǎn)屬性值砸西。
得到屬性的位置,然后設(shè)置屬性值,后面會(huì)有專門的一章芹枷。
二進(jìn)制文件
之前說不是每個(gè)設(shè)備都存在一個(gè)編譯器的衅疙,目前使用并沒有見到過,等之后回來補(bǔ)充鸳慈。