Learn OpenGL(五) 定義自己的著色器

2021-09-01 09:29:43 字數 2046 閱讀 3495

編寫、編譯、管理著色器是件麻煩事。在著色器的最後主題裡,我們會寫乙個類來讓我們的生活輕鬆一點,這個類從硬碟讀著色器,然後編譯和鏈結它們,對它們進行錯誤檢測,這就變得很好用了。這也會給你一些關於如何把我們目前所學的知識封裝到乙個抽象的物件裡的靈感。

我們會在標頭檔案裡建立整個類,主要為了學習,也可以方便移植。我們先來新增必要的include,定義類結構:

#ifndef shader_h

#define shader_h

#include #include #include #include using namespace std;

#include ; // 包含glew獲取所有的opengl必要headers

class shader

;#endif

注:

在上面,我們用了幾個預處理指令(preprocessor directives)。這些預處理指令告知你的編譯器,只在沒被包

含過的情況下才包含和編譯這個標頭檔案,即使多個檔案都包含了這個shader標頭檔案,它是用來防止鏈結衝突的。

shader

類保留了著色器程式的id。它的構造器需要頂點和片段著色器源**的檔案路徑,我們可以把各自的文字檔案儲存在硬碟上。 use 函式看似平常,但是能夠顯示這個自造類如何讓我們的生活變輕鬆(雖然只有一點)。

我們使用c++檔案流讀取著色器內容,儲存到幾個string物件裡著色器

shader(const glchar * vertexpath, const glchar * fragmentpath)

catch(std::exception e)

著色器

// 2. 編譯著色器

gluint vertex, fragment;

glint success;

glchar infolog[512];

// 頂點著色器

vertex = glcreateshader(gl_vertex_shader);

glshadersource(vertex, 1, &vshadercode, null);

glcompileshader(vertex);

// 列印編譯時錯誤

glgetshaderiv(vertex, gl_compile_status, &success);

if(!success)

;// 對片段著色器進行類似處理

[...]

// 著色器程式

this->program = glcreateprogram();

glattachshader(this->program, vertex);

glattachshader(this->program, fragment);

gllinkprogram(this->program);

// 列印連線錯誤

glgetprogramiv(this->program, gl_link_status, &success);

if(!success)

// 刪除著色器

gldeleteshader(vertex);

gldeleteshader(fragment);

最後我們也要實現use函式:

void use()

現在我們寫完了乙個完整的著色器類。使用著色器類很簡單;我們建立乙個著色器物件以

後,就可以簡單的使用了:

著色器

shader ourshader("path/to/shaders/shader.vs", "path/to/shaders/shader.frag");

...while(...)

我們把頂點和片段著色器儲存為兩個叫做 shader.vs 和 shader.frag 的檔案。你可以使用自己喜歡的名字命名著色器檔案;我自己覺得用 .vs 和 .frag 作為副檔名很直觀。

LearnOpenGL學習筆記 五 變換

openggl中對物體的變換是通過矩陣物件來實現的,需要掌握一些最基本的矩陣運算相關知識。include include include我們需要定義頂點著色器,使能夠接收乙個mat4的uniform矩陣,通過變換矩陣左乘位置向量,就可以實現對圖形的變換。version 330 core layout...

mysql 定義自增

alter table user table modify user id int unsigned auto increment 問題來了,為什麼我們要對我們的資料表作自增操作?因為當我們對錶設定為自增之後,我們以後若是想在表中插入資料的話,比如這個表是這樣的 userid username pa...

自定義TextBox,實現自增自減

我們使用附加屬性來實現,依賴屬性也可以實現,原理一樣 如圖xmal cs,定義附加屬性 using system using system.collections.generic using system.linq using system.text using system.threading.t...