咳咳,原本这个日志是本机上随便写的一些记录,也没怎么注意可读性和格式,有用信息密度很小,所以实用价值并不大。暂时由于不可抗因素得先鸽一段落了。。。

  后续的日志会升格为模块化的学习记录,(应该)将会有很大的改观。

   小节一下这段时间的学习感受吧。

  我是在learnopengl.com上学的,最好的学习opengl的网站,没有之一。

  有中文版的这个网站,但是还是尽量看的英文版。毕竟有的时候翻译不出来那种味道。而且可以有效提高英语阅读能力。

  现在,已经有集成度很高的开发工具(比如QT)。尽管有了这样便捷的“车”,但是也不能否定从轮子造起的重要性。

  学了一小段时间的OpenGL,虽然并没有什么可以拿得出手的作品,但是却对于图形编程底层的原理有了认识和理解。在叹服前人开发者的智慧的同时,也敬畏后人集成封装的成果。

  Moreover,着手巨量复杂的代码让我以后面对更多挑战的时候能够更加沉着从容。

  动手者所获,是伸手者永远也无法体会到的。

  


2020.2.3

  下载并配置了glfw glad
  glfw提供了openGL context
  glad 也提供了个函数使用的什么方便 简化了一些复杂过程 GLAD manages function pointers for OpenGL
  学到了如何连接lib文件 include 等 如何设置附加的include lib路径等
  (或者直接把lib include dll等放到vs特定的文件夹里面)
  我还是决定每次都设置一次路径这样防止遗忘操作
  另外最重要的一件事情!!!
    : 用这个glfw编程一定要把编译平台设置成*64 否则用win32 就会出错(因为当时安装的就是64位的)
  cmake是个啥东西 没深入了解
  学了glfwCreateWindow
  render loop让显示保持
  成功搞出来一个黑色的窗口
  明白了双缓冲机制

  
  若较长时间不swap的话会卡主 我猜测可能是因为下一帧缓冲积累的负重过多
  确切实验发现,其实是每一帧不pollevents就会卡
  中途poll了 然后又不poll 就会表现出 窗口拖不动
  一开始不poll就会鼠标转圈
  一开始poll了 后来就算不swap画面也不会鼠标转圈 但是拖不动

  关于对原理的理解增加了


2020.2.4
  shader着色器
  Shaders are written in the OpenGL Shading Language (GLSL)
  normalized device coordinates (NDC)
  vertex buffer objects (VBO))
  顶点缓冲区
  draw
  vertex shader
  fragment shader
  VAO VBO EBO
  各种东西
  这本质是一个...状态机
  shader bind上去以后要删除


2020.2.5 my first triangle

  shaderProgram至少绑定一个shader否则link报错
  只绑定一个vertex shader并不会显示什么
  看来至少需要两个shader 才能显示啥
  发现了一个有趣的事情
  如果把useProgram去掉 不使用shader 那么三角形就是黑色的 不过有三角形的形状
  但是如果不去掉,只去掉glDrawArrays 那连三角形都没有

对原理的理解增加了


2020.2.6

  EBO 实现四边形 锥锤
  注意unbind evo需要在unbind vao之后因为vao自动追踪着 ebo
  opengl这个状态机一次只能处理一个buffer 处理buffer data需要一个After一个
  VBO实际上是一组点的数据而已
  the VAO represents our complete object
  每次把vbo bind到vao上面并不是替换而是加在后面 最后显示的时候顺着VAO来 所以每一次bind之后的vertex attribute设置都是对于当前vbo的
  上回黑色三角形原来是shader没有起作用的结果


2020.2.7
  准备继续重写一遍框架
  然后调试一个Bug搞了好久 最后原来是开头windowhint时第一个变量填错了 不是GLFW_VERSION_MINOR而是    GLFW_CONTEXT_VERSION_MINOR
  还有 创建window要在初始化glad前面
  初始化char数组加了[]就不要加星号
  linkshader实际山就相当于把各个attach在一起的shaders涂胶水连接起来
  VBO EBO就在一开始参与配置data 到后面程序运行就是VAO露脸
  VAO VBO EBO 的ungiened不能少了
  注意啊 最后是glDeleteVertexArrays(1, &VAO);
  而不是glDeleteBuffers
  有个bug找了好久 是shaderdata的时候第二个变量表示有多少个源代码而不是源代码长度


