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

GLSL向量的一些操作

  1. vec2 someVec;
  2.  
  3. vec4 differentVec = someVec.xyxx;
  4.  
  5. vec3 anotherVec = differentVec.zyw;
  6.  
  7. vec4 otherVec = someVec.xxxx + anotherVec.yxzy;

定义着色器类

  (这部分是c++的知识欠缺

  1. class Shader
  2. {
  3. public:
  4. unsigned int ID;
  5.  
  6. Shader(const GLchar* vertexPath,const GLchar* fragmentPath);
  7.  
  8. void use();
  9. //uniform工具函数
  10. void setBool(const std::string &name, bool value) const;
  11. void setInt(const std::string& name, int value) const;
  12. void setFloat(const std::string& name, float value) const;
  13. };

const关键字:

表示这是一个常量函数,在该函数中,不能改变类的成员变量。

  1. //1//从文件读取
  2. std::string vertexCode;
  3. std::string fragmentCode;
  4. std::ifstream vShaderFile;
  5. std::ifstream fShaderFile;
  6. //保证ifstream对象可以抛出异常
  7. vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  8. fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  9. try {
  10. //打开文件
  11. vShaderFile.open(vertexPath);
  12. fShaderFile.open(fragmentPath);
  13. std::stringstream vShaderStream, fShaderStream;
  14. //读取文件的缓冲内容到数据流中
  15. vShaderStream << vShaderFile.rdbuf();
  16. fShaderStream << fShaderFile.rdbuf();
  17. //关闭文件处理器
  18. vertexCode = vShaderStream.str();
  19. fragmentCode = fShaderStream.str();
  20. }
  21. catch (std::ifstream::failure e) {
  22. std::cout << "ERROR:SHADER::文件读取失败" << std::endl;
  23. }
  24. const char* vShaderCode = vertexCode.c_str();
  25. const char* fShaderCode = fragmentCode.c_str();

try &catch(throw)异常处理

  1. //抛出异常,表达式的值的类型可以是基本类型,亦可以是类
  2. throw 表达式;
  3. //try…catch
  4. try{
  5. 语句组
  6. }
  7. catch(异常类型) {
  8. 异常处理代码
  9. }
  10. ...
  11. catch(异常类型) {
  12. 异常处理代码
  13. }

执行 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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号