![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LearnOpenGL
文章平均质量分 91
2023年2月中旬在LearnOpenGL网站上学习OpenGL并写下的笔记,内容大都是来源于官网,简洁了语言,由于自学,文章难免会有错误,欢迎指正
刘建杰
像我这么优秀的人,
本该当个公务员。
怎么二十多年到头来,
还在招聘会沉沦。
像我这样迷茫的人,
像我这样牛马的人,
像我这样打工度年的人,
你还见过多少人。
展开
-
LearnOpenGL-高级光照-1.Blinn-Phong
目的解决上述Phong提到的问题(在镜面高光区域的边缘出现了一道很明显的断层解决方式不再计算反射向量与观察向量的点积。而是用半程向量(Halfway Vector)与法线向量的点积。什么是半程向量光线与视线夹角一半方向上的一个单位向量图示几个要点当半程向量与法线向量越接近时,镜面光分量就越大不论观察者向哪个方向看,半程向量与表面法线之间的夹角都不会超过90度(除非光源在表面以下)如何计算半程向量只需要将光线的方向向量和观察向量加到一起,并将结果正规化(Normalize)原创 2023-06-11 16:45:15 · 800 阅读 · 1 评论 -
LearnOpenGL-高级OpenGL-11.抗锯齿
每个片段的颜色会由顶点数据插值而得出,得出的颜色存储在每个片段的中心一个片段有4个采样点,这4个采样点的颜色都与片段中心的颜色一样当一个片段的**4个**采样点被三角形包围,则片段的最终颜色是**四个**采样点颜色相加除以4当一个片段有**两个**采样点被三角形包围,两个采样点在外面,则片段的最终颜色是会将**两个**采样点的颜色相加后除以4原创 2023-06-11 01:04:54 · 570 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-10.实例化
性能消耗的地方: OpenGL在绘制顶点数据之前需要做很多准备工作(比如告诉GPU该从哪个缓冲读取数据,从哪寻找顶点属性,而且这些都是在相对缓慢的CPU到GPU总线(CPU to GPU Bus)上进行的)。即便渲染顶点非常快,**命令GPU**去渲染却未必。原创 2023-06-03 23:11:47 · 913 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-9.几何着色器
# 几何着色器- 简介 - 在顶点和片段着色器之间有一个**可选**的几何着色器 - 几何着色器的输入是一个图元(如点或三角形)的一组顶点。 - 几何着色器可以在顶点发送到下一着色器阶段之前对它们**随意变换**原创 2023-06-03 23:08:03 · 1045 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-8.高级GLSL
我们将会讨论一些有趣的**内建变量**(Built-in Variable),管理着色器输入和输出的新方式以及一个叫做**Uniform缓冲对象**(Uniform Buffer Object)的有用工具。原创 2023-06-03 23:01:35 · 904 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-7.高级数据
- 介绍的API小结 - glBufferSubData - glMapBuffer得到指针 memcpy();// 复制数据到内存 - glCopyBufferSubData原创 2023-06-03 22:57:55 · 840 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-6.天空盒
立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。原创 2023-03-16 21:02:40 · 2696 阅读 · 4 评论 -
LearnOpenGL-高级OpenGL-5.帧缓冲
GLFW有提供默认的帧缓冲,我们可以自定义帧缓冲代替默认的帧缓冲,这样渲染的图像可以渲染到我们自定义帧缓冲上附加的纹理缓冲中,对我们自定义的帧缓冲,由于能获得**附加**的纹理缓冲,且这个纹理缓冲被填满绘制的颜色值,那我们可以将当前渲染的图像看做图像**纹理**,在fragment着色器阶段进行不同的纹理读取方式实现后期效果原创 2023-03-13 21:22:27 · 506 阅读 · 2 评论 -
LearnOpenGL-高级OpenGL-4.面剔除
OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些**背向**(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。 但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的**环绕顺序**(Winding Order)。原创 2023-03-13 21:19:30 · 488 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-3.混合
OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术- 透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度**结合**。- 一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。- 这也是混合这一名字的出处,我们**混合**(Blend)(不同物体的)**多**种颜色为**一**种颜色。所以透明度能让我们看原创 2023-03-13 21:19:34 · 609 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-2.模板测试
同深度测试一样有一个模板缓冲区,可以存储值,0-255值 。想象喷油漆时使用的**图案模板**,先把模板贴在汽车上或者其他什么地方,然后开始喷油漆。在模板镂空的地方会有油漆喷到汽车上,而没有镂空的地方会挡住油漆。在喷完之后,揭下模板,图案就喷涂在汽车上了原创 2023-03-12 21:04:34 · 575 阅读 · 0 评论 -
LearnOpenGL-高级OpenGL-1.深度测试
深度缓冲就像颜色缓冲(Color Buffer 储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着**一样**的宽度和高度 - 深度缓冲是由窗口系统**自动**创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。原创 2023-03-12 21:01:57 · 726 阅读 · 1 评论 -
LearnOpenGL-模型加载-3.渲染模型
本可以不用递归处理任何节点,渲染时只需要遍历场景对象的所有网格即可 - 为什么要递归处理网格 使用节点的最初想法是将网格之间定义一个**父子**关系。通过这样递归地遍历这层关系,我们就能将某个网格定义为另一个网格的父网格了。 - 例子 位移一个汽车的网格时,你可以保证它的所有子网格(比如引擎网格、方向盘网格、轮胎网格)都会随着一起位移。这样的系统能够用父子关系很容易地实现。原创 2023-03-11 20:42:41 · 611 阅读 · 3 评论 -
LearnOpenGL-模型加载-2.网格与自定义Mesh类
代码// 顶点位置 glEnableVertexAttribArray(0);// 顶点法线 glEnableVertexAttribArray(1);// 顶点纹理坐标 glEnableVertexAttribArray(2);说明能得到结构体的大小因为C++结构体有一个很棒的特性,它们的内存布局是连续的(Sequential)。将结构体作为一个数据数组使用,那么它将会以顺序排列结构体的变量,这将会直接转换为我们在数组缓冲中所需要的float(实际上是字节)数组。原创 2023-03-11 20:40:42 · 599 阅读 · 0 评论 -
LearnOpenGL-模型加载-1.Assimp介绍与添加到VS项目中
引入3D建模工具(3D Modeling Tool)可以让艺术家创建复杂的形状,并使用一种叫做UV映射(uv-mapping)的手段来应用贴图。这些工具将会在导出到模型文件的时候自动生成所有的顶点坐标、顶点法线以及纹理坐标。需要读取这些工具导出的模型文件模型的文件格式有很多种,每一种都会以它们自己的方式来导出模型数据,自己写很麻烦。有Assimp库专门处理。原创 2023-03-11 20:41:20 · 2000 阅读 · 0 评论 -
LearnOpenGL-光照-6.多光源
此节目的综合2.5投光物,在此节实现一个场景使用多个光源,物体根据不同光源而叠加颜色。熟悉多光源如何计算物体颜色熟悉用glsl函数。原创 2023-03-11 20:38:47 · 414 阅读 · 0 评论 -
LearnOpenGL-光照-5.投光物
这里需要定义平行光的方向**向下**,才符合太阳的光照照射(指向)方向,所以计算漫反射和镜面光强度的时候需要**取反**得到光源的方向向量。- 简介 当我们使用一个假设光源处于**无限**远处的模型时,它就被称为**定向光**,因为它的所有光线都有着**相同**的方向,它与**光源的位置是没有关系**的。原创 2023-03-10 20:31:51 · 817 阅读 · 0 评论 -
LearnOpenGL-光照-4.光照贴图
上节手动定义了物体的材质,即设置了环境光、漫反射光、镜面光照颜色分量而这节用光照贴图代替手动定义材质,从光照贴图中读取三种光照的颜色分量。光照贴图等同纹理,只不过在光照场景下,纹理被称为光照贴图。光照贴图包含漫反射贴图镜面光贴图。原创 2023-03-09 18:03:43 · 680 阅读 · 1 评论 -
LearnOpenGL-光照-3.材质
比如说:在阳光下,树叶是绿色的,并不是树叶发出了绿色的光,而是树叶吸收了其他颜色的光,反射绿色的光。 剥离掉树叶这种物质,提取出树叶对光“处理”的特性,这就叫树叶材质。 - 更详细说明 一般我们使用 漫反射光、镜面反射光、光泽度等属性,来定义一种材质,其实我不喜欢这样的称呼,我更喜欢称作 漫反射率, 镜面反射率。 比如:树叶的漫反射率(0.54, 0.89, 0.63), 可以这么理解, 树叶可以反射光照中: 54%的红色光,89%的绿色光,63%的蓝色光,原创 2023-03-08 21:19:55 · 389 阅读 · 2 评论 -
LearnOpenGL-光照-2.基础光照
问题引出当前片段着色器里的计算都是在世界空间坐标中进行,所以将法向量、顶点位置从顶点着色器传到了片段着色器,顶点位置使用了model矩阵转为世界空间的坐标,但是法向量没有转!如何转法向量为世界空间不完全正确法线乘以一个模型矩阵,模型model矩阵包含平移、旋转、缩放解释法向量只是一个方向向量,不能表达空间中的特定位置法向量没有齐次坐标(顶点位置中的w分量)这意味着,位移不应该影响到法向量,Model矩阵有位移且乘了法线就不正确那该如何做若乘以一个模型矩阵。原创 2023-03-08 21:17:45 · 544 阅读 · 0 评论 -
LearnOpenGL-光照-1.颜色
我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它**所反射的(Reflected)颜色**。 那些**不能**被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色原创 2023-03-08 21:15:43 · 318 阅读 · 0 评论 -
LearnOpenGL-入门-9.摄像机
OpenGL本身没有**摄像机**(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种**我们**在移动的感觉,而不是场景在移动。原创 2023-03-07 21:15:26 · 1147 阅读 · 0 评论 -
LearnOpenGL-入门-8.坐标系统
局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标局部坐标通过Model矩阵变换为世界空间坐标,这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放。观察空间坐标,通过view矩阵将世界空间转换到观察空间,使得每个坐标都是从摄像机或者说观察者的角度进行观察的。裁剪坐标,通过投影矩阵从观察空间到裁剪空间,裁剪坐标会被处理(透视除法)至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。视口变换。原创 2023-02-28 11:09:00 · 901 阅读 · 0 评论 -
LearnOpenGL-入门-7.变换
此节简要记些比较重要的基础数学背景,更完整内容请看LearnOpenGL官网。变换 有两种方式改变物体的位置 在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动 使用(多个)矩阵(Matrix)对象可以更好的变换(Transform)一个物体原创 2023-02-28 10:58:31 · 789 阅读 · 0 评论 -
LearnOpenGL-入门-6.纹理
纹理简介:若给每个顶点添加颜色来增加图形的细节,会增加开销,所以用纹理。纹理是一个2D图片,可以认为纹理附在物体表面上,其实是根据当前片段的uv值,采样纹理- 的颜色值作为当前片段的颜色。原创 2023-02-26 16:02:48 · 1612 阅读 · 0 评论 -
LearnOpenGL-入门-5.着色器
- 简介 - 着色器(Shader)是运行在GPU上的小程序,分别对应渲染管理不同阶段。 - 着色器是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。原创 2023-02-26 15:54:13 · 677 阅读 · 0 评论 -
LearnOpenGL-入门-4.你好,三角形
功能将3D坐标变为2D坐标将2D坐标转换为实际的有颜色的像素图形渲染管线与着色器图形渲染管线分为多个阶段,多个阶段对应多个自己特定的函数(小程序),在各自特定的函数可并行执行调用显卡的成千上万的核心,这些小程序被称为着色器。原创 2023-02-26 15:49:23 · 608 阅读 · 0 评论