2020.2.8
  昨天找到半夜也找不出的BUG找到了 原来是定义indecies数组的时候设置成了float数组
  更深入地体会了vertexArrayObject和vertexBufferObject vertexAttribPointer 之间的关系
  VAO VBO 所对应的状态机的位子只有一个 一次只能bind一个上去 在每一次设置vertexAttribPointer
  的时候,当前状态下的VBO就会和当前状态下的VAO联系起来 调用VAO就是调用当前状态
  因此设置每一个VAO基本上五步 bind VAO --bind VBO ---data VBO--vertexAttribPointer--enable vaa
  其实不需要去unbind他们 每一次要生成某个物体就bind它的VAO draw似乎之和bind的VAO有关 bind 其他VBO没有关系
  又解决了一个中断bug 忘了bind VBO
  开始学习shader 他们是互相独立的在GPU上的小程序 功能是把input转化为output
  vecn.xy···
  在shader之间传递值
  vec不要写成了vect
  uniforms 把值从CPU传到GPU


2020.2.9
  GLSL中未使用的uniform会被自动删除
  改变unofrom需要事先useshaderProgram
  用VBO存储颜色 并读取
  创造shader class
  shader 头文件里面include glad to get all the required OpenGL headers
  Error C5145: must write to gl_Position 被bug所困扰
  其可能原因是gl_Position缺少或者拼错了 而我这次是因为调用Shader的时候路径搜索不到!
  然后尝试了一下 发现相对路径是在main.cpp所在的目录下
  然后又尝试了一下 如果把exe文件搞出来的话 相对路径就是exe文件目录下
  但是编译的时候 就只放在exe目录下而不放在main目录下就不行 因缺斯汀
  (猜想:难道说vs编译运行了以后才复制一份exe到debug目录下?)
  把点颜色设置成坐标 左下角是黑色的 因为左下角坐标是负的 所以返回的值是0.0f
  texture


2020.2.10
  image_loading library stb_image.h
  glVertexAttribPointer设置要格外小心
  解决了一个大bug vertex shader设置的时候layout 的location设置错了


2020.2.11
  texture 贴图完成
  texture units 一般情况下编译器都至少有16个
  可以通过 texture0 + int 的形式调用
  总结个人对texture的理解
  GL_TEXTURE_2D依旧只有一个空位 每次只能绑定一个texture
  每次处理texture状态机都是通过一个textureunit来处理 默认为0
  先设置好各个texture对象
  多个texture unit显示多个图片的原理是 对于不同textureunit绑定不同的texture 以ActiveTexture的方法(就像换了个小texture状态机)
  然后loop render之前先bind好各个的通道 shader里面的uniform sampler会自动从对应变量所标记的unit提取
  注意导入图片data的时候弄清楚是rgba还是rgb (nrChannel)
  向量叉乘
  Gimbal lock 万向 锁


2020.2.12
  一般先缩放再旋转再平移
  有个C/c++编译器叫做clion
  注意审题啊
  uniform 玩matrix
  translate/rotate /*函数都是把后面的去乘你给的矩阵*/ 实际上是把新的矩阵加在后面
  五大坐标系系统


2020.2.13
  going 3D
  z-buffer 深度测试默认是关闭的 需要手动开启
  注意啊 使用stb_image.h 之前需要#define STB_IMAGE_IMPLEMENTATION !!!!
  细品model view perspective三个矩阵的作用以及思考产生多个正方笑脸箱子的过程就会发现这个机制的巧妙 (特别是设置各个箱子坐标的时候可以大于1)
  有意思 view先平移再转圈和先转圈再平移操作的效果不一样 先转圈再平移比较正常 先平移再转圈就会发生奇怪的事情(比如明明按的左键然后物体却后退)

        理解又增加了
  个人感觉后者和第一人称关系较大
  相机指向z负半轴 所以右边自然就是x轴正方向


2020.2.15
  注意啊 设置mousecallback的时候 y方向上是lastY-ypos 因为屏幕的y轴是向下的


2020.2.16
  学到了构造函数后面+:的一个新作用(除了继承类) 还用于值的初始化(A(a),····) 可以对类的const成员变进行初始化
  注意啊函数参数double 你给的float 他就给你画波浪线了
  mat[col][row]

2020.2.17
  开始进军lightning
  光源的颜色与物体的颜色相乘 就得到了反射的颜色
  2333把光源的形状改成了小座灯
  注意向量 Forgetting to normalize a vector is a popular mistake.


2020.2.18
  啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  这里缺乏线性代数的知识 无法理解转换法向量的矩阵怎么来的
  移动小座灯 好玩


2020.2.19
  从基础关照这里开始崩盘了
  不谈 move on
  我发现有时粗心忘掉加矩阵 会出现意想不到的效果
  开material了
  别忘了在#include <stb_image.h>前面加一行#define STB_IMAGE_IMPLEMENTATION
  #include <std_image.h>不行 #include <stb_image.h>才行
  又在 glVertexAttribPointer 出错了
  fool around


