OpenGL中使用GLSL著色器

2021-06-27 15:48:32 字數 1963 閱讀 2173

opengl中使用glsl著色器步驟

glsl既適用於頂點著色器,也適用於片段著色器。

使用著色器物件的步驟:

1、建立著色器物件:

gluint glcreateshader(glenum type);

//建立乙個著色器物件,type值必須是gl_vertex_shader或gl_fragment_shader。error返回0

glshadersource(gluint shader, glsizei count, const glchar** string, const glint* length);

3、編譯著色器物件的原始碼:

void glcompileshader(gluint shader);

glgetshaderiv(gl_cimpile_status);  //查詢編譯結果

glgetshaderinfolog(gluint shader, glsizei bufsize, glsizei *length, char* infolog);

4、建立乙個空的著色器程式:

gluint glcreateprogram();   //if error, return 0;

5、把著色器物件連線到著色器程式:

glattachshader(gluint program, gluint shader);   //gldetachshader(program, shader);

voi gllinkprogram(gluint program);

glgetprogramiv(gl_link_status);    //查詢鏈結結果, gl_true represent success

glgetprograminfolog(gluint shader, glsizei bufsize, glsizei *length, char* infolog);

7、啟動頂點或片段著色器程式:

void gluseprogram(gluint program);   //使用程式的物件控制代碼作為引數

eg:

gluint shader,program;

gluint compiled, linked;

const glchar* shadersrc = "

};shader = glcreateshader(gl_vertex_shader);

glshadersource(shader, 1, shadersrc, null);

glcompileshader(shader);

glgetshaderinfolog(shader, gl_compile_status, &compiled);

if(!compiled)

program =glcreateprogram();

glattachshader(program, shader);

gllinkprogram(program);

glgetprogramiv(program, gl_link_status, &linked);

if(linker)else

刪除著色器:

void gldeleteshader(gluint shader); //若正在被使用,標記為刪除,使用完後刪除

判斷是否是否是有效的著色器程式名:

glboolean glisprogram(gluint program);  //gl_true

驗證乙個著色器是否可在當前的opengl狀態下執行:

void glvalidateprogram(gluint program);

//若驗證通過,gl_validate_status被設定為gl_true, 呼叫glgetprogramiv()查詢gl_validate_status的值。

GLSL 著色器相關

一 頂點著色器 頂點著色器,根據應用程式的設計,只是選擇處理 1.視覺空間變換 模型,法線,紋理 2.主顏色和輔助顏色的計算生成 光照在攝像機座標系中進行實時光照計算 3.紋理座標計算。4.霧座標設定和處理。5.點大小。1 透視除法。硬體實現。2 視口對映變換。硬體實現。3 圖元裝配,在4d裁剪空間...

opengl著色步驟

在opengl整個程式的初始化階段 一般是init 函式 做以下工作。1 頂點著色程式的源 和片段作色程式的源 要分別儲存到乙個字元陣列裡面 2 使用glcreateshader 分別建立乙個頂點著色器物件和乙個片段著色器物件 3 使用glshadersource 分別將頂點著色程式的源 字元陣列繫...

為何要在GLSL中使用UBO

關於ubo的介紹和使用詳情,請看 除了opengl手冊,應該沒有比這個更詳細的了。最近在乙個glsl專案中,需要迴圈繪製多塊buffer,而每次迴圈都要給buffer傳入大量的uniform,導致shader的渲染效率極低。比如之前的 是類似這個樣子 m pprogramblock sendunif...