OpenGL著色器基礎
著色器:著色器是提供給使用者定製自己特殊渲染需求的一套機制。常用介面如下:
1.GLuint glCreateShader(GLenum type)
:建立指定型別的著色器。建立成功時會返回一個當前著色器的唯一標誌。
.type指著色器型別。通常取GL_VERTEX_SHADER(頂點著色器),GL_FRAGMENT_SHADER(片段著色器),GL_GEOMETRY_SHADER(幾何著色器)等型別中的一種。
2.void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, const GLint* length)
.shader表示著色器唯一標誌。
.count表示著色器原始碼字串的個數。
.string表示著色器原始碼字串的內容陣列。
.length表示著色器原始碼字串的長度陣列,當為NULL時表示每個原始碼字串以NULL結尾。
3.void glCompileShader(GLuint shader)
:編譯著色器。
.shader表示著色器唯一標誌。
4.void glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
:檢測著色器操作狀態是否成功。
.shader表示著色器唯一標誌。
.pname表示操作狀態型別。可以是GL_COMPILE_STATUS(編譯狀態),GL_LINK_STATUS(連結狀態),GL_DELETE_STATUS(刪除狀態)等操作狀態中的一種。
.params就是檢測的結果。成功就會返回GL_TRUE,否則就會返回GL_FALSE。
5.void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog)
:獲取著色器錯誤訊息。
.shader表示著色器唯一標誌。
.bufSize表示錯誤訊息容器大小。
.infoLog表示錯誤訊息容器。
.length表示錯誤訊息長度大小。當為NULL時就不返回錯誤訊息長度。
6.void glDeleteShader(GLuint shader)
:刪除著色器。當著色器以及連結到一個或者多個啟用的著色器程式上時,此時著色器就被標記為“可刪除”狀態,直到著色器程式不再使用時,當前的著色器才會被自動刪除。
.shader表示著色器唯一標誌。
7.GLboolean gllsShader(GLuint shader)
:判定指定著色器是否存在。
.shader表示著色器唯一標誌。
著色器程式:著色器程式是多個著色器合併之後並最終連結完成的版本。已啟用著色器程式的著色器將在我們傳送渲染呼叫的時候被使用。常用介面如下:
1.GLuint glCreateProgram(void)
:建立著色器程式。建立成功時會返回一個當前著色器程式的唯一標誌。
2.void glAttachShader(GLuint program, GLuint shader)
:將著色器附加到著色器程式上。
.program表示著色器程式唯一標誌。
.shader表示著色器唯一標誌。
3.void glDetachShader(GLuint program, GLuint shader)
:從著色器程式中移除指定的著色器。
.program表示著色器程式唯一標誌。
.shader表示著色器唯一標誌。
4.void glLinkProgram(GLuint program)
:連結著色器程式中的著色器。此時每個著色器的輸出會連結到下個著色器的輸入。當輸出和輸入不匹配的時候,你會得到一個連線錯誤。
.program表示著色器程式唯一標誌。
5.void glGetProgramiv(GLuint program, GLenum pname, GLint* params)
:檢測著色器程式操作狀態是否成功。
.program表示著色器程式唯一標誌。
.pname表示操作狀態型別。可以是GL_COMPILE_STATUS(編譯狀態),GL_LINK_STATUS(連結狀態),GL_DELETE_STATUS(刪除狀態)等操作狀態中的一種。
.params就是檢測的結果。成功就會返回GL_TRUE,否則就會返回GL_FALSE。
6.void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog)
:獲取著色器程式錯誤訊息。
.program表示著色器程式唯一標誌。
.bufSize表示錯誤訊息容器大小。
.infoLog表示錯誤訊息容器。
.length表示錯誤訊息長度大小。當為NULL時就不返回錯誤訊息長度。
7.void glUseProgram(GLuint program)
:啟用著色器程式物件,預設情況下是非啟用狀態的。
.program表示著色器程式唯一標誌。當為0時,那麼所有當前使用的著色器都會被清除。
8.void glDeleteProgram(GLuint program)
:刪除著色器程式。當著色器程式被某一個環境所使用時,著色器程式就被標記為“可刪除”狀態,直到沒有環境使用該著色器程式時,就會自動被移除。
.program表示著色器程式唯一標誌。
9.GLboolean gllsProgram(GLuint program)
:判定指定著色器程式是否存在。
.program表示著色器程式唯一標誌。
著色器子程式:類似於C語言中的函式指標,主要用來實現子程式的動態選擇。
宣告著色器子程式集合流程如下:
1.通過關鍵字subroutine來定義著色器子程式型別。
原型如下所示:
subroutine returnType subroutineType(type param, ...);
其中returnType表示函式返回型別,subroutineType表示函式名稱,param表示指定型別type的函式引數名。
參考定義如下所示:
subroutine vec4 LightFunc(vec3);
2.通過關鍵字subroutine並結合第一步中定義好的著色器子程式型別來定義著色器子程式內容。
原型如下所示:
subroutine (subroutineType1, subroutineType2, ...) returnType funcName(...);
其中subroutineType1和subroutineType2代表的是不同的著色器子程式型別,returnType代表函式返回型別,funcName表示函式名。
參考定義如下所示:
subroutine (LightFunc) vec4 ambient(vec3 n);
subroutine (LightFunc) vec4 diffuse(vec3 n);
3.通過關鍵字subroutine和uniform來定義一個儲存選擇著色器子程式資訊的變數。
原型如下所示:
subroutine uniform subroutineType varName;
其中subroutineType表示著色器子程式型別,varName表示著色器子程式變數名
參考定義如下所示:
subroutine uniform LightFunc materialShader;
選擇著色器子程式流程如下:
1.GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const char* name)
:獲取指定著色器子程式uniform變數名稱的索引位置。
.program代表著色器程式。當不可用時返回GL_INVALID_OPERATION。
.shadertype代表著色器型別。通常是GL_VERTEX_SHADER(頂點著色器),GL_FRAGMENT_SHADER(片段著色器),GL_GEOMETRY_SHADER(幾何著色器)等型別中的一種。
.name代表著色器子程式uniform變數名稱。當該變數不可用時返回-1。
2.GLint glGetSubroutineIndex(GLuint program, GLenum shadertype, const char* name)
:獲取指定著色器子程式函式名稱的索引位置。
.program代表著色器程式。當不可用時返回GL_INVALID_OPERATION。
.shadertype代表著色器型別。通常是GL_VERTEX_SHADER(頂點著色器),GL_FRAGMENT_SHADER(片段著色器),GL_GEOMETRY_SHADER(幾何著色器)等型別中的一種。
.name代表著色器子程式函式名稱。當該函式不可用時返回GL_INVALID_INDEX。
3.GLuint glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint* indices)
:設定著色器子程式uniform變數的值為指定的著色器子程式函式。
.shadertype代表著色器型別。通常是GL_VERTEX_SHADER(頂點著色器),GL_FRAGMENT_SHADER(片段著色器),GL_GEOMETRY_SHADER(幾何著色器)等型別中的一種。
.count表示著色器子程式個數。
.indices表示著色器子程式uniform變數索引為key,著色器子程式函式索引為value的陣列。