![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OpenGL学习笔记
疯丶
这个作者很懒,什么都没留下…
展开
-
OpenGL学习笔记(四十七)
目录辐射度的 HDR 文件格式辐射度的 HDR 文件格式谈及辐射度的文件格式,辐射度文件的格式(扩展名为 .hdr)存储了一张完整的立方体贴图,所有六个面数据都是浮点数,允许指定 0.0 到 1.0 范围之外的颜色值,以使光线具有正确的颜色强度。这个文件格式使用了一个聪明的技巧来存储每个浮点值:它并非直接存储每个通道的 32 位数据,而是每个通道存储 8 位,再以 alpha 通道存放指数——虽然确实会导致精度损失,但是非常有效率,不过需要解析程序将每种颜色重新转换为它们的浮点数等效值。下面是一个示例原创 2021-07-31 17:09:37 · 435 阅读 · 0 评论 -
OpenGL学习笔记(四十六)
目录PBR 和 HDRPBR 和 HDR在 PBR 渲染管线中考虑高动态范围(High Dynamic Range, HDR)的场景光照非常重要。由于 PBR 的大部分输入基于实际物理属性和测量,因此为入射光值找到其物理等效值是很重要的。无论我们是对光线的辐射通量进行研究性猜测,还是使用它们的直接物理等效值,诸如一个简单灯泡和太阳之间的这种差异都是很重要的,如果不在 HDR 渲染环境中工作,就无法正确指定每个光的相对强度。因此,PBR 和 HDR 需要密切合作,但这些与基于图像的光照有什么关系?我们在原创 2021-07-31 17:08:26 · 170 阅读 · 0 评论 -
OpenGL学习笔记(四十五)
目录漫反射辐照度漫反射辐照度基于图像的光照(Image based lighting, IBL)是一类光照技术的集合。其光源不是如前一节教程中描述的可分解的直接光源,而是将周围环境整体视为一个大光源。IBL 通常使用(取自现实世界或从3D场景生成的)环境立方体贴图 (Cubemap) ,我们可以将立方体贴图的每个像素视为光源,在渲染方程中直接使用它。这种方式可以有效地捕捉环境的全局光照和氛围,使物体更好地融入其环境。由于基于图像的光照算法会捕捉部分甚至全部的环境光照,通常认为它是一种更精确的环境光照输原创 2021-07-31 17:07:28 · 70 阅读 · 0 评论 -
OpenGL学习笔记(四十四)
目录PBR材质PBR材质PBR渲染管线所需要的每一个表面参数都可以用纹理来定义或者建模。使用纹理可以让我们逐个片段的来控制每个表面上特定的点对于光线是如何响应的:不论那个点是金属的,粗糙或者平滑,也不论表面对于不同波长的光会有如何的反应。PBR渲染管线当中经常会碰到的纹理列表,还有将它们输入PBR渲染器所能得到的相应的视觉输出:上边的几种纹理代表了不同的物理含义,组合起来就组成了更逼真的效果。反照率:反照率(Albedo)纹理为每一个金属的纹素(Texel)(纹理像素)指定表面颜色或者基础反射率原创 2021-07-31 17:03:14 · 169 阅读 · 0 评论 -
OpenGL学习笔记(四十三)
目录BRDFBRDF判断一种PBR光照模型是否是基于物理的,必须满足的条件之三就是BRDF。什么是BRDF呢?BRDF,或者说双向反射分布函数,它接受入射(光)方向ωi,出射(观察)方向ωo,平面法线n以及一个用来表示微平面粗糙程度的参数a作为函数的输入参数。BRDF可以近似的求出每束光线对一个给定了材质属性的平面上最终反射出来的光线所作出的贡献程度。举例来说,如果一个平面拥有完全光滑的表面(比如镜面),那么对于所有的入射光线ωi(除了一束以外)而言BRDF函数都会返回0.0 ,只有一束与出射光线ωo原创 2021-06-29 00:21:37 · 197 阅读 · 0 评论 -
OpenGL学习笔记(四十二)
目录能量守恒能量守恒接下来说一说,判断一种PBR光照模型是否是基于物理的,必须满足的条件之二,就是能量守恒。微平面近似法使用了这样一种形式的能量守恒(Energy Conservation):出射光线的能量永远不能超过入射光线的能量(发光面除外)。随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降。如果不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。这也就是为什么光滑平面的镜面原创 2021-06-29 00:16:53 · 74 阅读 · 0 评论 -
OpenGL学习笔记(四十一)
目录微平面模型微平面模型上一节说到,判断一种PBR光照模型是否是基于物理的,必须满足的条件之一就是基于微平面(Microfacet)的表面模型,所有的PBR技术都基于微平面理论。这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致,产生的效果就是:一个平面越是粗糙,这个平面上的微平面的排列就越混乱。这些微小镜面这样无序取向排列的影响就是,当我们特指镜面光/镜面反射时,入射光线更趋向于向完全不原创 2021-06-29 00:11:06 · 110 阅读 · 0 评论 -
OpenGL学习笔记(四十)
目录PBR简介PBR简介PBR是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模拟光线,因此这种渲染方式与Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些。除了看起来更好些以外,由于它与物理性质非常接近,因此我们可以直接以物理参数为依据来编写表面材质,而不必依靠粗劣的修改与调整来让光照效果看上去正常原创 2021-06-29 00:04:43 · 71 阅读 · 0 评论 -
OpenGL学习笔记(三十九)
目录结合延迟渲染与正向渲染结合延迟渲染与正向渲染现在我们想要渲染每一个光源为一个3D立方体,并放置在光源的位置上随着延迟渲染器一起发出光源的颜色。很明显,我们需要做的第一件事就是在延迟渲染方形之上正向渲染所有的光源,它会在延迟渲染管线的最后进行。所以我们只需要像正常情况下渲染立方体,只是会在我们完成延迟渲染操作之后进行。...原创 2021-05-30 18:15:25 · 77 阅读 · 0 评论 -
OpenGL学习笔记(三十八)
目录G缓冲G缓冲G缓冲(G-buffer)是对所有用来储存光照相关的数据,并在最后的光照处理阶段中使用的所有纹理的总称。趁此机会,让我们顺便复习一下在正向渲染中照亮一个片段所需要的所有数据:一个3D位置向量来计算(插值)片段位置变量供lightDir和viewDir使用一个RGB漫反射颜色向量,也就是反照率(Albedo)一个3D法向量来判断平面的斜率一个镜面强度(Specular Intensity)浮点值所有光源的位置和颜色向量玩家或者观察者的位置向量...原创 2021-05-30 18:14:14 · 79 阅读 · 0 评论 -
OpenGL学习笔记(三十七)
目录几何处理与光照处理几何处理与光照处理延迟着色法基于我们延迟(Defer)或推迟(Postpone)大部分计算量非常大的渲染(像是光照)到后期进行处理的想法。它包含两个处理阶段(Pass):在第一个几何处理阶段(Geometry Pass)中,我们先渲染场景一次,之后获取对象的各种几何信息,并储存在一系列叫做G缓冲(G-buffer)的纹理中;想想位置向量(Position Vector)、颜色向量(Color Vector)、法向量(Normal Vector)和/或镜面值(Specular Val原创 2021-05-30 18:13:16 · 115 阅读 · 0 评论 -
OpenGL学习笔记(三十六)
目录延迟着色法延迟着色法正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常容易理解,也很容易实现,但是同时它对程序性能的影响也很大,因为对于每一个需要渲染的物体,程序都要对每一个光源每一个需要渲染的片段进行迭代,这是非常多的!因为大部分片段着色器的输出都会被之后的输出覆盖,正向渲染还会在场景中因为高深的复杂度(多个物体重合在一个像素上)浪费大量的原创 2021-05-30 18:11:05 · 62 阅读 · 0 评论 -
OpenGL学习笔记(三十五)
目录能量守恒能量守恒微平面近似法使用了这样一种形式的能量守恒(Energy Conservation):出射光线的能量永远不能超过入射光线的能量(发光面除外)。如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降。如果不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。这也就是为什么正如我们看到的一样,光滑平面的镜面反射更强烈而粗糙平面的反射更昏暗。为了遵守能量守原创 2021-04-30 13:28:52 · 83 阅读 · 1 评论 -
OpenGL学习笔记(三十四)
目录微平面模型微平面模型所有的PBR技术都基于微平面理论。这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致。产生的效果就是:一个平面越是粗糙,这个平面上的微平面的排列就越混乱。这些微小镜面这样无序取向排列的影响就是,当我们特指镜面光/镜面反射时,入射光线更趋向于向完全不同的方向发散(Scatter)开来,进而产生出分布范围更广泛的镜面反射。而与之相反的是,对于一个光滑的平面,光线大体上原创 2021-04-30 13:28:12 · 63 阅读 · 0 评论 -
OpenGL学习笔记(三十三)
目录PBRPBRPBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模拟光线,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些。除了看起来更好些以外,由于它与物理性质非常接近,因此我们(尤其是美术师们)可以直接以物理参数为依据来编写表面材质,而不必原创 2021-04-30 13:27:12 · 88 阅读 · 0 评论 -
OpenGL学习笔记(三十二)
目录模板缓冲的应用-物体轮廓模板缓冲的应用-物体轮廓物体轮廓所能做的事情正如它名字所描述的那样。我们将会为每个(或者一个)物体在它的周围创建一个很小的有色边框。当你想要在策略游戏中选中一个单位进行操作的,想要告诉玩家选中的是哪个单位的时候,这个效果就非常有用了。为物体创建轮廓的步骤如下:在绘制(需要添加轮廓的)物体之前,将模板函数设置为GL_ALWAYS,每当物体的片段被渲染时,将模板缓冲更新为1。渲染物体。禁用模板写入以及深度测试。将每个物体缩放一点点。使用一个不同的片段着色器,输出一个单原创 2021-03-30 22:16:33 · 102 阅读 · 0 评论 -
OpenGL学习笔记(三十一)
目录模板测试相关gl命令模板测试相关gl命令glEnable(GL_STENCIL_TEST);glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)glStencilFunc(GL_EQUAL, 1, 0xFF)...原创 2021-03-30 22:14:38 · 82 阅读 · 0 评论 -
OpenGL学习笔记(三十)
目录模板缓冲写入模板缓冲写入模板缓冲操作允许我们在渲染片段时将模板缓冲设定为一个特定的值。通过在渲染时修改模板缓冲的内容,我们写入了模板缓冲。在同一个(或者接下来的)渲染迭代中,我们可以读取这些值,来决定丢弃还是保留某个片段。使用模板缓冲的时候你可以尽情发挥,但大体的步骤如下:启用模板缓冲的写入。渲染物体,更新模板缓冲的内容。禁用模板缓冲的写入。渲染(其它)物体,这次根据模板缓冲的内容丢弃特定的片段。...原创 2021-03-30 22:12:53 · 71 阅读 · 0 评论 -
OpenGL学习笔记(二十九)
目录模板测试模板测试当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer)。...原创 2021-03-30 22:11:08 · 65 阅读 · 0 评论 -
OpenGL学习笔记(二十八)
目录面剔除面剔除一个3D立方体,从任何一个方向去看它,最多可以同时看到的面是3个。可以从一个立方体的任意位置和方向上去看它,但是永远不能看到多于3个面。所以为何还要去绘制那三个不会显示出来的3个面呢。如果可以以某种方式丢弃它们,会提高片段着色器超过50%的性能,这就是面剔除要做的事情。...原创 2021-02-28 19:17:44 · 195 阅读 · 0 评论 -
OpenGL学习笔记(二十七)
目录混合混合在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。一个有色玻璃窗就是一种透明物体,玻璃有自身的颜色,但是最终的颜色包含了所有玻璃后面的颜色。这也正是混合这名称的出处,因为我们将多种(来自于不同物体)颜色混合为一个颜色,透明使得我们可以看穿物体。...原创 2021-02-28 19:16:16 · 93 阅读 · 0 评论 -
OpenGL学习笔记(二十六)
目录模板测试模板测试当片段着色器处理完片段之后,模板测试(Stencil Test) 就开始执行了,和深度测试一样,它能丢弃一些片段。仍然保留下来的片段进入深度测试阶段,深度测试可能丢弃更多。模板测试基于另一个缓冲,这个缓冲叫做模板缓冲(Stencil Buffer),我们被允许在渲染时更新它来获取有意思的效果。模板缓冲中的模板值(Stencil Value)通常是8位的,因此每个片段/像素共有256种不同的模板值(译注:8位就是1字节大小,因此和char的容量一样是256个不同值)。这样我们就能将这原创 2021-02-28 19:15:25 · 87 阅读 · 0 评论 -
OpenGL学习笔记(二十五)
目录EarlyZEarlyZ现在大多数 GPU 都支持一种称为提前深度测试(Early depth testing)的硬件功能。提前深度测试允许深度测试在片段着色器之前运行。明确一个片段永远不会可见的 (它是其它物体的后面) 。片段着色器通常是相当费时的所以应该尽量避免运行。对片段着色器提前深度测试一个限制是,你不应该写入片段的深度值。如果片段着色器将写入其深度值,提前深度测试是不可能的,OpenGL不能事先知道深度值。...原创 2021-02-28 19:14:02 · 99 阅读 · 0 评论 -
OpenGL学习笔记(二十四)
目录光照贴图光照贴图我们将一个物体自身作为一个整体为其定义了一个材质,但是现实世界的物体通常不会只有这么一种材质,而是由多种材质组成。想象一辆车:它的外表质地光亮,车窗会部分反射环境,它的轮胎没有specular高光,轮彀却非常闪亮(在洗过之后)。汽车同样有diffuse和ambient颜色,它们在整个车上都不相同;一辆车显示了多种不同的ambient/diffuse颜色。总之,这样一个物体每个部分都有多种材质属性。...原创 2021-01-31 21:16:10 · 118 阅读 · 0 评论 -
OpenGL学习笔记(二十三)
目录颜色颜色现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们要做的工作是使用(有限的)数字来模拟真实世界中(无限)的颜色,因此并不是所有的现实世界中的颜色都可以用数字来表示。然而我们依然可以用数字来代表许多种颜色,并且你甚至可能根本感觉不到他们与真实颜色之间的差异。颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB。这三个不同的分量组合在一起几乎可以表示存在的任何一种颜色。...原创 2021-01-31 21:16:02 · 71 阅读 · 0 评论 -
OpenGL学习笔记(二十二)
目录光照光照现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的光照仅仅使用了简化的模型并基于对现实的估计来进行模拟,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个元素组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。...原创 2021-01-31 21:15:52 · 74 阅读 · 0 评论 -
OpenGL学习笔记(二十一)
目录材质材质在真实世界里,每个物体会对光产生不同的反应。钢看起来比陶瓷花瓶更闪闪发光,一个木头箱子不会像钢箱子一样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体不会散射(Scatter)很多光却会反射(Reflect)很多光,结果看起来就有一个较小的高光点(Highlight),有些物体散射了很多,它们就会产生一个半径更大的高光。如果我们想要在OpenGL中模拟多种类型的物体,我们必须为每个物体分别定义材质(Material)属性。...原创 2021-01-31 21:15:44 · 83 阅读 · 0 评论 -
OpenGL学习笔记(二十)
目录深度缓冲的可视化深度缓冲的可视化片段着色器中,内建gl_FragCoord向量的z值包含了那个特定片段的深度值。如果我们将这个深度值输出为颜色,就可以显示场景中所有片段的深度值。我们可以根据片段的深度值返回一个颜色向量来完成这一工作:void main(){FragColor = vec4(vec3(gl_FragCoord.z), 1.0);}如果运行程序的话,会注意到所有东西都是白色的,看起来就像所有的深度值都是最大的1.0。所以为什么没有靠近0.0(即变暗)的深度值呢?你可能还记得原创 2020-08-31 16:33:31 · 241 阅读 · 0 评论 -
OpenGL学习笔记(十九)
目录深度值精度深度值精度深度缓冲包含了一个介于0.0和1.0之间的深度值,它将会与观察者视角所看见的场景中所有物体的z值进行比较。观察空间的z值可能是投影平截头体的近平面(Near)和远平面(Far)之间的任何值。我们需要一种方式来将这些观察空间的z值变换到[0, 1]范围之间,其中的一种方式就是将它们线性变换到[0, 1]范围之间。下面这个(线性)方程将z值变换到了0.0到1.0之间的深度值:depth=(z−near)/(far−near)这里的near和far值就是提供给投影矩阵设置可视平截头原创 2020-08-31 16:32:53 · 149 阅读 · 0 评论 -
OpenGL学习笔记(十八)
目录深度测试函数深度测试函数OpenGL允许我们修改深度测试中使用的比较运算符。这允许我们来控制OpenGL什么时候该通过或丢弃一个片段,什么时候去更新深度缓冲。我们可以调用glDepthFunc函数来设置比较运算符(或者说深度函数(Depth Function)):glDepthFunc(GL_LESS);这个函数接受下面的比较运算符:GL_ALWAYS 永远通过深度测试GL_NEVER 永远不通过深度测试GL_LESS 在片段深度值小于缓冲的深度值时通过测试GL_EQUAL 在片段深度值原创 2020-08-31 16:32:18 · 188 阅读 · 0 评论 -
OpenGL学习笔记(十七)
目录深度测试深度测试运用了深度缓冲(Depth Buffer),或z缓冲(z-buffer),可以防止被阻挡的面渲染到其它面的前面。深度缓冲就像颜色缓冲(Color Buffer)一样,在每个片段中储存了信息,并且和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。当深度测试(Depth Testing)被启用时,OpenGL会将一个片段的的深度值与深度缓冲的内容进行对比。OpenGL会原创 2020-08-31 16:30:08 · 124 阅读 · 0 评论 -
OpenGL学习笔记(十六)
目录纹理单元纹理单元你可能会奇怪为什么sampler2D变量是个uniform,我们却不用glUniform给它赋值。使用glUniform1i,我们可以给纹理采样器分配一个位置值,这样的话我们能够在一个片段着色器中设置多个纹理。一个纹理的位置值通常称为一个纹理单元(Texture Unit)。一个纹理的默认纹理单元是0,它是默认的激活纹理单元,所以教程前面部分我们没有分配一个位置值。纹理单元的主要目的是让我们在着色器中可以使用多于一个的纹理。通过把纹理单元赋值给采样器,我们可以一次绑定多个纹理,只要原创 2020-07-31 22:59:59 · 225 阅读 · 0 评论 -
OpenGL学习笔记(十五)
目录应用纹理应用纹理我们需要告知OpenGL如何采样纹理,所以我们必须使用纹理坐标更新顶点数据:float vertices[] = {// ---- 位置 ---- ---- 颜色 ---- - 纹理坐标 -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // 右上0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // 右下-0.5f, -0.原创 2020-07-31 22:58:59 · 227 阅读 · 0 评论 -
OpenGL学习笔记(十四)
目录生成纹理生成纹理和之前生成的OpenGL对象一样,纹理也是使用ID引用的。让我们来创建一个:unsigned int texture;glGenTextures(1, &texture);glGenTextures函数首先需要输入生成纹理的数量,然后把它们储存在第二个参数的unsigned int数组中(我们的例子中只是单独的一个unsigned int),就像其他对象一样,我们需要绑定它,让之后任何的纹理指令都可以配置当前绑定的纹理:glBindTexture(GL_TEXTURE原创 2020-07-31 22:57:47 · 120 阅读 · 0 评论 -
OpenGL学习笔记(十三)
目录纹理纹理环绕方式(Texture Wrapping)纹理过滤(Texture Filtering)多级渐远纹理(Mipmap)纹理我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。所以引入纹理(Texture)的概念。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理原创 2020-07-31 22:56:32 · 257 阅读 · 0 评论 -
OpenGL学习笔记(十二)
目录纹理纹理环绕方式(Texture Wrapping)纹理过滤(Texture Filtering)多级渐远纹理(Mipmap)纹理我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。所以引入纹理(Texture)的概念。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理原创 2020-06-30 01:03:16 · 320 阅读 · 0 评论 -
OpenGL学习笔记(十一)
目录着色器GLSL输入与输出Uniform着色器着色器(Shader)是运行在GPU上的小程序,这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。GLSL着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着原创 2020-06-30 00:45:42 · 171 阅读 · 0 评论 -
OpenGL学习笔记(十)
目录索引缓冲对象索引缓冲对象索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)。假设我们不再绘制一个三角形而是绘制一个矩形。我们可以绘制两个三角形来组成一个矩形(OpenGL主要处理三角形)。这会生成下面的顶点的集合:float vertices[] = { // 第一个三角形 0.5f, 0.5f, 0.0f, // 右上角 0.5f, -0.5f, 0.0f, // 右下角 -0.5f, 0原创 2020-06-30 00:34:25 · 169 阅读 · 0 评论 -
OpenGL学习笔记(九)
绘制一个三角形绘制函数完整代码执行结果绘制函数OpenGL的绘制函数为glDrawArrays,它使用当前激活的着色器,之前定义的顶点属性配置,和VBO的顶点数据(通过VAO间接绑定)来绘制图元:glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glDrawArrays函数说明:第一个参数是OpenGL图元的类型。绘制三角形,参数就是GL_TRIANGLES。第二个参数指原创 2020-05-31 16:20:48 · 322 阅读 · 0 评论 -
OpenGL学习笔记(八)
顶点数组对象为什么引入顶点数组对象顶点数组对象创建顶点数组对象为什么引入顶点数组对象在OpenGL中绘制一个物体,代码会像是这样:// 0. 复制顶点数组到缓冲中供OpenGL使用glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 1. 设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT原创 2020-05-31 16:10:40 · 205 阅读 · 0 评论