OpenGL ES 著色器與程序

著色器與程序

獲取鏈接后的著色器流程

需要?jiǎng)?chuàng)建2個(gè)基本對(duì)象才能?著?器進(jìn)?渲染: 著?器對(duì)象和程序?qū)ο?

使用GLSL編譯獲取鏈接后著色器對(duì)象的過(guò)程一般包括6個(gè)步驟

  1. 創(chuàng)建?個(gè)頂點(diǎn)著?器對(duì)象和?個(gè)?段著?器對(duì)象

  2. 將源代碼鏈接到每個(gè)著?器對(duì)象

  3. 編譯著?器對(duì)象

  4. 創(chuàng)建?個(gè)程序?qū)ο?/p>

  5. 將編譯后的著?器對(duì)象連接到程序?qū)ο?/p>

  6. 鏈接程序?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_STATUS
  • GL_DELETE_STATUS
  • GL_INFO_LOG_LENGTH
  • GL_SHADER_SOURCE_LENGTH
  • GL_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í)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容