OpenGL学习日志(2020.4之前)
咳咳,原本这个日志是本机上随便写的一些记录,也没怎么注意可读性和格式,有用信息密度很小,所以实用价值并不大。暂时由于不可抗因素得先鸽一段落了。。。
后续的日志会升格为模块化的学习记录,(应该)将会有很大的改观。
小节一下这段时间的学习感受吧。
我是在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
未完待续
OpenGL学习日志(2020.4之前)的更多相关文章
- OpenGL学习笔记2017/8/29
OpenGL学习日志: 感谢doing5552 的OpenGL入门学习:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 相 ...
- 基于Flask框架搭建视频网站的学习日志(一)
------------恢复内容开始------------ 基于Flask框架搭建视频网站的学习日志(一)2020/02/01 一.Flask环境搭建 创建虚拟环境 初次搭建虚拟环境 搭建完虚拟环境 ...
- 基于Flask框架搭建视频网站的学习日志(二)
基于Flask框架搭建视频网站的学习日志(二)2020/02/02 一.初始化 所有的Flask程序都必须创建一个程序实例,程序实例是Flask类的对象 from flask import Flask ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- OpenGL学习进程(12)第九课:矩阵乘法实现3D变换
本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈. (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...
- OpenGL学习进程(11)第八课:颜色绘制的详解
本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿. (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. R ...
- GRE学习日志
发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- OpenGL学习之路(一)
1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...
随机推荐
- PHP boolval() 函数
boolval 函数用于获取变量的布尔值.高佣联盟 www.cgewang.com 版本要求:PHP 5 >= 5.5.0, PHP 7. 语法 boolean boolval ( mixed ...
- log4j2 自动删除过期日志文件配置及实现原理解析
日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...
- Multiple dex files define解决记录
引用多个library时经常会遇到Multiple dex files define错误,最常见的是support库多次定义,此时可用以下gradle命令来查看工程的引用树: gradlew -q d ...
- MySQL InnoDB技术内幕:内存管理、事务和锁
前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...
- [转]Maven类包冲突终极三大解决技巧
举例 A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过<scope>等若干种方式控制传递依赖).这 ...
- js数组中如何去除重复值?
在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...
- 数位DP 学习笔记
前言:鸣谢https://www.luogu.com.cn/blog/virus2017/shuweidp.感谢大佬orz ----------------------------- [引入] 首先要 ...
- 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!
最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...
- HttpClient 模拟用户操作
首先模拟用户登录: /** * 模拟用户登录 * */ private void login() throws HttpException, IOException { PostMethod logi ...
- C++/C socket编程实例
目录 基于TCP的socket编程 服务器代码 客户端代码 运行结果 基于UDP的socket编程 服务器代码 客户端代码 运行结果 基于TCP的socket编程 服务器代码 服务器端代码如下 //T ...