上節中講到GLES中着色器動態編譯的流程:數組
1.建立着色器
2.指定着色器源代碼字符串
3.編譯着色器
4.建立着色器可執行程序
5.向可執行程序中添加着色器
6.連接可執行程序函數
着色器渲染中須要使用Shader對象和Program對象兩個基本對象,首先每一個着色器源碼要被加載到一個Shader對象,而後被編譯。而後Shader對象被加載到Program對象並執行連接(link),連接後產生可執行的代碼。若是一個連接後的P對象唄使用(use),則其中的可執行代碼會分別用於頂點和片斷的處理。學習
GLuint glCreateShader(GLenum type) void glDeleteShader(GLuint shader)
type:建立着色器的類型 GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER 頂點着色器或片斷着色器,返回值是個新着色器的句柄,發生錯誤則返回0;ui
glDeleteShader 刪除再也不使用的着色器。shader要刪除的着色器句柄,若是着色器正鏈接着一個項目對象,glDeleteShader不會馬上刪除着色器,而是設置刪除標記,一旦着色器再也不鏈接項目對象才刪除着色器使用的內存。指針
void glShaderSource(GLuint shader, GLsizei count, const char** string,const GLint* length) void glCompileShader(GLuint shader)
建立空着色器後,使用 glShaderSource 提供着色器源碼,count指示string數組的個數,length指向整數矩陣的指針,指示每一個着色器字符串長度。若是長度爲NULL,表示沒有這個着色器,若是非空,是每一個相應的着色器字符串長度數。若是length小於0,也說明字符串爲空。code
調用 glCompileShader,編譯着色器對象。像其餘語言同樣,編譯後你想知道是否產生錯誤,可使用glGetShaderiv查詢。對象
void glGetShaderiv(GLuint shader, GLenum pname,GLint *params)
pname 須要查詢的信息GL_COMPILE_STATUS GL_DELETE_STATUS GL_INFO_LOG_LENGTH GL_SHADER_SOURCE_LENGTH GL_SHADER_TYPE;Params 返回查詢結果的整型指針。內存
GLuint glCreateProgram(void) void glDeleteProgram(GLuint program)
這個函數沒輸入參數,它返回新建項目的句柄。刪除一個項目使用 glDeleteProgram。字符串
void glAttachShader(GLuint program, GLuint shader) void glDetachShader(GLuint program, GLuint shader)
可使用glAttachShader鏈接一個頂點着色器和片斷着色器。program項目的句柄;shader着色器句柄。一個着色器對象能夠加到多個着色器程序對象,可是同類型的多個着色器對象不能同時加到一個程序對象上。glDetachShader解除附加。源碼
void glLinkProgram(GLuint program)
爲了使用着色器,着色器鏈接後,着色器程序對象必須被連接。使用glLinkProgram,連接後會改變一個GL_LINK_STATUS狀態的布爾值,可經過glGetProgramiv查詢。
void glGetProgramiv(GLuint program, GLenum pname, GLint *params) void glUseProgram(GLuint program)
連接成功後,使用glUseProgram激活着色器程序對象。激活成功後,就能夠開始渲染了。當使用到DrawArrays或DrawElements時GL渲染管線就會對每一個頂點和片斷執行咱們定義的着色器了。
能夠結合上節給出的Director類的代碼做爲例子學習。