![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图形学
文章平均质量分 77
姜姜的奇妙冒险[Unity游戏前端]
这个作者很懒,什么都没留下…
展开
-
unity基础学习十八,C# 多线程
线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。1.线程生命周期线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。下面列出了线程生命周期中的各种状态:未启动状态:当线程实原创 2022-05-04 20:21:11 · 870 阅读 · 0 评论 -
Learn OpenGL 笔记7.4 PBR-Specular IBL(Image based lighting-特殊的基于图像的照明)
在上一章中,我们通过预先计算辐照度贴图作为照明的间接漫反射部分,将 PBR 与基于图像的照明相结合。 在本章中,我们将关注反射方程的specular part镜面反射部分:您会注意到 Cook-Torrance 镜面反射部分(乘以 ks)在积分上不是恒定的,它取决于入射光方向,还取决于入射视图方向。尝试求解所有入射光方向(包括所有可能的视图方向)的积分是一种combinatorial overload组合过载,并且对于实时计算而言过于昂贵。 Epic Games 提出了一种解决方案,他们能够为p原创 2022-01-13 02:20:05 · 860 阅读 · 0 评论 -
Learn OpenGL 笔记7.3 PBR-IBL-Diffuse irradiance(Image based lighting-漫反射辐照度)
IBL,或image based lighting基于图像的照明,是一组照明对象的技术,不是像前一章那样通过直接分析光,而是将周围环境视为一个 big light source大光源。这通常通过操纵立方体贴图环境贴图(取自现实世界或从 3D 场景生成)来完成,以便我们可以直接在我们的照明方程中使用它:将每个立方体贴图纹素视为一个light emitter光发射器。通过这种方式,我们可以有效地捕捉环境的全局光照和总体感觉,让对象在其环境中拥有更好的归属感。由于基于图像的照明算法捕获某些(全局)环境的照明,原创 2022-01-13 00:04:59 · 722 阅读 · 0 评论 -
Learn OpenGL 笔记7.2 PBR Lighting(physically based rendering基于物理的渲染 光照)
在上一章中,我们为实现基于物理的逼真渲染器奠定了基础。 在本章中,我们将专注于将前面讨论的理论转化为使用直接(或分析)光源的实际渲染器:想想点光源、定向光源和/或聚光灯。让我们从重新审视上一章的最终反射率方程开始:我们现在大部分都知道发生了什么,但仍然是一个很大的未知数是我们将如何准确地表示irradiance辐照度,即场景的总radiance辐射度L。 我们知道,辐射度 L(如计算机图形领域中所解释的那样)测量给定solid angle立体角 ω 上光源的radiant flux辐射通量 φ原创 2022-01-11 23:53:59 · 728 阅读 · 0 评论 -
Learn OpenGL 笔记7.1 PBR Theory(physically based rendering基于物理的渲染 理论)
PBR,或更通常称为基于物理的渲染,是一组渲染技术,它们或多或少基于与物理世界更接近的相同基础理论。由于基于物理的渲染旨在以物理上合理的方式模拟光线,因此与我们的原始光照算法(如 Phong 和 Blinn-Phong)相比,它通常看起来更逼真。它不仅看起来更好,因为它与实际物理非常接近,我们(尤其是艺术家)可以根据物理参数创作表面材质,而无需诉诸廉价的黑客和调整来使照明看起来正确。基于物理参数创作材质的一大优势是,无论光照条件如何,这些材质看起来都是正确的;这在非 PBR 管道中是不正确的。尽管如此,原创 2022-01-11 19:15:04 · 922 阅读 · 0 评论 -
Learn OpenGL 笔记6.10 SSAO(Screen Space Ambient Occlusion屏幕空间环境光遮蔽)
我们在基本照明一章中简要介绍了该主题:ambient lighting环境光。 Ambient lighting环境光是一个固定的光常数,我们添加到场景的整体照明中以模拟光的scattering散射。 实际上,光以不同的强度向各种方向散射,因此场景的indirectly间接照明部分也应该具有不同的强度。 一种类型的间接照明近似称为ambient occlusion环境光遮蔽,它试图通过使彼此靠近的creases折痕、孔洞和表面变暗来近似间接照明。 这些区域很大程度上被周围的几何图形遮挡,因此光线可以逃逸的地原创 2022-01-09 22:55:24 · 2338 阅读 · 0 评论 -
Learn OpenGL 笔记6.9 Deferred Shading(延迟着色)
到目前为止,我们进行照明的方式称为forward rendering前向渲染或forward shading前向着色。我们渲染对象,根据场景中的所有光源对其进行照明。我们为场景中的每个对象分别为每个对象执行此操作。虽然很容易理解和实现,但它对性能的影响也很大,因为每个渲染对象都必须为每个渲染片段迭代每个光源,这很多!由于片段着色器输出被覆盖,forward rendering前向渲染也往往会浪费大量在深度复杂度高的场景(多个对象覆盖同一屏幕像素)中运行的片段着色器。Deferred Shading延迟着原创 2022-01-09 00:55:21 · 787 阅读 · 0 评论 -
Learn OpenGL 笔记6.8 Bloom(高动态范围)
由于monitor监视器的强度范围有限,明亮的光源和明亮的区域通常难以传达给观看者。 区分显示器上明亮光源的一种方法是让它们发光; 然后光线在光源周围流淌。 这有效地为观看者提供了这些光源或明亮区域非常明亮的错觉。这种光晕或发光效果是通过称为 Bloom 的后处理效果实现的。 Bloom 使场景的所有明亮区域都具有类似发光的效果。 下面是一个有光和没有光的场景示例(图片由 Epic Games 提供):Bloom 提供了关于物体亮度的明显视觉线索。当以一种微妙的方式完成时(有些游戏完全无法做到)原创 2022-01-08 00:35:25 · 800 阅读 · 0 评论 -
Learn OpenGL 笔记6.7 HDR(高动态范围)
默认情况下,亮度和颜色值在存储到帧缓冲区时被限制在 0.0 和 1.0 之间。 这个起初看似无害的声明让我们总是在这个范围内的某个地方指定光线和颜色值,试图让它们适应场景。 这工作正常并给出了不错的结果,但是如果我们走在一个非常明亮的区域,有多个明亮的光源,总和超过 1.0 会发生什么? 亮度或颜色总和超过 1.0 的所有片段都会被限制为 1.0,这看起来不太好:由于大量片段的颜色值被限制为 1.0,因此每个明亮片段在大区域内都具有完全相同的白色值,从而丢失了大量细节并使其看起来很假。这个问原创 2022-01-07 22:14:16 · 2334 阅读 · 0 评论 -
Learn OpenGL 笔记6.6 Parallax Mapping(视差贴图)
Parallax Mapping视差贴图是一种类似于法线贴图的技术,但基于不同的原理。Parallax Mapping视差贴图与 displacement mapping位移贴图(看样子是得位移顶点了)技术系列密切相关,这些技术基于存储在纹理中的几何信息来置换或偏移顶点。一种方法是取一个大约有 1000 个顶点的平面,并根据纹理中的一个值来置换每个顶点,该值告诉我们平面在该特定区域的高度。这种包含每个纹素高度值的纹理称为高度图。从简单砖表面的几何属性派生的示例高度图看起来有点像这样:当跨越平面时原创 2022-01-07 00:18:56 · 648 阅读 · 0 评论 -
Learn OpenGL 笔记6.5 Normal Mapping(法线贴图)
我们通过在这些平面三角形上包裹 2D 纹理来增强真实感,隐藏多边形只是很小的平面三角形的事实。从照明技术的角度来看,确定对象形状的唯一方法是通过其垂直法向量。这种使用每片段法线与每表面法线相比的技术称为法线贴图或凹凸贴图。 应用于砖平面它看起来有点像这样:如您所见,它以相对较低的成本在细节方面提供了巨大的提升。 由于我们只更改每个片段的法线向量,因此无需更改照明方程。基础知识:1.Normal mapping(法线贴图)虽然法向量是几何实体,纹理通常只用于颜色信息, 颜色向量表.原创 2022-01-06 00:07:18 · 1477 阅读 · 0 评论 -
Learn OpenGL 笔记6.4 Point Shadows(点光源阴影贴图)
我们学习了使用阴影贴图创建动态阴影。但它主要适用于定向(或聚光)灯,因为阴影仅在光源方向上生成。 因此,它也被称为directional shadow mapping定向阴影贴图,因为深度(或阴影)贴图仅从光所看到的方向生成。本章将重点关注的是在所有周围方向上动态阴影的生成。 我们使用的技术非常适合点光源,因为真正的点光源会向各个方向投射阴影。 这种技术被称为点(光)阴影或更早以前称为omnidirectional shadow maps全向阴影贴图。directional shadow mappi原创 2022-01-05 19:05:24 · 1116 阅读 · 1 评论 -
Learn OpenGL 笔记6.3 Shadow Mapping(阴影贴图)
阴影为照明场景增添了大量真实感,并使观看者更容易观察对象之间的空间关系。 它们为我们的场景和物体提供了更大的深度感。在当前的实时(光栅化图形)研究中,还没有开发出完美的阴影算法。 有几种很好的阴影近似技术,但它们都有我们必须考虑的缺点。基础知识:1.shadow mapping阴影映射大多数游戏使用的一种技术可以提供不错的结果并且相对容易实现,那就是shadow mapping阴影映射。 shadow mapping不太难理解,不会在性能上花费太多,并且很容易扩展到更高级的算法(如Omn原创 2022-01-04 23:09:20 · 1739 阅读 · 0 评论 -
Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
1.为什么要伽马修正:一旦我们计算出场景的最终像素颜色,我们就必须将它们显示在监视器上。 在过去的数字成像时代,大多数监视器都是阴极射线管 (CRT) 监视器。 这些显示器的物理特性是两倍的输入电压不会导致两倍的亮度。 将输入电压加倍导致亮度等于大约 2.2 的指数关系,称为监视器的伽玛。 这恰好(巧合地)也非常符合人类测量亮度的方式,因为亮度也以类似的(逆)幂关系显示。 为了更好地理解这一切意味着什么,请看下图:底下的Physical是真实的灰度表现,0.1叠加亮度之后变成0.2,和色卡上的.原创 2021-12-28 23:59:13 · 762 阅读 · 0 评论 -
Learn OpenGL 笔记6.1 Advanced Lighting(高级照明)
之前我们简要介绍了 Phong 照明模型,为我们的场景带来了基本的真实感。但有一些细节,我们将在本章中重点关注。基础知识:1.Blinn-Phong以前模型的弊端:Phong 照明是一种很好且非常有效的照明近似方法,但它的镜面反射在某些条件下会分解,特别是当光泽度低导致大(粗糙)镜面区域时。 下图显示了当我们在平面纹理平面上使用 1.0 的镜面反射光泽指数时会发生:发生这种情况的原因是视图和反射向量之间的角度没有超过 90 度。 如果角度大于 90 度,则生成的点积变为负值,这导致镜原创 2021-12-28 23:20:22 · 1541 阅读 · 0 评论 -
Learn OpenGL 笔记5.11 Anti Aliasing(抗锯齿)
这种清晰地看到边缘组成的像素结构的效果称为锯齿。 有很多称为抗锯齿技术的技术可以通过产生更平滑的边缘来对抗这种锯齿行为。(小时候打开一个新游戏,第一件事情就是把抗锯齿给关了,开抗锯齿太卡了)起初,我们有一种称为super sample anti-aliasing超级采样抗锯齿 (SSAA) 的技术,它临时使用更高分辨率的渲染缓冲区来渲染场景(超级采样)。 然后在渲染完整场景时,将分辨率下采样回正常分辨率。 这种额外的分辨率用于防止这些锯齿状边缘。 虽然它确实为我们提供了锯齿问题的解决方案,但它带来了..原创 2021-12-28 22:29:38 · 732 阅读 · 0 评论 -
Learn OpenGL 笔记5.10 Instancing(实例化)
如果我们渲染如下一堆一模一样的对象,会出现性能问题,draw calls太多for(unsigned int i = 0; i < amount_of_models_to_draw; i++){ DoSomePreparations(); // bind VAO, bind textures, set uniforms etc. glDrawArrays(GL_TRIANGLES, 0, amount_of_vertices);}实例化是一种技术,我们通过一次渲染调用,绘原创 2021-12-22 22:50:56 · 496 阅读 · 0 评论 -
Learn OpenGL 笔记5.9 Geometry Shader(几何渲染器)
在顶点和片段着色器之间有一个可选的着色器阶段,称为几何着色器。 几何着色器将形成primitive (set of vertices)单个图元的一组顶点作为输入,例如 一个点或一个三角形。 然后几何着色器可以在将这些顶点发送到下一个着色器阶段之前,按照它认为合适的方式转换这些顶点。 几何着色器的有趣之处在于它能够将原始图元(顶点集)转换为完全不同的图元,可能生成比最初给出的更多的顶点。基础知识:1.输入说明:在几何着色器开始时,我们需要声明我们从顶点着色器接收到的primitive (set .原创 2021-12-21 22:54:43 · 705 阅读 · 0 评论 -
Learn OpenGL 笔记5.8 Advanced GLSL(GLSL新特性)
1.Vertex shader variables:(顶点着色器有关)1.1gl_PointSize(顶点大小)void main(){ gl_Position = projection * view * model * vec4(aPos, 1.0); gl_PointSize = gl_Position.z; } 1.2gl_VertexID(顶点ID)此只读变量保存我们正在绘制的顶点的当前索引。可以用来对顶点进行操作。2.Fragment..原创 2021-12-20 21:49:16 · 430 阅读 · 0 评论 -
Learn OpenGL 笔记5.6 Cubemaps(立方体贴图)
立方体贴图。就是多个texture纹理,对应到一个立方体之上。要把多个贴图合并成一个,再赋值给cube,因为立方体贴图有一个有用的特性,它们可以使用方向向量进行索引/采样只要提供了方向,OpenGL 就会检索该方向(最终)命中的相应纹素并返回正确采样的纹理值。基础知识:1.Creating a cubemap (创建一个立方体Map)int width, height, nrChannels;unsigned char *data; for(unsigned int i ..原创 2021-12-19 16:47:59 · 962 阅读 · 0 评论 -
Learn OpenGL 笔记5.5 Framebuffers
a color buffer for writing color values,a depth buffer to write and test depth informationa stencil buffer that allows us to discard certain fragments based on some condition.这些缓冲区的组合,存储在 GPU 内存中的某处,称为Framebuffer帧缓冲区之前所做的渲染操作都是在附加到默认Framebuffer上的r.原创 2021-12-18 19:31:03 · 502 阅读 · 0 评论 -
Learn OpenGL 笔记5.4 Face culling
Face culling面剔除,背对着相机的面,就不要显示了。基础知识:1.front facing朝向摄像机2.back facing背对摄像机3.winding order缠绕顺序。当我们定义一组三角形顶点时,我们是以顺时针或逆时针的特定缠绕顺序定义它们的。float vertices[] = { // clockwise vertices[0], // vertex 1 vertices[1], // vertex 2 verti.原创 2021-12-11 20:47:07 · 358 阅读 · 0 评论 -
Learn OpenGL 笔记5.3 Blending
OpenGL 中的混合通常被称为在对象内实现透明度的技术。基础知识:1.Discarding fragments(丢弃片段)当将植被添加到场景中时,我们不想看到草的方形图像,而只想显示实际的草并看穿图像的其余部分。#version 330 coreout vec4 FragColor;in vec2 TexCoords;uniform sampler2D texture1;void main(){ vec4 texColor = tex原创 2021-12-11 00:30:25 · 267 阅读 · 0 评论 -
Learn OpenGL 笔记5.2 Stencil testing
我的总结:模板缓存,就是规定一个0和1组成的矩阵,里面写了1的地方才能显示。每次渲染一个模型,这个模型占用的无数个片元格子,就会自动在stencil buffer里面置为1存储起来,用于下一帧来显示.或者这一帧直接拿这个矩阵来进行操作,来配置某些区域的显示和不显示。一旦片段着色器处理了片段,就会执行所谓的模板测试,就像深度测试一样,可以选择丢弃片段。 之后剩余的片段被传递到深度测试,OpenGL 可能会丢弃更多的片段。 模板测试基于另一个称为模板缓冲区的缓冲区的内容,我们可以在渲染期间更新该缓冲区以原创 2021-12-10 22:35:08 · 392 阅读 · 0 评论 -
Learn OpenGL 笔记5.1 Depth testing
基础知识1.depth-buffer深度缓冲区是一个缓冲区,就像颜色缓冲区(存储所有片段颜色:视觉输出)一样,存储每个片段的信息,并且具有与颜色缓冲区相同的宽度和高度。深度缓冲区由窗口系统自动创建,并将其深度值存储为 16、24 或 32 位浮点数。在大多数系统中,您会看到精度为 24 位的深度缓冲区。启用深度测试后,OpenGL 会根据深度缓冲区的内容测试片段的深度值。 OpenGL 执行深度测试,如果该测试通过(此深度未被其他深度覆盖),则渲染片段并使用新的深度值更新深度缓冲区(覆盖别人)。原创 2021-12-09 23:45:54 · 539 阅读 · 0 评论 -
Learn OpenGL 笔记4.1-2-3 - Assimp-Mesh-Model
这节主要是介绍如何导入Mesh模型运用插件assimp-vc140-mt.dll,搜索项目中的这个文件,并复制一份到运行目录:git-learn-open-gl-master\bin\3.model_loading ,然后就能跑起来了代码分析: // load models // ----------- Model ourModel(FileSystem::getPath("resources/objects/backpack/backpack.obj"));wh原创 2021-12-09 22:19:05 · 445 阅读 · 0 评论 -
Learn OpenGL 笔记3.6 - Multiple Light
多种灯光一起显示,这节主要是解析代码#version 330 coreout vec4 FragColor;//-----------------------------定义各种材质灯光-----------------------------//材质数据struct Material { sampler2D diffuse; sampler2D specular; float shininess;}; //平行光源数据struct DirLight {原创 2021-12-09 20:59:33 · 1803 阅读 · 0 评论 -
Learn OpenGL 笔记3.5 - Light casters
Light casters 就是光线投掷者的意思。基础知识:1.Directional Light(平行光)当光源很远时,来自光源的光线彼此接近平行直接用一个向量direction定义光源方向struct Light { // vec3 position; // no longer necessary when using directional lights. vec3 direction; vec3 ambient; vec3 diffuse;原创 2021-12-08 23:30:43 · 960 阅读 · 0 评论 -
Learn OpenGL 笔记3.4 - Lighting maps
车子有光滑的部分,也有轮胎粗糙的部分,所以我们需要通过引入漫反射和镜面反射贴图来扩展系统。 这些使我们能够更精确地影响物体的漫反射(并间接影响环境分量,因为它们无论如何都应该相同)和镜面反射分量。基础知识:Diffuse maps(漫反射贴图)...原创 2021-12-08 21:29:05 · 336 阅读 · 0 评论 -
Learn OpenGL 笔记3.3 - Materials
在片段着色器中,我们创建了一个结构体来存储表面的材质属性。#version 330 corestruct Material { vec3 ambient; vec3 diffuse; vec3 specular; float shininess;}; uniform Material material;另外Light properties(光源选项)也可以用类似的结构体来定义struct Light { vec3 position;原创 2021-12-07 22:28:03 · 2005 阅读 · 0 评论 -
Learn OpenGL 笔记3.2 - Basic Lighting
基础知识:1.Phong lighting model (Phong 照明模型)The major building blocks of the Phong lighting model consist of 3 components:ambient (环境光照)即使天黑了,世界上的某个地方通常仍然有一些光(月亮,遥远的光),因此物体几乎永远不会完全黑暗。 为了模拟这一点,我们使用了一个环境照明常数,它总是给物体一些颜色diffuse (漫射光照)模拟光对象对对象的定向影响。 这是.原创 2021-12-07 19:59:09 · 299 阅读 · 0 评论 -
Learn OpenGL 笔记3.1 - Colors
基础知识:1.Camera/View space创建一个以相机位置为原点的具有 3 个垂直单位轴的坐标系。代码解析:原创 2021-12-03 23:14:15 · 2379 阅读 · 0 评论 -
Learn OpenGL 笔记2.9 - Camera
基础知识:1.Camera/View space创建一个以相机位置为原点的具有 3 个垂直单位轴的坐标系。代码解析:原创 2021-11-29 20:01:18 · 327 阅读 · 0 评论 -
LearnOpenGL 源码配置问题
1.LearnOpenGL的所有cpp资源下载下来https://gitee.com/rongqingmei/git-learn-open-glhttps://gitee.com/rongqingmei/git-learn-open-gl2.用Visual Studio 2019打开此项目3.Visual Studio 2019 安装cmake功能4. 反复的把CMakeSettings.json文件删了再配置配置方式,对CMakeLists.txt右键,然后点击LearnO..原创 2021-11-26 13:41:03 · 254 阅读 · 0 评论 -
Learn OpenGL 笔记2.7 - Transformations
基础知识:1.Vectors在最基本的定义中,向量是方向。向量具有方向和大小(也称为强度或长度)。2.Scalar vector operations(标量向量运算)3.Vector negation(负)4.Addition and subtraction(加减)5.normalizing (标准化)就是本身v,除以三角形第三条边的长度6.Vector-vector multiplication (积)Dot product (点积)向...原创 2021-11-09 23:44:43 · 170 阅读 · 0 评论 -
Learn OpenGL 笔记2.6 - Textures
1.Textures2.texture coordinate3.sampling4.Texture Wrapping5.Texture Filtering原创 2021-11-08 22:55:26 · 241 阅读 · 0 评论 -
Learn OpenGL 笔记2.5 - Getting started-Shaders
学习地址:LearnOpenGL - Shaders知识点:1.Shaders (重)着色器是运行在 GPU 上的小程序。 这些程序针对图形管道的每个特定部分运行。 从基本意义上讲,着色器只不过是将输入转换为输出的程序。 着色器也是非常孤立的程序,因为它们不允许相互通信; 他们唯一的交流是通过他们的输入和输出。2.GLSL(OpenGL着色语言OpenGL Shading Language)着色器是用类 C 语言 GLSL 编写的。 GLSL 专为与图形一起使用而量身定制,并包含专门针对原创 2021-10-31 20:10:31 · 117 阅读 · 0 评论 -
Learn OpenGL 笔记2.4 - Getting started-HelloTriangle
学习地址:LearnOpenGL - Hello Triangle知识点记录:三角形渲染:源代码:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);void processInput(GLFWwindow* win原创 2021-10-24 20:01:07 · 125 阅读 · 0 评论