经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
LearnOpenGL笔记(3)着色器
来源:cnblogs  作者:Lxliiin  时间:2019/11/7 21:22:30  对本文有异议

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)

 

 

原文链接:http://www.cnblogs.com/lxliiin/p/11815482.html