OPENGL
文章平均质量分 78
opengl
风物长宜放眼量~
程序媛,一直在精进的路上
展开
-
LearnOpenGL学习笔记——延迟着色法
我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading),它是我们渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。它非常容易理解,也很容易实现,但是同时它对程序性能的影响也很大,因为对于每一个需要渲染的物体,程序都要对每一个光源每一个需要渲染的片段进行迭代,这是非常多的!因为大部分片段着色器的输出都会被之后的输出覆盖,正向渲染还会在场景中因为高深的复杂度(多个物体重合在一个像素上)浪费大量原创 2022-08-16 00:26:50 · 361 阅读 · 0 评论 -
LearnOpenGL学习笔记——泛光
泛光 高斯模糊 多渲染目标转载 2022-06-05 23:07:00 · 473 阅读 · 0 评论 -
LearnOpenGL学习笔记——HDR
一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0~1.0之间的。但是如果我们遇上了一个特性的区域,其中有多个光源使这些数值综合超过了1.0,又会发生什么呢?答案是这些片段中超过1.0的亮度或者颜色会被约束在1.0,从而导致场景混成一片,难以分辨:这是由于大量片段的颜色值都非常接近1.0,在很大一个区域内每一个亮的片段都有相同的白色。这损失了很多的细节,使场景看起来非常假。解决这个问题的一个方案是减小光源的强度从而保证场景内没有一个片段亮于1.0。然而这并不是一个原创 2022-06-03 14:27:48 · 365 阅读 · 0 评论 -
LearnOpenGL学习笔记——视差贴图
视差贴图转载 2022-06-01 22:56:19 · 410 阅读 · 0 评论 -
LearnOpenGL学习笔记——法线贴图
法线贴图我们的场景中已经充满了多边形物体,其中每个都可能由成百上千平坦的三角形组成。我们以向三角形上附加纹理的方式来增加额外细节,提升真实感,隐藏多边形几何体是由无数三角形组成的事实。纹理确有助益,然而当你近看它们时,这个事实便隐藏不住了。现实中的物体表面并非是平坦的,而是表现出无数(凹凸不平的)细节。例如,砖块的表面。砖块的表面非常粗糙,显然不是完全平坦的:它包含着接缝处水泥凹痕,以及非常多的细小的空洞。如果我们在一个有光的场景中看这样一个砖块的表面,问题就出来了。下图中我们可以看到砖块纹理应用到了平转载 2022-05-28 00:02:34 · 704 阅读 · 0 评论 -
LearnOpenGL学习笔记——阴影
阴影阴影是光线遮挡的结果;当一个光源的光线由于其他物体的阻挡不能够达到一个物体表面的时候,那么这个物体就在阴影中了。阴影可以让场景更加真实阴影映射(Shadow Mapping)阴影映射(Shadow Mapping)背后的思路非常简单:我们以光的位置为视角进行渲染,我们能看到的东西都将被点亮,看不见的一定是在阴影之中了。假设有一个地板,在光源和它之间有一个大盒子。由于光源处向光线方向看去,可以看到这个盒子,但看不到地板的一部分,这部分就应该在阴影中了。在深度缓冲里的一个值是摄像机视角下,对应原创 2022-05-21 21:53:14 · 857 阅读 · 0 评论 -
LearnOpenGL学习笔记——Gamma校正
Gamma校正https://www.zhihu.com/question/27467127/answer/37602200https://learnopengl-cn.github.io/05%20Advanced%20Lighting/02%20Gamma%20Correction/原创 2022-05-16 22:57:24 · 139 阅读 · 0 评论 -
LearnOpenGL学习笔记——高级光照
Blinn-Phong冯氏光照不仅对真实光照有很好的近似,而且性能也很高。但是它的镜面反射会在一些情况下出现问题,特别是物体反光度很低时,会导致大片(粗糙的)高光区域。下面这张图展示了当反光度为1.0时地板会出现的效果:可以看到,在镜面高光区域的边缘出现了一道很明显的断层。出现这个问题的原因是观察向量和反射向量间的夹角不能大于90度。如果点积的结果为负数,镜面光分量会变为0.0。你可能会觉得,当光线与视线夹角大于90度时你应该不会接收到任何光才对,所以这不是什么问题。然而,这种想法仅仅只适用于漫反射原创 2022-05-16 22:31:52 · 205 阅读 · 0 评论 -
LearnOpenGL学习笔记——抗锯齿
如何开启抗锯齿原理见末尾链接glfwWindowHint(GLFW_SAMPLES, 4);glEnable(GL_MULTISAMPLE);// 一般默认是打开状态离屏MSAAhttps://learnopengl-cn.github.io/04%20Advanced%20OpenGL/11%20Anti%20Aliasing/原创 2022-05-14 15:13:13 · 451 阅读 · 0 评论 -
LearnOpenGL学习笔记——实例化
实例化假设你有一个绘制了很多模型的场景,而大部分的模型包含的是同一组顶点数据,只不过进行的是不同的世界空间变换。想象一个充满草的场景:每根草都是一个包含几个三角形的小模型。你可能会需要绘制很多根草,最终在每帧中你可能会需要渲染上千或者上万根草。因为每一根草仅仅是由几个三角形构成,渲染几乎是瞬间完成的,但上千个渲染函数调用却会极大地影响性能。如果我们需要渲染大量物体时,代码看起来会像这样: for(unsigned int i = 0; i < amount_of_models_to_draw; i原创 2022-05-12 00:49:05 · 247 阅读 · 0 评论 -
LearnOpenGL学习笔记——几何着色器
几何着色器在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。废话不多说,我们直接先看一个几何着色器的例子:#version 330 corelayout (points) in;layout (line_strip, max_vertices = 2)原创 2022-05-11 00:44:08 · 1145 阅读 · 0 评论 -
LearnOpenGL学习笔记——高级GLSL
顶点着色器变量gl_PointSize :可以设置渲染出来点的大小。使用 glEnable(GL_PROGRAM_POINT_SIZE);`开始启用点大小设置,点的大小会随着观察者距顶点距离变远而增大。 void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); gl_PointSize = gl_Position.z; }gl_VertexID:整型变量gl_Vert原创 2022-05-09 23:05:46 · 1834 阅读 · 0 评论 -
LearnOpenGL学习笔记——高级数据
高级数据我们在OpenGL中大量使用缓冲来存储数据已经有很长时间了。操作缓冲其实还有更有意思的方式,而且使用纹理将大量输出传入着色器也有更有趣的方法。这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理来存储大量的数据(纹理部分还没有完成)。OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地原创 2022-05-08 23:22:49 · 153 阅读 · 0 评论 -
LearnOpenGL学习笔记——立方体贴图
立方体贴图在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map)。简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样。假设我们有一个1x1x1的单位立方体,方向向量的原点位于它的中心。使用一个橘黄色的方向向量来从立方体贴原创 2022-05-08 12:36:31 · 594 阅读 · 0 评论 -
LearnOpenGL学习笔记——帧缓冲
帧缓冲用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。有了我们自己的帧缓冲,我们就能够有更多方式来渲染了。如何创建自己的帧缓冲: // 创建帧缓原创 2022-05-06 01:07:55 · 797 阅读 · 0 评论 -
LearnOpenGL学习笔记——面剔除
面剔除尝试在脑子中想象一个3D立方体,数数你从任意方向最多能同时看到几个面。如果你的想象力不是过于丰富了,你应该能得出最大的面数是3。你可以从任意位置和任意方向看向这个球体,但你永远不能看到3个以上的面。所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数!如果我们想象任何一个闭合形状,它的每一个面都有两侧,每一侧要么面向用户,要么背对用户。如果我们能够只绘制面向观察者的面呢?这正是面剔除(Face Culling)所原创 2022-05-03 15:41:31 · 234 阅读 · 1 评论 -
LearnOpenGL学习笔记——混合
混合(个人感觉叫透明度更好些)OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多种颜色为一种颜色。所以透明度能让我们看穿物体。也就是我们通常说的RGBA,A指的a原创 2022-05-03 11:02:00 · 867 阅读 · 0 评论 -
LearnOpenGL学习笔记——模板测试
模板测试当片段着色器处理完一个片段之后,模板测试(Stencil Buffer)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫模板缓冲(Stencil Buffer),我们可以在渲染的时候更新它来获得一些很有意思的效果。一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些模板值设置为我们想要的值,然后当某一个片段有某一个模原创 2022-05-02 23:07:14 · 598 阅读 · 0 评论 -
LearnOpenGL学习笔记——深度测试
什么是深度测试我们在绘制物体的时候,物体之间是有遮挡关系的。比如下图,箱子遮挡住地面。遮挡关系是由深度确定的。从视觉上来讲,可以简单的理解为从摄像机(眼睛)看过去,距离摄像机(眼睛距离越近),深度值越小,越不会被遮挡。如下图:OpenGL中,默认是禁用深度测试的,也就是说,OpengGL在绘制物体时候,并不关心哪个物体遮挡哪个物体。后绘制的物体总是遮挡前面的。如果不做深度测试,那我们上图的地面和箱子就变成了下图:现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing原创 2022-05-02 17:13:31 · 1087 阅读 · 0 评论 -
LearnOpenGL学习笔记——投光物
平行光当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行。不论物体和/或者观察者的位置,看起来好像所有的光都来自于同一个方向。当我们使用一个假设光源处于无限远处的模型时,它就被称为定向光,因为它的所有光线都有着相同的方向,它与光源的位置是没有关系的。因为所有的光线都是平行的,所以物体与光源的相对位置是不重要的,因为对场景中每一个物体光的方向都是一致的。由于光的位置向量保持一致,场景中每个物体的光照计算将会是类似的。struct Light { // vec3 position;原创 2022-05-01 14:41:08 · 593 阅读 · 0 评论 -
LearnOpenGL学习笔记——光照贴图
光照贴图如果需要描述物体的材质,仅仅描述漫反射,环境光照,高光项是远远不够的,比如:一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那么有光泽,所以它没有镜面高光,轮毂非常闪亮(如果你洗车了的话)。汽车同样会有漫反射和环境光颜色,它们在整个物体上也不会是一样的,汽车有着许多种不同的环境光/漫反射颜色。总之,这样的物体在不同的部件上都有不同的材质属性。我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。漫反射贴图可以将需要细节化的物体光照信息做成纹理存储,并在shader中读取它。原创 2022-04-30 21:07:16 · 391 阅读 · 0 评论 -
LearnOpenGL学习笔记——基础光照
1.光照模型现实世界的光照是极其复杂的,而且会受到诸多因素的影响。我们一般模拟光照,使用的是冯氏光照模型:环境光(Ambient):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。漫反射(Diffuse):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。镜面(Specular:模原创 2022-04-30 19:09:10 · 301 阅读 · 0 评论 -
LearnOpenGL学习笔记——OpenGL颜色
颜色 颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB。我们现实生活中看到某一物体的颜色并不是这个物体真正拥有颜色,而是它所反射的颜色。光照和颜色光照是白色,和颜色相乘,就是该光源照射到物体所呈现的颜色glm::vec3 lightColor(1.0f, 1.0f, 1.0f);glm::vec3 toyColor(1.0f, 0.5f, 0.31f);glm::vec3 result = lightColor * toyColor;原创 2021-09-07 00:40:55 · 566 阅读 · 0 评论 -
LearnOpenGL学习笔记——OpenGL摄像机
摄像机/观察空间 当我们讨论摄像机的观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为长江原点时场景中所有的顶点坐标,通俗来讲,就是眼睛的位置,角度。要在三维的世界中确定一个摄像机,我们需要定义一下三个属性(为什么是三个不是四个,因为另外一个可以通过叉乘得出):摄像机位置其实是定义在三维世界中的一个点。 glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);摄像机方向用一个向量表示眼睛/摄像机朝向的方原创 2021-09-06 00:41:21 · 406 阅读 · 0 评论 -
LearnOpenGL学习笔记——OpenGL绘制三角形
绘制三角形绘制三角形之前:需要理解一下几件事情1.顶点输入顶点数组对象:Vertex Array Object,VAO顶点缓冲对象:Vertex Buffer Object,VBO索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO为什么使用VAO和VBO.请看以下代码,opengl渲染一堆数据的时候,我们使用一个顶点缓冲对象将顶点数据初始化至缓冲中,建立了一个顶点和一个片段着色器,并告诉了OpenGL如何把顶点数据链接到顶点着色器的原创 2021-09-03 00:47:28 · 533 阅读 · 0 评论 -
LearnOpenGL学习笔记——OpenGL创建窗口
创建窗口GLFWGLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的.GLADGLAD是一个开源的库,它解决驱动开发商针对特定显卡实现的OPENGL时,大部分函数的位置都无法确定下来,需要在运行时查询,GLAD解决运行时查询函数位置的问题。#include <glad/glad.h>#include <GLFW/glfw3.h>#include原创 2021-09-02 23:56:58 · 344 阅读 · 0 评论