2020.2.20
  可以通过vec4的第四个元素判别是direct light还是position


2020.2.21
  开始搞multiple lights


2020.2.2
  安装assimp
  一个Bug 我把上一个工程的代码和资源复制到新建工程 发现shader连接不到源文件 原因是我复制错地方了,应该把源文件复制到本project下的<工程名>文件下
  妙用struct
  开始封装mesh了 我把小座灯保存在这里:
 float ligvertices[] =
{
-0.3f, -0.5f, 0.3f,
0.3f, -0.5f, 0.3f,
0.0f, -0.2f, 0.0f,

-0.3f, -0.5f, -0.3f,
0.3f, -0.5f, -0.3f,
0.0f, -0.2f, 0.0f,

-0.3f, -0.5f, 0.3f,
-0.3f, -0.5f, -0.3f,
0.0f, -0.2f, 0.0f,

0.3f, -0.5f, 0.3f,
0.3f, -0.5f, -0.3f,
0.0f, -0.2f, 0.0f, //lingt的底座

-0.5f, -0.2f, -0.5f,
0.5f, -0.2f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.2f, -0.5f,

-0.5f, -0.2f, 0.5f,
0.5f, -0.2f, 0.5f,
0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.2f, 0.5f,

-0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.2f, -0.5f,
-0.5f, -0.2f, -0.5f,
-0.5f, -0.2f, 0.5f,
-0.5f, 0.5f, 0.5f,

0.5f, 0.5f, 0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.2f, -0.5f,
0.5f, -0.2f, -0.5f,
0.5f, -0.2f, 0.5f,
0.5f, 0.5f, 0.5f,

-0.5f, -0.2f, -0.5f,
0.5f, -0.2f, -0.5f,
0.5f, -0.2f, 0.5f,
0.5f, -0.2f, 0.5f,
-0.5f, -0.2f, 0.5f,
-0.5f, -0.2f, -0.5f,

-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
};

  别忘了放库 assimp-vc120-mt.dll


2020.2.24
  数据成员是不能声明的同时做初始化的!!!
  2333如果你定义一个类的构造函数参数中有其他类 ,那个 其他类 若没有手动定义一个默认构造函数那么就会报错
  控制台出现了一行16进制数字 light没有出现 原来是vertexattribpointer参数设置有问题 hhMD鸭那个是自己的cout输出的
  好吧真正的bug在于shader.use太靠后了


2020.2.27
  model里面include了stb_image main 里面再include 就会出问题 (这两个一个Include皆可


2020.2.28
  stencil test并没有学透


2020.2.29
  blend


2020.3.2
  blend over


2020.3.13
  初步搞懂 frame_buffer


2020.3.14
  在shader 里面写代码需要注意代码别写错不然和麻烦 这次数组初始化搞错了 ;
  数组初始化 最后不要有逗号


2020.3.15
  开cubemaps
  今天纠结了很久为啥skybox 的vertex shader 里面z都设置成了1
  ————因为这个shader是他独有的 对其他东西没有啥影响


2020.3.20
  环境动态渲染先鸽了
  对cubemap镜面反射时 方块形状错乱 先鸽了
  过了anvanced data


未完待续

最新文章

  1. sys.stdout.write与sys.sterr.write(二)
  2. Jersey 2 + Maven + Tomcat + IntelliJ IDEA 搭建RESTful服务
  3. angular的$scope
  4. webapp开发需要注意的浏览器内核知识
  5. ID3DXMesh接口 创建自己的立方体网格
  6. POJ 2296 二分+2-sat
  7. LabVIEW数据记录和存储—XML文件
  8. 使用sqlhelper的简单增删改查
  9. Linux Shell编程(9)——特殊变量类型
  10. C#里4个访问权限修饰符
  11. Android-图标
  12. 深入理解Node系列-细说Connect(上)
  13. 软工+C(2017第5期) 工具和结构化
  14. 贝塞尔曲线控件 for .NET (EN)
  15. Python内置函数(30)——hex
  16. 对java中的equals()方法的总结
  17. ES5-ES6-ES7_const声明只读常量
  18. Week3 关于“微软必应词典客户端”的案例分析
  19. sharepoint 2007页面显示真实的错误信息
  20. Linux yum源完全配置

热门文章

  1. linux root 与普通用户之间的切换
  2. let、const、var的区别
  3. matplotlib常用基础知识
  4. PHP next() 函数
  5. PDOStatement::errorInfo
  6. linux之DHCP服务端搭建 ( ip分配 四个阶段原理)
  7. win系统下git代码批量克隆,批量更新
  8. 从零写一个Asp.net core手脚架 (异常处理)
  9. python6.2类的封装
  10. 铁大树洞APP视频讲解和原型演示