OpenGL 11 封裝乙個自己的著色器類

2021-08-09 12:35:12 字數 1913 閱讀 5760

之前都是通過讀取著色器字串來建立著色器,這樣耦合程度很高,並且生成、鏈結著色器程式也需要寫很繁雜的過程。現在我編寫乙個shader類來讀取著色器文字檔案,並且封裝那些繁雜的步驟。

shader標頭檔案:

#ifndef inc_10_shader_loader_shader_h

#define inc_10_shader_loader_shader_h

#include #include #include #include #include class shader ;

#endif //inc_10_shader_loader_shader_h

shader.cpp:

#include "shader.h"

shader::shader(const char *vertexshaderpath, const char *fragmentshaderpath) catch (std::ifstream::failure e)

//再轉換成字元陣列

const char* vshadersource = vertexcode.c_str();

const char* fshadersource = fragmentcode.c_str();

//接著就可以開始編譯和連線著色器了

unsigned int vertexshader, fragmentshader;

//編譯頂點著色器

vertexshader = glcreateshader(gl_vertex_shader);

glshadersource(vertexshader, 1, &vshadersource, null);

glcompileshader(vertexshader);

checkcompileerrors(vertexshader, "vertex");

//編譯片段著色器

fragmentshader = glcreateshader(gl_fragment_shader);

glshadersource(fragmentshader, 1, &fshadersource, null);

glcompileshader(fragmentshader);

checkcompileerrors(vertexshader, "fragment");

//鏈結著色器

id = glcreateprogram();

glattachshader(id, vertexshader);

glattachshader(id, fragmentshader);

gllinkprogram(id);

checkcompileerrors(id, "program");

//當著色器鏈結到了程式中,就不再需要了

gldeleteshader(vertexshader);

gldeleteshader(fragmentshader);

}//啟用著色器

void shader::use()

//設定uniform變數

void shader::setbool(const char *name, bool value) const

//設定uniform變數

void shader::setint(const char *name, int value) const

//設定uniform變數

void shader::setfloat(const char *name, float value) const

//輸出shader編譯或program鏈結的錯誤資訊

void shader::checkcompileerrors(unsigned int shader, std::string type)

javaScript 3 封裝自己的scroll

封裝自己的scrolltop scrollleft 第一步 判斷瀏覽器是否支援 第二步 var json 不用宣告變數,直接return function scroll 不支援的 檢測是不是怪異模式的瀏覽器 沒有宣告頭的 判斷是否宣告dtd 1.css1compat已經宣告 css標準模式 2.ba...

2 2 封裝乙個獲取元素的樣式的方法

一 設定和獲取行內的樣式 box div 設給元素置樣式 注意這設定的是行內樣式 var obox document.getelementbyid box obox.style.width 200px obox.style.height 200px obox.style.background red...

IO4 1封裝乙個刪除檔案函式

需求如題。首先,我們需要建立乙個檔案 filename path py.txt try f open filename path,w 寫入模式,會沖刷掉檔案內容 print f.write 作者,黃蓉 f.close except 異常處理 print s檔案找不到 filename path 成功...