GLSL向量的一些操做c++
vec2 someVec; vec4 differentVec = someVec.xyxx; vec3 anotherVec = differentVec.zyw; vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
定義着色器類函數
(這部分是c++的知識欠缺工具
class Shader { public: unsigned int ID; Shader(const GLchar* vertexPath,const GLchar* fragmentPath); void use(); //uniform工具函數 void setBool(const std::string &name, bool value) const; void setInt(const std::string& name, int value) const; void setFloat(const std::string& name, float value) const; };
const關鍵字:spa
表示這是一個常量函數,在該函數中,不能改變類的成員變量。3d
//1//從文件讀取 std::string vertexCode; std::string fragmentCode; std::ifstream vShaderFile; std::ifstream fShaderFile; //保證ifstream對象能夠拋出異常 vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); try { //打開文件 vShaderFile.open(vertexPath); fShaderFile.open(fragmentPath); std::stringstream vShaderStream, fShaderStream; //讀取文件的緩衝內容到數據流中 vShaderStream << vShaderFile.rdbuf(); fShaderStream << fShaderFile.rdbuf(); //關閉文件處理器 vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); } catch (std::ifstream::failure e) { std::cout << "ERROR:SHADER::文件讀取失敗" << std::endl; } const char* vShaderCode = vertexCode.c_str(); const char* fShaderCode = fragmentCode.c_str();
try &catch(throw)異常處理code
//拋出異常,表達式的值的類型能夠是基本類型,亦能夠是類 throw 表達式; //try…catch try{ 語句組 } catch(異常類型) { 異常處理代碼 } ... catch(異常類型) { 異常處理代碼 }
執行 try 塊中的語句,若是執行的過程當中沒有異常拋出,那麼執行完後就執行最後一個 catch 塊後面的語句,全部 catch 塊中的語句都不會被執行;orm
若是 try 塊執行的過程當中拋出了異常,那麼拋出異常後當即跳轉到第一個「異常類型」和拋出的異常類型匹配的 catch 塊中執行(稱做異常被該 catch 塊「捕獲」),執行完後再跳轉到最後一個 catch 塊後面繼續執行。對象
讀取文件時的目錄設置blog
兩種路徑參數:字符串
相對路徑,由根目錄開始:」 Resource/pos_color_outpos.fs」
絕對路徑:「F:\\c++\\MyOpenGL\\MyOpenGL\\Resource\\pos_color_outpos.vs 「
絕對路徑就是電腦地址欄的路徑:
另外由於\在字符串裏是轉義字符,改用\\表示\
練習題
使用out
關鍵字把頂點位置輸出到片斷着色器,並將片斷的顏色設置爲與頂點位置相等(來看看連頂點位置值都在三角形中被插值的結果)。作完這些後,嘗試回答下面的問題:爲何在三角形的左下角是黑的
渲染結果
由於全部點的z=0,因此顏色上rgb藍色一直爲0(沒有藍色
能夠明顯看出左下角的座標是(0,0,0),因此是黑色
而後從顏色上看,→是紅色的正方向,及x軸正方向。
↑是綠色、y軸正方向,z軸還看不出來。
(由於opengl是右手座標系,實際上向前是z軸的正方向)
(拇指食指貼xy軸_彎曲中指的方向就是z軸_抓.jpg)