虚幻图像渲染引擎有哪几种为什么靠一张纹理就能实现模型上色模块化,是什么原理?

本文介绍Unreal中纹理的几种优化方法,以及Profile方法。纹理体积对游戏性能的影响主要体现在内存,显存和打包后的体积容量,不会影响渲染性能。内存和带宽瓶颈会造成的问题是:延迟,卡顿,而不是帧数整体偏低。主要介绍的三种方式为:纹理压缩,TextureStreaming,DownScale和MaxSize。纹理压缩压缩要求:纹理的长和宽都要是4的倍数纹理压缩是这三种中对Texture内存占用最有效的方式,一般可以将占用可以缩小到3到6倍。建议所有纹理都使用压缩处理。Figure 1. 未压缩的Texture大概21MbFigure 2. DXT5压缩格式压缩后,5.4Mb纹理压缩在不同的平台是有区别的,在PC平台上主要是基于块式的压缩方案BC(Block Compression),也叫DXTC(DirectX Texture Compression)。因为都是以4 * 4像素块为一个压缩单位,因此纹理的尺寸要求是4的倍数。即使是BC/DXTC类别中也有大量不同的压缩格式,BC1/2/3/4/5/6/7。主要是根据是否有Alpha通道,是否支持法线贴图,以及减少压缩导致的信息损失决定。BC1:RGB通道纹理压缩适用范围:无Alpha通道效果:将(4*4)16个RGB8格式的纹素,最终压缩成只有4种颜色的块。可以仔细观察下图右侧压缩后的纹素块,实际只有4种颜色。Figure 3. BC1压缩图解原理:(4*4 )16个纹素记录两个极值颜色(RGB565),即Color_0和Color_1这两个极值,再线性插值出两个数值Color_2, Color_3。Color_2 = 1/3 * Color_0 + 2/3 * Color_1;
Color_3 = 2/3 * Color_0 + 1/3 * Color_1;
至此,16个纹素的颜色就只用4个颜色代替16个纹素,每个纹素记录2bit索引2bit可以组成4种选择(00/01/10/11)对应其中一种颜色至此,16个RGB8的纹素,从16 * 24 = 384bit(图中因为有A通道所以是512,但压缩后A通道会消失)。压缩到(R5G6B5 * 2) + (4 * 4 * 2) = 64bit。每纹素压缩率6 : 1,4bpp (bit per pixel)BC2/3:RGBA纹理压缩BC2/3都可以用来压缩带Alpha通道的纹理,压缩后都是128bit的块。A通道也都是占用了64bit,只是对A通道的压缩方式不太相同。由此可见,A通道的数据量占整体压缩后的一半,Texture中能不使用A通道,就不使用A通道。PS:(可以通过MergeMaps将三张Alpha单通道Texture,合并到一张RGB Texture的方式节省Alpha的内存占用。)(同时减少了shader的纹理采样数目,限制是16个)BC2:BC2在RGB的处理上和BC1相同BC2对A通道的处理:每个纹素的A通道,用一个4bit的Alpha替换原本的Alpha值相当于最大还可以是16种Alpha值,只是精度下降每纹素压缩率4 : 1,8bpp (bit per pixel)Figure 4. BC2压缩图解BC3:BC3在RGB的处理上和BC1相同BC3对A通道的处理:16个纹素记录两个Alpha 8bit的极值,即Alpha_0和Alpha_1通过两个极值,在插出6个值,一共8个值。每个纹素用3bit纪录一个索引,一共8种索引每纹素压缩率4 : 1,8bpp (bit per pixel)Figure 5. BC3压缩图解BC4:用于单通道BC4压缩原理:单个通道,压缩方式和BC3中的Alpha相同。每纹素压缩率2 : 1,4bpp (bit per pixel)适合Alpha 通道Figure 6. BC4压缩原理BC5/DXT5:用于法线贴图BC5只有两个通道,是用于法线贴图的一种压缩格式。Normal Map是一种很特别的纹理,Unreal渲染过程中的Normal Map实际上是没有Blue通道的,B通道可以通过RG通道经过计算还原。还原算法Z = sqrt(1 - (x * x + y * y));
Figure 7. UE中使用DeriverNormalZ通过RG还原B通道只是在编辑器中依然可以看到Blue。下图展示RendeDoc截帧结果。Figure 8. RenderDoc中可以看到法线贴图只有RG两个通道BC5压缩原理:两个通道,每个通道压缩方式和BC3中的Alpha相同。两个8位参考RG值 + 每个纹素3位RG插值因子 = 共128位.每纹素压缩率2 : 1,8bpp (bit per pixel)适合Normal MapFigure 9. BC5压缩图解BC6H:用于HDR纹理的压缩BC6H解决了BC1可选颜色太少,且精度低的问题。可以用来压缩HDR纹理,但是BC6H没有Alpha通道。压缩后的4*4纹素块,占128bit的体积。Figure 10. UE中HDR压缩格式为BC6HTextureStreamingTextureStreaming对纹理的要求:纹理的长宽都是2的幂,且生成Mipmap纹理不要勾选Never StreamingMipMapMipmap的作用:处理因纹理本身过于精细,但是占屏幕面积小对应屏幕上的分辨率不足(也就是采样率不足)导致的锯齿。这个问题也可以使用MSAA解决,MSAA通过在一个像素中多次采样提高采样率,但是计算量过大。而Mipmap通过每级长宽缩小一半的小贴图,实现将原本大纹理信息合并到小纹理中。这个过程的原理和MSAA/SSAA相同。因此Mipmap通过增加1/3的整体纹理体积,提供更好的效果。Figure 11. MipMap原理效果对比:Figure 12. 左侧使用Mipmap,右侧未使用Mipmap如何确定MipMap的层级根据相邻两个像素之间的UV距离决定。当像素和上下两个像素之间的UV距离(ddx, ddy)刚好或接近是一个纹素值,如下图蓝色的点。说明一个像素基本可以代表一个纹素,长宽为“2的0幂”的纹素块,那就使用Mip0,即原图。当像素和上下两个像素之间的UV距离达到或接近L个纹素值,如下图红色的点基本是3个纹素值。说明一个像素覆盖了多个纹素,可以近似为长宽为“2的x幂”的纹素块。也就是MipMap_x,计算x的公式如下将L = 3代入公式,可以得到x为2。即一个像素大概覆盖长宽为“2的2幂”的纹素块。使用MipMap2。int x = max(int(log2(L) + 0.5),0)Figure 13. 确定MipMap Level如何确定两个像素之间的纹素距离L:L = max(\sqrt{\left( \frac{du}{dx} \right)^{2} + \left( \frac{dv}{dx} \right)^{2}}, \sqrt{\left( \frac{du}{dy} \right)^{2} + \left( \frac{dv}{dy} \right)^{2}}) float2 dx = ddx(uv);
float2 dy = ddy(uv);
float L = max(sqrt(dot(dx, dx)), sqrt(dot(dy, dy));Texture Streaming原理只加载该纹理需要被用到的那个Mip Level,不用加载全部Mipmap。用这种办法在拥有良好的视觉质量, 同时有效地管理可用内存。Streaming 指标UE中提供了STAT命令还显示TextureStreaming的指标 - “stat Streaming”Figure 14. Stat streaming示例官方提供了比较详细的指标解释和命令。比较重要的几点:Texture Pool约等于Safety Pool+Temporary Pool+Streaming Pool+NonStreaming MipsStreaming Pool的需要容量是Visible Mips+Hidden Mips+Forced Mips+Cached Mips,但可以更大Wanted Mips等于Visible Mips+Hidden Mips+Forced MipsStreaming Pool的大小可以通过r.Streaming.PoolSize控制如果调的很小,在Editor中会看到左上角警告,以及场景中纹理变得非常模糊Streaming Pool足够大时,Required Pool等于Wanted MipsStreaming Pool稍小于Required Pool,Cached Mips就会逐渐从内存里释放Streaming Pool远小于Required Pool,引擎会只加载最小的Mipmap。因此场景中纹理变得非常模糊,打出的包可能会直接闪退使用建议:UI可以不使用,因为本身就在最上层用不到Mip0外的level,打开Mipmap还增加了1/3的内存占用。本身就很小的纹理可以不使用。其他纹理都应该使用Texture Streaming。DownScale和MaxSizeDownScale可以设置在不同平台长宽各缩短几倍,此时要注意DownScale后的纹理大小也要满足压缩要求。否则还会导致包体体积上升。设置为2后,移动端该纹理会使用1024*1024的分辨率。Figure 15. DownScale图解Maximum Texture Size用来设置该Texture在游戏中最大以什么分辨率显示,属于比较强硬的修改方式。建议修改前和美术沟通。默认数值为0,即不生效。Figure 16. Maximum Texture Size图解Tracking the Size of textureLLMMemreport -full参考http://sv-journal.org/2014-1/06/en/index.php?lang=enAbout Texture Compression TechniquesKyrie:纹理压缩UE4:关于Texture Streaming的一部分总结 - 知乎 (zhihu.com)虚幻引擎纹理流送指标
虚幻引擎5.1文档 (unrealengine.com)虚幻引擎中的纹理流送配置
虚幻引擎5.1文档 (unrealengine.com)
原文链接:https://blog.uwa4d.com/archives/Study_Unreal4_Animation_3.html 上周UWA介绍了Unreal 4引擎动画模块中的动画融合功能,今天我们将继续介绍Unreal 4引擎动画模块中的其他进阶功能,其中主要包括:动画重定向、逆向运动学和顶点动画。 在此,特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在UWA团队学习其引擎的道路上提供的大力支持。 一、动画重定向 游戏引擎动画模块中的动画重定向(Animation Retargeting)可用于在不同模型上重用动画文件,该功能类似于Unity引擎中Humanoid模式下的Retargeting功能。Unreal 4引擎对使用相同Skeleton Asset的Skeletal Mesh支持动画重定向,并且支持不同尺寸角色动画的重定向,其细节把握非常到位,具体如下图所示:上图显示了高、中、低三个不同的模型,并以骨骼长度中等模型的动画做重定向。在不做骨骼缩放处理的情况下直接做重定向使得较矮的模型被拉伸,较高的模型出现了穿插。 Unreal 4引擎对该问题提供了解决方案。打开两个Skeletal Mesh共用的Skeleton Asset,并勾选Show Retargeting Options,即可看到骨骼结构图右边显示骨骼Retargeting设置,如下图所示:点开向下箭头会显示四个选项:Animation、Skeleton、Animation Scaled以及Animation Relative,如下图所示:该选项表示了骨骼的Transform数据来源。其中,Animation选项表示Transform来自动画文件,Skeleton选项表示Transform来自骨骼文件(即静态骨骼),Animation Scaled表示Transform来自动画文件,但根据原始Skeletal Mesh中的骨骼长度进行缩放。对于一般情况,只需要将Root、IK和Weapon骨骼设置成Animation,Pelvis骨骼(一般为根节点)设置成Animation Scaled,其他骨骼均设置成Skeleton即可。设置完成后即可输出经过骨骼缩放后的动画重定向结果,如下图所示:其中,黄色线表示动画文件原始模型的骨骼,白色线表示进行动画重定向的模型骨骼。 对于使用不同Skeleton Asset的Skeletal Mesh,Unreal 4引擎支持使用Rig文件将两者的骨骼进行映射,过程类似于Unity引擎中对Humanoid类型骨骼的模型进行标准人形骨骼映射。然后,即可支持动画重定向功能。有兴趣的读者可参考Unreal 4官方网站动画重定向教程【1】,进一步了解。 二、逆向运动学 游戏引擎中逆向运动学(Inverse Kinematics)可以弥补普通动画中不精确的情况,从而生成更加真实的角色动画。IK在游戏角色动画中有多种应用,其中比较常用的情况是使得角色双脚能贴合在高低不平的地面或是当角色触碰某些物品时能精确地碰到物品的位置,如下图所示:其中,左图是没有使用IK的情况,在楼梯上由于角色两脚地面高低不一致,导致右脚穿插入楼梯。右图是使用了IK的情况,角色的右脚被抬起到与楼梯相同的高度。 Unreal 4和Unity引擎都支持IK,本节主要介绍Unreal 4引擎中IK的使用和设置。Unreal 4引擎中设置IK通常需要设置两个地方:Character的Blueprint和Animation Blueprint。在Character Blueprint中,需要处理获取Socket节点的位移信息,用于在Animation Blueprint中使用。Socket节点即为IK中需要触碰到指定位置的节点,例如:在本节例子中角色脚底可以设置成Socket节点,如下图所示: 其中,上图的Character Blueprint中,红框表示了每一帧Tick函数,蓝框表示计算角色右脚的Socket节点与地面的高度并记录在IKOffsetRightFoot变量中,绿框表示计算角色左脚的Socket节点与地面的高度并记录在IKOffsetLeftFoot变量中。然后,在Animation Blueprint的Event Graph中获取该变量值并设置为Effector Location,如下图所示: 其中,红色框表示利用IKOffsetRightFoot变量的值计算右脚Effector Location(脚底位置),蓝色框表示利用IKOffsetLeftFoot变量的值计算左脚Effector Location。 最后,在Animation Blueprint的Anim Graph中,使用Two Bone IK节点设置IK节点,如下图所示:其中,红色框表示用Two Bone IK节点计算右脚的IK解,蓝色框表示Two Bone IK节点计算左脚的IK解。其中,Joint Target Location参数是为了限定膝盖节点的弯曲方向。 由此,IK的设置已完成。其中,主要步骤分为三步:(1)计算获取Socket节点的位移;(2)在Event Graph中设置该值为Effector Location;(3)在Anim Graph中使用Two Bone IK节点设置IK骨骼。 三、顶点动画 Unreal 4与Unity引擎都支持顶点动画,它常被用于制作面部表情以及布料等无法用骨骼驱动的动画。在Unreal 4引擎中被称为Morph Target,在Unity引擎中被称为Blend Shape。在Unreal 4引擎中,Morph Target可以被叠加到Skeletal Mesh上,形成顶点动画。其使用通常需要在Maya等3D建模工具中把顶点动画制作完成,并导入Unreal 4编辑器。然后,通过Event Graph中的Set Morph Target节点进行设置,如下图所示: 其中,Target表示Skeletal Mesh,Morph Target Name表示该网格中的某一个Morph Target,Value表示Morph Target与 Skeletal Mesh的插值系数,其取值为[0, 1]。当取值为0时,显示原始网格形状,当取值为1时显示Morph Target形状,取值0~1显示插值结果。其形变效果如下图所示:上图显示了角色左边眉头被挤压的Morph Target叠加到Skeletal Mesh上的结果。 四、Aim Offset Aim Offset在Unreal 4引擎中是动画模块中的一个特殊功能,其主要用于制作射击游戏的瞄准动画。本节UWA将重点介绍其使用方法。 Aim Offset本质上是一个动画融合的工具,它的操作方式类似Blend Space。不同的是Aim Offset用于融合的是角色在不同方向瞄准的Pose,Blend Space则是将不同的动画进行融合。在使用Aim Offset之前需要先创建角色在不同方向的瞄准动作,如下图所示: 然后,基于角色骨骼创建Aim Offset资源,如下图所示: 双击Aim Offset资源并设置好Yaw和Pitch坐标轴,即可将之前创建好的瞄准Pose拖入其中对应的位置,如下图所示: 其中,上图显示了设置好上下左右各方向的瞄准Pose后的坐标轴。使用Aim Offset时可以直接将其拖入Anim Graph中并与Locomotion输出Pose融合,如下图所示: 转动角色到不同方向即可融合出不同的瞄准动画,如下图所示: 五、动画模块小结 Unreal 4引擎提供了丰富的动画融合、重定向、IK以及顶点动画等工具,方便制作出逼真的动画效果。同时,其提供的功能同样非常强大,且在细节处足见其深厚的技术功力。其中,Animation Montage提供了将动画自由切分、组合、循环以及跳转的功能;Blend Space以及Aim Offset提供了根据二维参数以及动画样本进行动画融合的功能;Post Process Animation Blueprint提供了对动画骨骼信息进行访问和使用的功能,并且配合AnimDymanic可以支持角色身上配件基于物体的动画;IK和Morph Target功能则添加了角色动画的精准度和细节。 参考文献 【1】https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/Retargeting/index.html#retargetingusingthesameskeleton

我要回帖

更多关于 图像渲染引擎有哪几种 的文章