OpenGL ES2 學習教程3——Shader對象和Program對象

上節中講到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類的代碼做爲例子學習。

相關文章
相關標籤/搜索