写在前边
周末学习了下UE4实时渲染的视频,看完后觉得收获颇多,为了以后自个复习省事,记录于此,如果能帮助到大家,则再好不过了。为了以后复习的准确性和深刻,在这里我力求写的尽可能的详细,同时尽可能的保持客观,不作太多的主观讨论和个人意见掺杂在里边。内容偏多,总结性偏弱,原因是想让大家了解的包括我自个 再次翻看的时候能够了解的更透彻,如果单单写总结结论,可能无法了解背后执行的原理。本篇文章更像是半个翻译,所以各位可以当作读书一样来学习即可。由于写的比较仓促,如果哪里有什么不对的地方还请多多指正,篇幅较长分上下两篇来写,这是下篇。
第七篇:渲染和纹理
1,总结
纹理在被导入时会被压缩,纹理总会被压缩,压缩情况会根据平台而有所不同BC或DXT(PC格式),所有不同类型的硬件都有着各自的纹理压缩格式
UE4大多都在后台处理自动处理压缩,不需要手动操作
Windos PC上BC或DXT就是标准格式。DXTC:DXT Compress. BC:Block Compress,通过生成像素块来压缩纹理,BC有很多压缩格式,我们可以操作的不多。
法线纹理是一种特殊压缩格式,仅仅保存红色通道和绿色通道,计算出蓝色通道。
2,补充
压缩和JPG相似,仔细看会有很多块状结构
BC3,DXT5带有alpha通道的压缩格式。 BC1,DXT1不带alpha通道的压缩格式(当图片不带alpha通道时优先使用)。
3,通过photoshop插件Intel Texture Works观察压缩的情况,该插件允许保存.dds文件,dds是bc或dxt的压缩格式。 通过对比压缩,发现文件大小小了不少,但图片清晰度基本没变,
很好的保留下来了,性价比很高。 BC7能提供最佳的质量。 但是不能将.dds纹理直接导入UE4阴影,因为引擎会自动压缩
4,UE中的压缩一览
用灰阶格式压缩的纹理通常比其他压缩格式更大,灰阶基本上不会压缩纹理
"矢量位移贴图"(VectorDisplacement) 解压缩,选择后格式将又变为RGBA8无压缩状态
法线贴图采用BC5纹理压缩格式,如果红色和绿色通道存在渐变,压缩将会力不从心。
5,压缩纹理一是因为带宽空间有限,二是也是因为每个着色器的纹理采样也存在最大数量限制(这个和纹理压缩无关)。
6,虽然纹理分辨率影响内存和带宽,但它很少影响渲染效率。如果纹理太多或太大,带宽可能会不够用,这样的话会导致延迟和卡顿,帧率会下降,出现突然的卡顿,屏幕会静止一段时间不动,然后才能继续。但它不会持续导致你的帧率下降.
7,多级渐变纹理,由许多只有原纹理的1/4大小纹理组成,每张都是前者的1/4。这些渐变纹理会被一起保存到DDS文件或纹理本身中去,它会记住同一张纹理的大量拷贝
8,UE4中通过改变LOD数值就能看到图像大小的变化(1024*1024->512*512->256*256->128*128.....)
9,多级渐变纹理mipmap能偶减少纹理的噪点,如下图左侧有mipmap,右侧没有,工作原理其实是根据相机远近一层一层的采用低分辨率的纹理这种方式来减弱噪点的。
10,还因为我们需要处理纹理流送。纹理流送就是确定引擎在何时需要哪张纹理以及哪些多级渐变纹理的过程,因为我们不会希望导入所有可能需要的纹理,因为那样会用光带宽和内存,它会让加载界面变得时间很长。我们只希望在合适的时间根据所处的位置和摄像机角度及时加载需要的纹理,因为实时渲染所以我们也无法知道相机下一帧会在哪里,相机是否会走向玩家,相机视口等等,我们无法知道什么时候去加载纹理合适,在这种情况下就出现了纹理流送。
11,为了使用多级渐变纹理和纹理流送,我们需要把纹理的边长设置为2的指数幂(1024*1024,32*32),不要求边长相等,例如16*4096也是没问题的。但是如果纹理边长不是2的指数幂,依然可以使用但是不会拥有多级渐变纹理,不会正确的流送。但有的时候我们不希望渐变纹理,比如永远不会从远处观察的纹理的UI纹理,任何可以从不同距离观察的纹理都需要多级渐变纹理。当我们在处理这样的UI交互元素时可以使用任意分辨率的纹理,因为不需要多级渐变纹理,而任何其他纹理必须遵守这个原则。
第八篇:着色器和材质
1,像素着色器:它是一小段在像素上运行的小程序,大多数像素都涉及这些运算,对于渲染管线至关重要。像素着色被用于渲染的每一台步骤,从几何体开始直到渲染完成。UE依靠像素着色器实现整个材质系统,同时也依靠它实现光照和雾,还有反射,后期处理和颜色矫正等
2,像素着色过程简介,输入一台变量,然后对其进行运算,再输出变量。像素着色器会遍历所有像素并运行计算
3,像素着色器可以应用遮罩对符合条件的像素进行计算,采用HLSL编写
4,简单流程:纹理和Shader共同作用输出到模型上。
6,UE里的设置比较复杂,在UE中是一台多阶段流程,包含若干步骤,先有一台模板 MaterialTemplate.usf 为材质编辑器提供支持,从而创建更多内容,我们在材质编辑器中创建的节点和表达式,一旦编译完毕后,就会与模板合并生成一台新的着色器,那个着色器仍有很多未定义的参数和变量,会在材质实例中被定义,再输出到对象上。 材质编辑器是UE4极为强大的原因。
7,通过打开Windows下的HLSL查看器可以看到生成的shader文件, 另外shader的预定义的模板文件目录在Engine/Shaders/Private下,它们也都是采用HLSL语言编写。 继4.17版本以后我们也可以创建自个的着色器,将它们合并为插件或并入自个的项目中。在4.17版本前必须放在引擎的shader目录,那样显然不好,因为放在了引擎自身的目录。
8,因为是预定义了模板,所以更改不同的ShadingModel,属性会发生变化。我们也可以自定义自个的ShadingModel。
9,UE4编译生成着色器的时候,实际上生成不止一台着色器,因为它需要为材质的每一种情况都生成一台着色器。而每一种情况具体指的是材质编辑器里的Useage属性这一块儿,当我们勾选的也多,那么生成的体积量也就会越多,甚至翻倍增长。 假如创建一台着色器来应对这些所有情况,我们就会得到一台非常复杂的着色器,而它只会消耗更多的性能。更好的办法创建15个专门的着色器,每个只包含特定的功能,而不是创建一台冗长且复杂的着色器。
10,通过RenderDoc可以查看具体的渲染管道,以及mesh,贴图,shader代码。图像光栅化从技术上讲也是通过像素着色器来完成的
11,UE4材质管线很大一部分都基于PBR,PBR使用高光,金属色和粗糙度作为输入,它被用来环境中几乎所有的着色。
12,采用PBR的原因是因为PBR属于统一着色,几乎所有图像,模型和材质底层都建立在相同的着色器之上,这样做可以获得最佳效率。因为只有一种着色模型用于几乎所有渲染,我们就能针对仅有的一台着色模型优化我们的每一台环节,获得最佳的性能表现。因为几乎所有都采样同一台着色模型,那么所采用的资源也几乎一致,那么一切都会更加一致,那么预测材质外观会更加容易。不会出现着色模型A不能与着色模型B一起使用,能在室内使用,不能在室外使用的乱七八糟的情况,我们有一台单一模型,适用于任何情况任何对象。
13,因为延迟渲染的缘故,我们通常会渲染多张图像然后将它们合成,所以材质做的一切必须在GBuffer中完成,不管需要什么信息,都只能从GBuffer中获取,这也是它的瓶颈上限。GBufffer有颜色信息,光照信息,深度信息但没有所有的信息。因为存在的限制,所以我们必须找到一台看起来不错的着色模型,然后借助G缓冲的信息就能使用,适应于基于合成的工作流,下图展示了金属度和粗糙度不同的各种结果,基本就能够包含一切了,高光用的不多。基本上只用金属色和粗糙度数值在0-1之间这两项数值几乎可以带来任何效果
14,我们还会使用一些其他的着色模型,但是不常用。这意味着我们必须能够识别在哪里应该使用这些不同的着色模型,然后这些像素会采用另一种渲染方式。所有绿色代表的都是默认的PBR,左边的球体颜色可以标记出不同的着色模型:渲染布料,毛发,眼睛等不同表面类型。我们可以说所有红色像素采用这种着色器,紫色像素采用那种着色器等等
15,知识点
材质或着色器查看的纹理采样器拥有最大数量上限,通常最大值为16,并且只有13个可以使用。但是可以使用共享采样器,这能让我们使用多大128张不同的纹理,但只限于DX11或DX12,不能在其他平台上使用。
纹理大小相关的问题主要是延迟和卡顿,而不是帧率丢失
有时当你当你启动应用或游戏时,你会看到一些模糊的纹理,并非所有纹理都以预期的分辨率出现。出现这种情况是因为电脑没有足够带宽或内存来快速传输完成完整分辨率的纹理,相反采用了一张低分辨率并且很模糊的多级渐变纹理,所以当你试图传输高分辨纹理时至少还能显示一些内容。发生这种情况要么是传输纹理太多了,要么应该优化纹理池的大小。可以在UE中通过命令 r.Streaming.PoolSize 查看并设置纹理池大小。纹理大小就是分配给纹理的内存空间,纹理池会在内存中保留一块空间,如果你的纹理池大小是1GB,那么它就会在内存中分配1GB大小的空间,电脑立刻占用这块儿空间的纹理塞满,但是游戏中纹理空间超过了可用空间,你视野中的纹理就会变得模糊,因为已经超过了纹理池的大小,这个时候需要提高纹理池的大小或者优化你的内容。
16,总结
材质中的纹理上限,这里不仅有直接使用的纹理还有间接纹理,其他的可可以用于光照贴图,阴影贴图,也是纹理的一部分,如果将采样源设置为共享,可以让我们使用最多128张纹理。可以用这种方式在地形资源中创建,超出默认设定,多使用一些纹理
像素着色器对性能有很大影响,主要的性能消耗概括:几何体渲染中的绘制调用数量(drawcall),像素着色器,半透明和动态阴影渲染,这四点几乎涵盖了所有的性能问题。
像素渲染缓慢,不是因为天生缓慢,而是我们依赖它完成大量工作,光照,反射,雾,所有渲染都由像素着色器驱动,很明显会产生很大影响。
分辨率越高,材质越复杂,影响越大。屏幕上像素越多,重复运行复杂计算次数就越多。 像素越多,计算越复杂,像素着色器就越慢,影响就越大。
一台复杂的材质,如果屏幕像素越多,损耗就越大,可以在视口中推拉相机观看。如下展示常见了一台多达800指令的材质(一般的指令数是100-200就好,一般不会低于60),通过视口改变观看距离,可以看到损耗明显不同,远距离由于复杂材质的像素少所以大多数呈绿色,近距离大多数都是复杂的材质呈红色消耗很大。
第八篇:深入探索实时渲染一反射
1,UE中包含三种反射系统,在使用时混合使用发挥优劣。实时反射很难实现,因为每出现一次反射就需要重新渲染一遍场景,考虑到性能和硬件能力有限,我们无法那么做,需要用障眼法巧妙实现
2, 反射捕获是最基本的,这意味着在一台特定位置捕获一张静态立方体贴图,是提前计算出来的,结果是非常迅速,但不太准确,只有局部效果.反射捕获分为立方体捕获和球体捕获。一般我们使用球体捕获。意味着如果摄像机和反射捕获的Actor的位置重合,反射就会变得更准确,一旦移动位置,反射就乱了。本质上是捕获一张360度图片,然后将它混合到模型上。但由于SSR和光照的衬托,是可以掩盖反射不准确这个瑕疵的。使用这个系统可以获得分辨率极高的场景以及清晰锐利的反射效果,而且效率还高。所谓的预先计算指的是打开关卡的那一刻重新捕获的,通过"构建"菜单中的"更新反射捕获"按钮也可以更新,如果是运行游戏或应用,也会在加载关卡时更新。如果你打包游戏或应用,它实际上会将纹理烘培进纹理,所以不再会在关卡开始时更新捕获,当关卡加载时,它实际会将捕获的图片保存,作为游戏的一部分,需要的时候读取。 反射捕获是有范围的,它会随着距离的扩大逐渐消退,而不是突然消失。如果有两个反射捕获Actor重叠在一起,它们会融合在一起。 处在里边的像素会向每个反射捕获Actor查询立方体贴图,然后融合计算结果。
3,平面反射
并不常见,出现不久,我们用的不多。类似反射捕获,从给定位置捕获。
反射仅先于平面上。某些设置下可能损耗很大
但非常适合需要精确反射效果的平面,但只在有限范围内,实现海面效果会有难度,更适合于家里的镜子效果,只适用于平滑表面
无论相机在哪反射都很准确,因为它是实时的,为了节约性能可以关闭每帧更新的选项。
4,SSR
默认开启,能反射所有对象,而且是实时反射
它很准确,但有噪点,并且损耗很大。
只会反射当前可见的内容。
5,SSR位于后处理体积上的某个选项,针对全屏作用,能反射一切对象(既是优势也是缺陷),实时放射很精确,不需要与计算,开销很大(虽然不会很极端,确实会产生损耗),追求性能可以关闭, 噪点也很厉害, 只能渲染屏幕上实际出现的内容(很多游戏你都会水面反射在屏幕的边缘突然消失的情况)。
6,因为各有有缺陷,需要混合使用,组合成最终图像。
7,在UE中SSR拥有最高优先级,如果可以用,它就会用,否则会使用平面反射,不可以用平面反射,就会用反射捕获。
8,总结记忆点
当一台关卡没有烘培时,反射捕获会在关卡加载时执行捕获。在关卡中添加过多反射捕获可能导致加载变慢。拥有数以千计的反射捕获不是一台好主意.
如果处于最后的烘培和打包阶段,应该处理好这个,好让加载更快。当有许多反射捕获重叠时损耗会变大,因为像素着色器一遍遍运算。 反射捕获清晰度或者说分辨率可以在项目设置中设置。
关于反射捕获的重叠,基本思路是放置一台大型的反射捕获Actor,来大致覆盖整个房间,然后把较小的反射捕获Actor放在需要精确放射的表面附近,不重叠最好。如果重叠了像素就必须计算并融合这个反射捕获,还要执行相同运算融合那个反射捕获,假设有10个则需要计算10次,这就是损耗的原因。出于这个原因我们倾向于反射捕获重叠的数量不超过8个,不是硬性规定,取决于实际情况。超过20到40个或许就会导致问题
9 ,还可以使用天空光照,天空光照能为整个游戏世界提供低成本的备用反射捕获
平面反射只有在绝对需要的时候才用,开启平面的实时反射捕获功能,会让处理变慢。
如果性能硬件有限,请关闭性能最耗的SSR。如果硬件支持开启SSR,请将SSR质量提升 到标准之上,会减少噪点,通过命令 r.SSR.Quality 设置,默认是3,可以设置成4.无法消除噪点但会减弱。
10,可以在游戏放置天空光照,它能为整个游戏场景捕获一张立体方体贴图,"源类型"是"SLS捕获场景"(SLS Capture Scene)。事实上它会根据"天空距离阈值"(sky distance threshold)捕获场景,它会裁剪掉最近15万个单位的近裁剪面,然后捕获剩余内容,然后它会获得天空的立方体贴图。游戏世界中任何附近没有球体或立方体反射捕获Actor的对象都会转而使用天空光照反射,这对大型户外环境很理想,因为不会希望在场景到处放置捕获Actor,天空光照提供了一种备用的反射捕获方案。
11,查看场景反射情况
第九篇:静态照明
1,和反射一样,光照和阴影在实时渲染中也很难计算,它们非常复杂,需要占用大量硬件性能,并且计算速度很慢,因此我们会将光照的部分计算分流到预计算或预渲染阶段即静态光照。静态光照是指预先计算而非实时渲染的光照
2,如下是UE里涉及使用的各种方案。
3,划分为四组:静态光照和静态阴影,动态光照和动态阴影。
4,以下是总览,包括静态光照的质量和流程。
流程而言,它会在编辑器中预计算,将大部分结果存储在光照贴图中,性能迅速,但是会占用大量内存。需要花费很多时间,每当模型有变化,需要重新烘培,模型还需要光照贴图UV质量而言,可以处理辐射和全局光照。可以获得真实的阴影效果,包括真实高质量的软阴影效果。比实时阴影能拥有更丰富精确的阴影效果。但是质量很大程度上取决于光照贴图分辨率和uv布局。由于uv布局的关系,还可能会产生接缝。 光照贴图分辨率存在上限,因此巨型模型会缺乏足够的光照贴图uv空间。一旦计算完就无法再改变光照和阴影,除非重新计算整个模型。光照贴图只是一张烘焙有光照和阴影的纹理图片(纹理会和底色相乘,看上去有阴影关系),纹理一般最大尺寸4096,如果模型巨大,可能没有足够uv空间,光照质量就会变低。
5,通道打开 "仅光照"可以看到静态光照和动态光源
6,生成光照贴图的Lightmass是一台独立的应用,用于处理光照渲染和光照烘培,属于编辑器之外的编辑器。Lightmass支持网络分布式渲染。烘培质量取决于光照构建质量以及Lightmass的各个级别设置。Lightmass需要一台Lightmass重要体积。体积内的任何东西都有高质量的光照,体积以外的任何对象则具有较低的光照质量。如果必要可以放置多个"光照重要体积"
7,间接光照缓存(IndirectLightCache) ILC用来计算动态模型上的预计算光照,比如当动态角色进入烘培好的静态光照中去的时候,如何对光照做出反应,知道哪里是亮的,哪里是暗的,此时动态光源已经不存在了,只剩下可以混合的lightmap纹理,这种情况下就会使用ILC。这些点都存储了光照信息,对于其中的每个点都存储了间接环境光照,当角色移动时,UE4会找到最近的点查询它的亮度与自身进行混合。
8,每个动态模型都有一台"间接光照缓存质量"的设置,默认设置是ILCQ点,意味着它会获取最近的点。如果把它设置成ILCQ体积,它会取最近的5*5*5g个点,并且从这些点中计算出颜色,可以得到更好的质量。如果需要最佳性能,请将间接光照缓存质量关闭。
9,通过设置世界设置中的"体积光源采样置换比例"(Volume Light Sample Placemenet Scale)可以获得更高的点的密度。
10,间接光照缓存体积太密,会对性能产生影响。 如果担心角色可能会出目前没有光照缓存体积的位置而丢失间接光照阴影,可以使用一台叫做"Lightmass角色间接细节体积"(Lightmass Chracter Indirect DetAIl Volume),无论你在哪个体积中,它都会强迫矢量或者点出现,所以只要在出现的地方创建一台立方体覆盖整个区域即可。
11,通过视口Lightmap Density查看光照密度,通过合理分布UV调整密度,有利于获得更好的烘培结果。如果发现红色的区域则代表分布过于密集,需要适当调整模型上的"覆盖光照贴图分辨率"(Overriden Lightmap resolution)属性,以保证整个场景中全部显示蓝色或绿色区域。
12,在光栅化的时候,成像就已经和Lightmap纹理图混合在了一起,光栅化的时候这些信息已经存在了.Lightmap是预计算,发生在第0步,渲染之前。而动态光照则不会在此发生。
13,设置Lightmap UV
14,记忆点整理
静态光照总会以完全相同的速度渲染,无论你有一盏光源没有光源5万光源,都没有区别,都会获得同样的性能
光照贴图分辨率会影响内存和文件大小,而不是帧率。
它和纹理大小一样,烘培时间会随着光照贴图分辨率模型和光源数量以及质量设置的提升而增加。
衰减半径很大或者源半径很大的光源会降低重新构建时间。半径越大,光源的自发射表面就越大。对管光源(Tube Light)很有用。
第10篇:动态照明
1,重申影响性能的四大要素:绘制调用(drawcall),几何体渲染,半透明,像素着色器(因为到处都会用)尤其是动态阴影损耗非常大
2,动态光照和实时光照是一台概念,一台意思。
动态光照借助G缓冲实现实时渲染,使用GBuffer的图像,来计算如何将光照混合上去
光源可以被随意改变,移动添加和删除。
完全动态,可以随时进行改动,不需要任何模型改动就可以产生效果,对于性能影响很大。
动态光照有很多中方案,需要混合使用。相比静态光照,动态光照要复杂的多。想要做好会更难,就质量而言因为阴影的消耗很大,通常需要降低渲染质量来补偿。要么降低阴影质量,要么降低其他画面的质量,或者禁用某些功能,总之需要做一些舍弃,才能让阴影达到预期。
动态光照不会产生任何软阴影,虽然也能实现,但远未达到正确渲染静态软阴影的程度。动态阴影通常看上去比静态阴影更具"现场感",感觉更像是物体处于场景之中,更加鲜活
动态阴影不太需要考虑模型大小。对于超大的模型由于采用静态阴影可能没有足够的光照空间,而更适合动态阴影。
动态光照不会产生全局光照,尽管存在方案可以实现全局光照和辐射,但是应用还不广泛,仅在一些特殊情况下适用,性能也不很好。
3,阴影极度消耗性能,关闭一些光源的阴影投射会有很大帮助。
有四种主要的动态阴影投射类型,还有一些不太常用的阴影。
4,最常用并且最重要的就是 常规动态阴影(Regular Dynamic Shadow),它们被用于任何地方,因为他们是常规动态阴影。常规动态阴影源是指被设置成可移动,正在投射阴影的光源,阴影会随着光源移动,实时更新。弊端是阴影过于清晰和锐利,以至于对于低面数模型能看到几何体的棱角(显得不合理)。动态阴影没有任何反射光照或全局光照,暗区会一片漆黑。
5,逐对象阴影或者称为固定光源阴影。光源需要设置成"固定"(stationary),介于静态和动态之间。固定阴影会混合使用依赖光照贴图的静态光照以及完全动态的动态光照,两者兼而有之。阴影虽然也很清晰,但是比动态阴影好太多了,没有了不合常理的锐利棱角了,阴影与光照图混合的很好。
6,CSM,不可以用于大型室外环境。CSM能随着距离逐渐消退并过渡阴影,让阴影在消失时不那么突兀。级联阴影贴图系统用于定向光源,而且只可以用于定向光源。CSM会级联不同的阴影贴图,会将不同的阴影集相互串联。 可以设置创建的阴影条数量,每一片都比前一片质量低。可以通过设置灯光下的"Num Dyanamic Shadow"改变CSM的分级层数。
7,距离场阴影。满足大型户外场景的需求,能够处理长距离的阴影。不是很精确,但损耗很低。 使用距离场信息,而不是几何体信息来找出阴影应该投射在哪里。之所以这么做是因为 按照传统做法需要知道点之间的距离才能投射阴影。光线从哪里来的,光线经过时距离几何体有多近,几何体距离下一台击中点有多远,阴影要覆盖多长距离,需要计算很多距离损耗很大于是有了某种方法能够存储模型之间的距离信息,实时计算所有这些数据,就会花费更少时间,这就是距离场阴影。
8,距离场阴影是多种方法之一,也是唯一在UE4中真正实用的方法,允许加快速度。体积纹理的分辨率决定了阴影的细节程度。阴影细节通常不会太高,在远处不会注意到这点仍能使用距离场阴影,能为我们节省大量性能。体积纹理如下所示,是一张二维平面被切割成不同部分,然后每个部分相互层叠在一起,形成一块儿立体区域,包含不同的层级,它会根据白色的位置告诉你对象的形状,因为这些层级相互重叠,可以得到一台3D对象,可以从这些信息中推断出一台3D对象。即使在不同的轴线上,这个体积拥有垂直的层级。如下椅子3D模型,实际是一张纹理,然后使用这个3D模型渲染阴影。
10,在远距离上是距离场负责投射阴影,而不是几何体。距离场比实际的几何体更容易测试距离,因为本质上是使用的纹理。最适用于那些边线笔直棱角分明的几何体,因为基于纹理,所以处理的就是像素。默认引擎是关闭的,需要手动开启。
11,剩下的就是一些不常见的阴影了。有插图阴影(Inset Shadow),本质上与逐个对象阴影相同,本质上是一回事。在一些动态模型上能给你更高的分辨率,一般角色默认开启Inset Shadow。即便附近没有合适光源,它们也能投射出高分辨率阴影或者类似效果。
12,可以使用接触阴影(Contact Shadow)能在细小物体下投射效果不错的接触阴影。比如 墙上的盆栽背后的细微阴影。
13,胶囊体阴影,非常简单同时消耗很低。它是用来渲染模型下方阴影的系统。例如<虚幻争霸>中有许多敌人,动物,怪物跑来跑去,如果使用具体的静态网格几何体来计算下方阴影,这就需要跟踪并计算许多几何体,相反我们使用碰撞胶囊提来投射阴影,因为它们面数很低,更容易投下阴影。基本上只使用低面数阴影投射模型而不是实际模型。不管怎样,胶囊体阴影并不常用。
14,用像素着色器来计算和应用场景。 动态光源点光源像球体一样渲染,原理就像遮罩,球体内的任何像素都会进行着色运算混合光照。
15,光源复杂度观察窗口,通过颜色可以查看哪些是光源重叠的区域。和反射捕获Actor一样,重叠的光源重叠越多,计算像素成本越高,因为它们一次次的针对每个光源进行计算和渲染。
16,光源本质上就是下方的一张类似的图,有颜色和亮度,有衰减度,以一定速率消失。
17,需要知道四样信息才能渲染阴影。1,从摄像机到几何体的距离,因为有深度通道,可以很容易求出距离摄像机的距离 2,摄像机的位置 3,光源的位置 4,几何体到光源的距离,这里就是运行速度变慢的地方。 然后我们把光源当成摄像机,渲染一张只有深度信息的立方体贴图,完整360度。立方体贴图会标记出每一台几何体和光源之间的距离。 利用这四条信息,可以生成一张阴影贴图,阴影贴图就是在这个特定光源下会你在这个特定的位置看到的阴影,然后将阴影贴图和原来结果混合就会得到带有阴影的效果。
第11篇:雾和透明度
1,UE4中的雾是距离雾,UE中有两种类型的距离雾Actor:大气雾Actor和指数雾Actor。还有一种局部体积雾
距离雾意味着随着距离消退,距离雾也是高度雾,这意味着雾在接近天空时消退。所以雾在原理你和接近天空时消散。
同样雾效基于像素着色器
大气雾Actor的性能更好点,指数雾Actor效果更好点(它可以混合更丰富的颜色种类)
雾效借助深度实现。知道深度代表着知道距离摄像机有多远。
雾默认单一颜色,但是会根据太阳光的颜色而偏色。雾会通过太阳光的颜色和位置做出颜色改变。
最后雾会将颜色和深度两者混合在一起,就得到了雾效。
2,半透明物体
前向渲染中,渲染透明效果简单很多
为了获得尽可能高的质量,可以前向渲染中渲染透明度,然后将渲染结果与延迟渲染器合并,但是这样会有附带损耗,因为这样要运行两个流程,然后合并。
3,半透明渲染在延迟渲染中很难实现,因为只有G缓冲可用。G缓冲缺少足够信息,无法正确的来渲染透明度,透明度通常看起来比较简单,但很难在延迟渲染中实现。
UE会在GBuffer中渲染一些图像,标记出哪些像素会变成透明。还可以设置如下选项来为每种特殊情况制定不同的方案。
&#34;体积定向&#34;和&#34;体积无定向&#34;都涉及到体积,表示它会划分表面或网格体,UE4实际会细分网格体,并不会改变模型,而是在渲染时增加额外细分。&#34;体积逐个顶点定向&#34;一样只是基于顶点。
无方向总是比定向损耗更低,定向在透明上更好一点。无方向基本只是在顶层添加透明。
表面正向着色一般和屏幕空间反射同时使用,一起开启,这样会得到最好的效果,但是它的损耗也最大。
4,当以最佳的质量渲染透明度时就像素着色器的运算次数而言,损耗很大,所以可以用前向渲染器实现,因为它很慢。如果有许多图层覆盖了相同像素,并且有大量像素覆盖时,透明度造成的损耗会非常大,除了像素着色本身的损耗外,渲染排序也会加重损耗。它很缓慢并且容错率低,整个过程非常复杂。
5,每增加一层透明渲染,损耗就增加一些。 可以通过视口像素复杂度查看。这些材质会不断叠加材质的着色器消耗。同时材质消耗的指令数随着叠加的增多也会再次叠加。
6,透明度叠加占据屏幕的面积越大,性能损耗越大。 如下图右侧的几乎一多半的像素都要额外计算,而左侧的只有1/4像素需要计算。 当运行烟雾和粒子时,这一点就更明显。
7, 如下图场景充满了烟雾,然后通过窗口->Shader复杂度查看消耗巨大。
8,如果可以用&#34;蒙版&#34;这种混合模式(Masked Blend Mode)代替半透明模式,那么一定要设置成&#34;蒙版&#34;,这会快很多。如果一定要使用半透明模式,尽量不要把模式设置成默认的&#34;光照&#34;,如果能设置成&#34;不带光照&#34;,渲染速度会快很多。尽可能的尝试用其他方法来&#34;伪造&#34;模拟半透明效果加快渲染速度。真正需要时再在半透明表面使用光照。如果需要最佳效果 ,请将光照模型设置为&#34;表面正向着色&#34;,同时开启ScreenSpaceReflection选项。
9,总结
透明材质覆盖的像素越多,材质通常应该越简单,眼前的烟雾材质应该非常简单
带有光照效果的透明材质损耗会大得多,所以请无比简化材质,尽可能的伪造光效。
1,后期处理就是在流程末端应用的视觉特效,这也是为啥称为&#34;后期&#34;的原因,它是整个流程的最后完成阶段。很大程度上依赖像素着色器,并且也是通过合成实现,通过再度使用GBuffer来计算各种效果
2,常用的后期处理特效
泛光,景深,镜头晕光,光束,色调映射/颜色分级,曝光,运动模糊。
3,Bloom原理很简单,只需找出最亮的元素,挨个询问每个像素的亮度,得到图像后过滤掉所有暗于特定颜色的像素,可以用黑色代替(都可以在Photoshop中实现),然后以某种方式模糊这张图象,可以缩小图像让其模糊,当非常小的时候再放大就会得到很模糊的图像,还可以混合一张镜片灰尘的遮罩图片,再次混合后就可以得到模糊效果了。
UE4有很高的动态范围,可供使用的颜色值更多。UE4泛光是一台多阶段的过程,本质会多次执行上方提到的模拟流程,使用不同的宽度和颜色。
泛光高级设置中包含6种尺寸,代表6种不同的泛光通道,会已6种不同的颜色对泛光进行着色,实现更好更复杂的泛光效果。 而在标准设置下的&#34;卷积&#34;(Convution)将会得到更真实的泛光效果,但性能开销也更大。
4,一开始就渲染了深度图像,就知道所有对象有多远。以某种方式渲染图像,模糊/放大或缩小得到模糊图像,最后把深度图和模糊图像混合,模糊效果只会出目前远距离位置上,距离越远越接近刚才得到的模糊图像。
设置中介绍。 &#34;高斯景深&#34;(GaussianDOF)比较常用,,&#34;焦外成像景深&#34;(BokehDOF)更真实,但损耗也更大。
5,UE4中有不同的颜色分级方法。最新和最通用的是一些内置方法。
查找表(Lut)本质是一种将Photoshop或类似程序中的操作记录下来的手段。把数据记录在&#34;查找表&#34;中,记录在一张彩色数据表中,这张彩色表可以记录4096种不同的颜色偏移,这些偏移一旦被记录到到2D程序中。会被导入UE4然后重新被应用到那些匹配这些颜色的像素上。
16种不同的绿色,16种不同的红色以及所有混合的颜色。网格不断复制,每次蓝色都会增加一点。然后有16种不同的红绿蓝组合总共衍生出4096种颜色
原理:当在左侧立柱上随便取一台像素,默认的查询表里哪个与之最接近,找到最接近的,然后当实际使用的&#34;查询表&#34;种查找颜色发现那个像素比之前的更加偏向红色,计算两者的偏移,然后发现比预期的要红出 20%,获取相匹配的像素,然后提升20%的红色。如果在整张图像上使用不同的规则和偏移都这么做,就会得到一台重新着色,颜色分级的结果。
6,如果把泛光,景深, 颜色分级等混合在一起,然后我们就会得到如下这张图像。
7,UE4的延迟渲染在几何体渲染后就完全基于合成方法,完全基于像素计算。前向着色器与此完全不同。前向渲染器在渲染几何体时相比延迟渲染器,会在最初的基本通道中执行多得多的内容。而延迟渲染器则会使用更多的基于合成的方案。这就是两者的区别.
结语
采用文中作者的结语作为结尾吧:希望大家能从涉及的话题中学到很多知识。这里边简化了很多内容,也跳过了一些环节,但希望能获得一台大致印象,知道所有环节如何相互关联,渲染步骤的顺序,我们构建方案时面临的问题,我们面临的挑战和应对方案,UE4中不同功能的相互比较,何时使用哪些特性,不同功能如何最佳搭配等等,希望对这些内容有所领悟。 |