zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    android apk瘦身之 图片压缩 tinypng
    java 1.7 新io 实践 NIO2
    Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
    dex2oat 加载多次
    android stadio open recent 在同一窗口打开
    &运算符的应用
    MethodTrace 生成的trace文件为空
    MethodTrace 生成的trace文件为空
    error: unknown host service 的详细解决办法
    error: unknown host service 的详细解决办法
  • 原文地址:https://www.cnblogs.com/lxliiin/p/11815482.html
Copyright © 2011-2022 走看看