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

  


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

 


 

 

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

 

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

 

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

 

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

 

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

 

 

 

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


未完待续

 


 

2020/10/17

 

  想透彻理解glfw去官网是少不了的www.glfw.org,想透彻理解opengl去官网也是少不了的www.opengl.org

 

  原来glViewport函数前两个参数是所渲染的窗口的坐标系中的坐标(x指上,y指右),代表了view区域的左下角位置。

 

  initialize glad之前得先有glfwMakeContextCurrent(window),否则fail。

 

  ctrl+L是visual studio删除一行的快捷键,快速选择一行是shift + home(往前选)和shift+end(往后选)很管用。

 


 

2020/10/18

   Hello Triangle

2022/10/14

  现在的我已经是一名游戏开发者,回顾两年前自学OpenGL的经历心中有说不出的感慨。当时学这个只是觉得有意思,或者是想挑战一些困难等,所以一股子劲跳进了这个似乎“学了以后并没有啥用”的大坑里。不过,现在的我很感谢当时的我义无反顾地跳了进去。不知是幸运还是命运,在学习OpenGL中积累的基础,让我在游戏开发过程中相比其它未学过的程序员获得了更高一层的视角。也成为了我以后探索技术美术方向铺垫了一块坚稳的基石头。

  未来,拭目以待吧!