著色器與程序
獲取鏈接后的著色器流程
需要?jiǎng)?chuàng)建2個(gè)基本對(duì)象才能?著?器進(jìn)?渲染: 著?器對(duì)象和程序?qū)ο?
使用GLSL編譯獲取鏈接后著色器對(duì)象的過(guò)程一般包括6個(gè)步驟
創(chuàng)建?個(gè)頂點(diǎn)著?器對(duì)象和?個(gè)?段著?器對(duì)象
將源代碼鏈接到每個(gè)著?器對(duì)象
編譯著?器對(duì)象
創(chuàng)建?個(gè)程序?qū)ο?/p>
將編譯后的著?器對(duì)象連接到程序?qū)ο?/p>
鏈接程序?qū)ο?/p>
創(chuàng)建與編譯一個(gè)著色器
創(chuàng)建著色器
type— 創(chuàng)建著?色器器的類型,GL_VERTEX_SHADER 或者GL_FRAGMENT_SHADER
返回值 — 是指向新著?器對(duì)象的句柄。
GLuint glCreateShader(GLenum type);
刪除著色器
shader — 要?jiǎng)h除的著?器對(duì)象句
void glDeleteShader(GLuint shader);
傳遞著色器源代碼
shader— 指向著?器對(duì)象的句柄
count — 著?器源字符串的數(shù)量,著?器可以由多個(gè)源字符串組成,但是每個(gè)著?器只有?個(gè)main函數(shù)
string — 指向保存數(shù)量的count 的著?器源字符串的數(shù)組指針
length — 指向保存每個(gè)著?器字符串??且元素?cái)?shù)量為count 的整數(shù)數(shù)組指針.
void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint
*length);
編譯著色器
shader — 需要編譯的著?器對(duì)象句柄
void glCompileShader(GLuint shader);
獲取編譯信息
shader— 需要編譯的著?器對(duì)象句柄
pname— 獲取的信息參數(shù),可以為
GL_COMPILE_STATUSGL_DELETE_STATUSGL_INFO_LOG_LENGTHGL_SHADER_SOURCE_LENGTHGL_SHADER_TYPE
params — 指向查詢結(jié)果的整數(shù)存儲(chǔ)位置的指針.
void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );
獲取編譯信息日志
shader — 需要獲取信息?志的著?器對(duì)象句柄
maxLength — 保存信息?志的緩存區(qū)??
length — 寫(xiě)?的信息?志的?度(減去null 終?符); 如果不需要知道?度. 這個(gè)參數(shù)可以為Null
infoLog — 指向保存信息?志的字符緩存區(qū)的指針.
void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog);
創(chuàng)建與鏈接程序
創(chuàng)建?個(gè)程序?qū)ο?/h6>
返回值: 返回?個(gè)執(zhí)?新程序?qū)ο蟮木浔?/p>
GLUint glCreateProgram( )
刪除一個(gè)程序?qū)ο?/h6>
program : 指向需要?jiǎng)h除的程序?qū)ο缶浔?/p>
void glDeleteProgram( GLuint program )
著?器與程序連接
program : 指向程序?qū)ο蟮木浔?/p>
shader : 指向程序連接的著?器對(duì)象的句柄
void glAttachShader( GLuint program , GLuint shader );
斷開(kāi)連接
program: 指向程序?qū)ο蟮木浔?/p>
shader : 指向程序斷開(kāi)連接的著?器對(duì)象句柄
void glDetachShader(GLuint program, GLuint shader);
綁定屬性
應(yīng)用程序通過(guò)函數(shù)把頂點(diǎn)屬性索引綁定到頂點(diǎn)屬性名,在鏈接程序之前執(zhí)行。
program: 指向程序?qū)ο缶浔?/p>
index:頂點(diǎn)屬性索引
name:屬性名稱
void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
鏈接
program: 指向程序?qū)ο缶浔?/p>
glLinkProgram(GLuint program)
鏈接程序之后, 檢查鏈接狀態(tài):
program: 需要獲取信息的程序?qū)ο缶浔?/p>
pname : 獲取信息的參數(shù),可以是:
- GL_ACTIVE_ATTRIBUTES
- GL_ACTIVE_ATTRIBUTES_MAX_LENGTH
- GL_ACTIVE_UNIFORM_BLOCK
- GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH
- GL_ACTIVE_UNIFROMS
- GL_ACTIVE_UNIFORM_MAX_LENGTH
- GL_ATTACHED_SHADERS
- GL_DELETE_STATUS
- GL_INFO_LOG_LENGTH
- GL_LINK_STATUS
- GL_PROGRAM_BINARY_RETRIEVABLE_HINT
- GL_TRANSFORM_FEEDBACK_BUFFER_MODE
- GL_TRANSFORM_FEEDBACK_VARYINGS
- GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
- GL_VALIDATE_STATUS
params : 指向查詢結(jié)果整數(shù)存儲(chǔ)位置的指針
void glGetProgramiv(GLuint program,GLenum pname, GLint *params);
從程序信息?志中獲取信息
program : 指向需要獲取信息的程序?qū)ο缶浔?/p>
maxLength : 存儲(chǔ)信息?志的緩存區(qū)??
length : 寫(xiě)?的信息?志?度(減去null 終?符),如果不需要知道?度,這個(gè)參數(shù)可以為Null.
infoLog : 指向存儲(chǔ)信息?志的字符緩存區(qū)的指針
void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog )
使用程序
program: 設(shè)置為活動(dòng)程序的程序?qū)ο缶浔?
void glUseProgram(GLuint program)
驗(yàn)證程序
??檢測(cè)program中包含的執(zhí)行段在給定的當(dāng)前OpenGL狀態(tài)下是否可執(zhí)行。驗(yàn)證過(guò)程產(chǎn)生的信息會(huì)被存儲(chǔ)在program日志中。驗(yàn)證信息可能由一個(gè)空字符串組成,或者可能是一個(gè)包含當(dāng)前程序?qū)ο笕绾闻c余下的OpenGL當(dāng)前狀態(tài)交互的信息的字符串。這為OpenGL實(shí)現(xiàn)提供了一個(gè)方法來(lái)調(diào)查更多關(guān)于程序效率低下、低優(yōu)化、執(zhí)行失敗等的信息。
glValidateProgram(prog);
??驗(yàn)證操作的結(jié)果狀態(tài)值會(huì)被存儲(chǔ)為程序?qū)ο鬆顟B(tài)的一部分。如果驗(yàn)證成功,這個(gè)值會(huì)被置為GL_TURE,反之置為GL_FALSE。調(diào)用函數(shù) glGetProgramiv 傳入?yún)?shù) program和GL_VALIDATE_STATUS可以查詢這個(gè)值。在給定當(dāng)前狀態(tài)下,如果驗(yàn)證成功,那么 program保證可以執(zhí)行,反之保證不會(huì)執(zhí)行