
opengl
文章平均质量分 94
RuntimeCube
这个作者很懒,什么都没留下…
展开
-
[OpengGL] 网格Mesh[18]
使用 Assimp,我们可以将许多不同的模型加载到应用程序中,但是一旦加载,它们就会全部存储在 Assimp 的数据结构中。我们最终想要的是将该数据转换为 OpenGL 可以理解的格式,以便我们可以渲染对象。我们从上一章中了解到网格表示单个可绘制实体,所以让我们从定义我们自己的网格类开始。让我们回顾一下到目前为止我们学到的一些知识,以考虑网格至少应包含哪些数据。翻译 2023-01-02 14:45:47 · 253 阅读 · 0 评论 -
[OpengGL] 模型加载库Assimp[17]
到目前为止,在所有场景中,我们一直在和我们的容器小朋友一起玩,但随着时间的推移,即使是我们最好的朋友也会变得有点无聊。在更大的图形应用程序中,通常有许多复杂而有趣的模型,它们看起来比静态容器漂亮得多。然而,与容器对象不同的是,我们无法真正手动定义复杂形状(如房屋、车辆或类人角色)的所有顶点、法线和纹理坐标。相反,我们想要的是将这些模型导入到应用程序中;翻译 2023-01-02 12:08:15 · 896 阅读 · 0 评论 -
[OpengGL] 多灯光[16]
在前面的章节中,我们学到了很多关于 OpenGL 光照的知识。我们了解了 Phong 着色、材质、光照贴图和不同类型的光投射器。在本章中,我们将通过创建一个具有 6 个活动光源的全光照场景来结合之前获得的所有知识。我们将模拟一个类似太阳的光作为定向光源,4 个点光源散布在整个场景中,我们还将添加一个手电筒。为了在场景中使用多个光源,我们希望将光照计算封装到 GLSL 函数中。翻译 2022-12-22 20:59:45 · 291 阅读 · 0 评论 -
[OpengGL] 灯光投射[15]
到目前为止,我们使用的所有照明都来自一个单一的光源,即空间中的一个点。它给出了很好的结果,但在现实世界中,我们有几种类型的光,每种光的作用都不同。将光投射到物体上的光源称为投光器。在本章中,我们将讨论几种不同类型的光投射器。学习模拟不同的光源是您工具箱中的另一个工具,可以进一步丰富您的环境。我们将首先讨论定向光,然后是点光源,它是我们之前的扩展,最后我们将讨论聚光灯。翻译 2022-12-22 20:38:09 · 266 阅读 · 0 评论 -
[OpengGL] 光照贴图[14]
在上一章中,我们讨论了每个物体都有自己独特的材料的可能性,这种材料对光的反应不同。与其他对象相比,这为每个对象提供了独特的外观,但在对象的视觉输出上仍然没有提供太多的灵活性。在上一章中,我们为整个对象定义了一个材质。然而,现实世界中的物体通常不是由单一材料组成,而是由多种材料组成。翻译 2022-12-21 09:31:33 · 201 阅读 · 0 评论 -
[OpengGL] 材质[13]
在现实世界中,每个物体对光都有不同的反应。例如,钢制物品通常比粘土花瓶更闪亮,而木制容器对光的反应与钢制容器不同。一些物体反射光而没有太多散射,导致镜面高光较小,而其他物体散射很多,使高光半径更大。如果我们想在 OpenGL 中模拟多种类型的对象,我们必须定义每个表面特定的材料属性。在上一章中,我们定义了一个物体和光的颜色来定义物体的视觉输出,并结合了环境和镜面反射强度分量。翻译 2022-12-11 22:34:40 · 156 阅读 · 0 评论 -
[OpengGL] 基础照明[12]
在上一节中,我们将法线向量直接从顶点着色器传递到片段着色器。但是,片段着色器中的计算都是在世界空间中进行的,难道我们不应该将法向量也转换为世界空间坐标吗?基本上是的,但它不像简单地将它与模型矩阵相乘那么简单。首先,法向量只是方向向量,并不代表空间中的具体位置。其次,法向量没有齐次坐标(顶点位置的 w 分量)。这意味着平移不应该对法向量有任何影响。翻译 2022-12-11 21:55:37 · 265 阅读 · 0 评论 -
[OpengGL] 颜色[11]
我们在前面的章节中简要地使用和操作了颜色,但从未正确定义它们。 在这里,我们将讨论什么是颜色,并开始为即将到来的光照章节构建场景。 在现实世界中,颜色可以采用任何已知的颜色值,每个对象都有自己的颜色。 在数字世界中,我们需要将(无限)真实颜色映射到(有限)数字值,因此并非所有真实世界的颜色都可以数字表示。 使用通常缩写为 RGB 的红色、绿色和蓝色分量以数字方式表示颜色。 使用这 3 个值的不同组合,在 [0,1] 范围内,我们几乎可以表示任何颜色。 例如,要获得珊瑚色,我们将颜色向量定义为: 我翻译 2022-12-07 23:00:12 · 133 阅读 · 0 评论 -
[OpengGL] 摄像机[10]
在上一章中,我们讨论了视图矩阵以及如何使用视图矩阵在场景中移动(我们向后移动了一点)。 OpenGL 本身并不熟悉相机的概念,但我们可以尝试通过反向移动场景中的所有对象来模拟一个相机,给人一种我们正在移动的错觉。 在本章中,我们将讨论如何在 OpenGL 中设置相机。 我们将讨论一种可让您在 3D 场景中自由移动的飞行式相机。 我们还将讨论键盘和鼠标输入,并以自定义相机类结束。 当我们谈论相机/观察空间时,我们谈论的是从相机的角度看作为场景原点的所有顶点坐标:视图矩阵将所有世界坐标转换为相对于相机位翻译 2022-12-07 22:15:53 · 634 阅读 · 0 评论 -
[OpengGL] 坐标系[9]
在上一章中,我们学习了如何通过使用变换矩阵变换所有顶点来利用矩阵来发挥我们的优势。 OpenGL 期望我们想要变得可见的所有顶点在每个顶点着色器运行后都处于规范化的设备坐标中。 即每个顶点的x、y、z坐标应在-1.0到1.0之间; 超出此范围的坐标将不可见。 我们通常做的是在我们自己确定的范围(或空间)中指定坐标,并在顶点着色器中将这些坐标转换为归一化设备坐标 (NDC)。 然后将这些 NDC 提供给光栅化器以将它们转换为屏幕上的 2D 坐标/像素。 将坐标转换为 NDC 通常以分步方式完成,在最终将翻译 2022-12-06 22:27:24 · 487 阅读 · 0 评论 -
[OpengGL] 变换(Transformations)[8]
我们现在知道如何创建对象、为它们着色和/或使用纹理赋予它们详细的外观,但它们仍然不是那么有趣,因为它们都是静态对象。 我们可以尝试通过改变它们的顶点并在每一帧重新配置它们的缓冲区来让它们移动,但这很麻烦并且需要相当多的处理能力。 有很多更好的方法来转换对象,那就是使用(多个)矩阵对象。 这并不意味着我们要谈论功夫和大型数字人工世界。 矩阵是非常强大的数学结构,起初看起来很吓人,但一旦您习惯了它们,就会证明它们非常有用。 在讨论矩阵时,我们必须深入研究一些数学知识,对于更喜欢数学的读者,我将发布更多资源翻译 2022-12-04 22:08:06 · 173 阅读 · 0 评论 -
[OpengGL] 贴图[7]
我们了解到,为了给我们的物体增加更多的细节,我们可以为每个顶点使用颜色来创造一些有趣的图像。然而,为了获得相当程度的真实感,我们必须要有很多顶点,这样我们就可以指定很多颜色。这需要相当多的额外开销,因为每个模型需要更多的顶点,每个顶点也需要一个颜色属性。 艺术家和程序员一般喜欢的是使用纹理。纹理是一种二维图像(甚至存在一维和三维纹理),用来给物体增加细节;把纹理想象成一张纸,上面有一个漂亮的砖头图像(例如),整齐地叠在你的三维房子上,这样看起来你的房子就有一个石头的外表。因为我们可以在一张图片中插入大翻译 2022-12-04 11:56:31 · 667 阅读 · 0 评论 -
[OpengGL] shader[6]
正如在Hello Triangle章节中提到的,着色器是停留在GPU上的小程序。这些程序为图形管道的每个特定部分运行。从基本意义上讲,着色器只不过是将输入转化为输出的程序。着色器也是非常孤立的程序,因为它们不允许相互交流;它们唯一的交流是通过其输入和输出。在上一章中,我们简单地接触了着色器的表面,以及如何正确使用它们。现在我们将对着色器,特别是OpenGL着色语言,进行更全面的解释。翻译 2022-11-27 23:06:21 · 325 阅读 · 0 评论 -
[OpengGL] Hello三角形[5]
在OpenGL中,一切都在3D空间中,但屏幕或窗口是一个2D像素数组,所以OpenGL的大部分工作是将所有3D坐标转换为适合屏幕的2D像素。将3D坐标转换为2D像素的过程由OpenGL的图形管道管理。图形管道可以分为两个大部分:第一部分将3D坐标转换为2D坐标,第二部分将2D坐标转换为实际的彩色像素。在本章中,我们将简要讨论图形管道以及如何使用它来创建漂亮的像素。翻译 2022-11-27 21:08:28 · 216 阅读 · 0 评论 -
[OpengGL] Hello窗口[4]
一旦我们退出渲染循环,我们就会正确地清理/删除所有分配给GLFW的资源。我们可以通过在main函数末尾调用的glfwTerminate函数来实现这一点。return 0;这将清除所有资源并正确退出应用程序。现在尝试编译你的应用程序,如果一切正常,你应该看到以下输出:如果这是一个非常无聊的黑色图像,那么你的做法是正确的!如果你没有得到正确的图像,或者你不知道这一切是如何组合在一起的,请查看这里的完整源代码(如果它开始闪烁不同的颜色,请继续阅读)。翻译 2022-11-27 12:27:58 · 138 阅读 · 0 评论 -
[OpengGL] 创建一个窗口[3]
在我们开始创建令人惊叹的图形之前,我们需要做的第一件事是创建一个 OpenGL 上下文和一个要绘制的应用程序窗口。但是,这些操作是每个操作系统特定的,OpenGL 有目的地尝试从这些操作中抽象出来。这意味着我们必须自己创建一个窗口,定义一个上下文,并处理用户输入。幸运的是,有相当多的库可以提供我们寻求的功能,其中一些专门针对 OpenGL。翻译 2022-11-22 22:30:58 · 280 阅读 · 0 评论 -
[OpengGL] 介绍[2]
在开始我们的旅程之前,我们应该首先定义 OpenGL 实际上是什么。OpenGL 主要被认为是一种 API(应用程序编程接口),它为我们提供了大量可用于操作图形和图像的函数。然而,OpenGL 本身并不是一个 API,而仅仅是一个规范,由 Khronos Group 开发和维护。OpenGL 规范明确规定了每个函数的结果/输出应该是什么以及它应该如何执行。翻译 2022-11-22 21:55:37 · 270 阅读 · 0 评论 -
[OpengGL] 引言[1]
既然你来到这里,你可能想学习计算机图形的内部工作原理,并做所有的事情,酷孩子自己做所有的事情。自己做事情是非常有趣和机智的,并使你对图形编程有很大的了解。然而,在开始你的旅程之前,有几件事需要考虑。翻译 2022-11-22 21:33:13 · 83 阅读 · 0 评论