LearnOpenGL笔记(3)着色器
GLSL向量的一些操作
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关键字:
表示这是一个常量函数,在该函数中,不能改变类的成员变量。
//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)异常处理
//抛出异常,表达式的值的类型可以是基本类型,亦可以是类 throw 表达式; //try…catch try{ 语句组 } catch(异常类型) { 异常处理代码 } ... catch(异常类型) { 异常处理代码 }
执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;
如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。
读取文件时的目录设置
两种路径参数:
相对路径,由根目录开始:” 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)