ue4_ue4教程 - CSDN
精华内容
参与话题
  • 虚幻4基础操作 - 初中生学UE4第一季

    万人学习 2019-06-26 11:56:43
    本课程是“初中生学UE4”系列中的基础操作部分,学完这个课程之后,同学们会对虚幻4有一个初步认识,并掌握虚幻4的基础操作。后续课程包括蓝图、动画、材质等方面。
  • ue4感受

    千次阅读 2017-08-12 17:21:03
    学了半个月的ue4,感觉ue4的蓝图功能很强大,同样蓝图也需要编程逻辑,第一步该干什么,接着该干什么,必须清晰,一步接着一步才能写好,同样的,要做游戏,必须c++技术还可以,很多游戏开放都是用c++做的,ue4画面...

    学了半个月的ue4,感觉ue4的蓝图功能很强大,同样蓝图也需要编程逻辑,第一步该干什么,接着该干什么,必须清晰,一步接着一步才能写好,同样的,要做游戏,必须c++技术还可以,很多游戏开放都是用c++做的,ue4画面很高,很好,但最大的缺点是打包太大,尤其是手机端,打包一个游戏需还是要很大内存,ue4也是做VR的好工具,学了半个月感觉就学了一个皮毛,还是很浩瀚庞大,学无止境。

    展开全文
  • UE4学习笔记(一):初识UE4

    万次阅读 2015-08-16 21:45:39
    通过制作一个上下浮动的圆锥来熟悉UE4

      我使用的UE4版本是4.8.3,首先,新建一个项目,建议跟我一样的初学者先建立一个空项目,以便于自己扩充来熟悉UE4,如图:
    新建项目
      这里需要注意一点,就是项目名称不能有中文,不然可能会出现一些奇怪的BUG。
      项目创建完成后会自动打开VS2013,当然前提是你电脑里得有。UE4与VS2013是交互使用的,比如你在UE4中添加一个类,那VS中也会自动添加一个类,并且包含基本代码,同样在VS中编写的代码编译后也会影响UE4,我只能说,32个赞!
      创建好项目后,我们首先来制作一个可以上下浮动的圆锥,作为学习UE4的第一步。
      首先,新建一个Actor类,类名为FloatingActor,就是我们制作的那个可以上下浮动的圆锥。
      创建类
      
      
      这时会显示正在编译c++代码,稍等一会编译完成后,你会发现VS中MyProject1文件夹下多了两个文件,FloatingActor.h与FloatingActor.cpp,是不是很方便?
      下面我们开始写代码,相信选择使用c++而不是蓝图来制作游戏的各位都不怕写代码吧。
      首先在FloatingActor.h中添加一个变量RunningTime,用来保存时间信息。

    class MYPROJECT1_API AFloatingActor : public AActor
    {
        GENERATED_BODY()
    
    public: 
        // Sets default values for this actor's properties
        AFloatingActor();
    
        // Called when the game starts or when spawned
        virtual void BeginPlay() override;
    
        // Called every frame
        virtual void Tick( float DeltaSeconds ) override;
    
        float RunningTime;
    
    };

      然后在FloatingActor.cpp中扩展一下Tick( float DeltaTime )函数:

    void AFloatingActor::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
        FVector NewLocation = GetActorLocation();
        float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
        //通过正弦函数来控制圆锥上下浮动
        NewLocation.Z += DeltaHeight * 20.0f;       //Scale our height by a factor of 20
        RunningTime += DeltaTime;
        SetActorLocation(NewLocation);
    }

      然后Ctrl+Shift+B编译一下,在UE4中也要编译一下,全都编译完成后,把我们的FloatingActor类拖到上方的关卡编辑器中,这样世界大纲中就会出现一个FloatingActor1对象,如图:


      选中它后我们添加一个圆锥,然后更改一下初始位置,单击运行,我们便可以看到一个圆锥在桌子上放上下浮动了。

      还有一点需要注意,用UE4制作的游戏是很大的,这么点东西,项目就已经1.5G了,还望大家做好心理准备。
      

    展开全文
  • UE4真实地形制作

    万次阅读 多人点赞 2018-08-28 21:40:57
    此方法特点是将现实中的地形于UE4中呈现,而不是手动绘制地形。首先从地理空间数据云获得指定区域的地理数据,然后使用GlobalMapper更准确选出区域并把数据转换成WorldMachine可识别的格式,通过WorldMachine生成...

    制作地形方法很多,今天给大家分享一种原创野套路。此方法特点是将现实中的地形于UE4中呈现,而不是手动绘制地形。首先从地理空间数据云获得指定区域的地理数据,然后使用GlobalMapper更准确选出区域并把数据转换成WorldMachine可识别的格式,通过WorldMachine生成准确地形,最后导入UE4修改细节并添加材质。

    目录


    1. 获得DEM数据
    2. 选取指定区域并转换格式
    3. World Machine地形处理
    4. 导入UE4制作地形

    1. 获得DEM数据

    通过政府网站获得准确的地形高程数据,世界任意位置可以通过www.usgs.gov 获取相关数据。但是国内项目基本只需要中国的地理数据,所以推荐地理空间数据云获得国内任意位置的DEM高程数据(USGS同样可以获得国内的DEM数据但是精度不高)。打开网页之后可以选择很多种搜索资源的方式,此处推荐高级检索,较为直观。
    这里写图片描述

    位置选择方式有几种,选择适合你的方式。此处使用地图选择,框选出吉林长白山的区域并点击搜索。左侧显示的列表是此区域所占的数据格。因为数据格是经纬度0.5 * 0.5 的格子,我们框选的区域恰恰在横向竖向分别跨了两个格子。所以我们需要下载四个文件。
    这里写图片描述

    2. 选取指定区域并转换格式

    可以下载GlobalMapper读取下载好的DEM数据,并截取我们想要的区域,切转换成World Machine可以识别的文件格式。此处使用的是GlobalMapper 10.0(链接:http://pan.baidu.com/s/1eRXSnOA 密码:jrf4)。打开此软件,将之前下载的dem数据解压,并且把名字后缀为dem的文件依次拖入GlobalMapper,并选择Yes to all。
    这里写图片描述

    四张图拼合之后的中心区域便是我们之前选择的长白山

    这里写图片描述

    左上角点击File选择导出elevation,并且格式选择HF2/HFZ
    这里写图片描述

    选项卡中第三个分页导出边界范围选择draw a box
    这里写图片描述
    按住SHIFT左键拖拽选择指定区域可以拉出长宽1:1的区域
    这里写图片描述

    点击确定之后选择导出位置。然后把此文件拖进GlobalMapper,点击Tools—Configure,修改显示单位
    这里写图片描述

    然后打开control center,点击选择最后导出的hfz文件,之后点击左下角选择Metadata,显示该区域的数据,三个数据需要记下来。面积,最低海拔高度,最高海拔高度。
    这里写图片描述

    3. World Machine(以下简称WM)地形处理

    下载安装WM (链接:http://pan.baidu.com/s/1i5e7J8p 密码:5wo7)
    打开WM, 选择项目设置,地形的宽和高是之前面积开根号 √7482 ≈ 86.499 ,右侧分辨率可以给1024作为预览的分辨率。分辨率越高构建速度越慢精度越高
    这里写图片描述
    第三个选项页的最大高度给一个512的倍数(由于单位换算,导入UE4时,Z轴缩放100倍相当于512米,此处给512倍数方便后续操作)并且高于之前测出的高度2743.145m。 于是此处给3072。
    这里写图片描述

    面板中添加file input节点
    这里写图片描述

    双击节点加载 .hfz文件,并且修改宽高与上面一致,下面的elevation调整与实际相同(最低海拔和最高海拔)
    这里写图片描述

    为了梳理流程,此处不进行复杂的修改和雕琢。直接连接一个Basic Coverage
    这里写图片描述

    双击进入,给R G B三种颜色表示三种不同区域,调整一下HEIGHT CUTOFF和SLOPE CUTOFF到你满意的效果。

    这里写图片描述

    将输出的RGB通道拆成单独通道的灰度图

    这里写图片描述

    连接heightmap output输出灰度图

    这里写图片描述

    最终地形后面需要连接一个height output输出高度图用于UE4中生成地形

    这里写图片描述

    同样还需要连接一个法线转换节点,并且连接bitmap output输出这个法线图
    这里写图片描述

    最终连接图如下
    这里写图片描述

    导出之前需要进行最终构建,所以进入项目设置把分辨率调成UE4支持的最大精度(UE4建议如下)
    这里写图片描述

    项目设置面板,修改分辨率8129*8129,下面勾选conserve memory,内存大的也可以不勾选。具体区别先不详解。
    这里写图片描述

    点击构建
    这里写图片描述

    如果内存够大,可以修改项目设置中第二个分页,然后选择最后面绿色的Tiled build
    这里写图片描述

    因为没有添加过多新节点,所以计算构建时间较短。计算结束后。分别选择不同输出节点选择输出路径和文件名。先选择格式,然后添加路径,最后选择write output to disk。注意高度图格式RAW16!
    这里写图片描述

    BITMAP导出格式为PNG 8 bit
    这里写图片描述

    单通道灰度图导出PNG格式
    这里写图片描述

    4. 导入UE4制作地形

    首先新建一个地图,然后创建一个初始材质,不用太细节。贴图细分由landscape coord控制,数值越大,细分越少。Landscape blend细节面板中添加三层,分别给不同的名字。
    这里写图片描述

    创建地形,从文件导入,文件选择raw16格式的Heightmap,材质连接刚刚创建的材质。Layers右侧点击+加号选择第一个权重,并且连接不同的对应的灰度图。Scale这里 X和Y值是我们实际的尺寸86499 / 8129 * 100 = 1064, Z值是之前WM输入的最大高度3072 / 512 * 100 = 600,最下面的alpha type选择 layered。
    这里写图片描述
    这里写图片描述

    如果没有显示正确,可以在地形的细节面板中重新添加一下此材质,有时会遇到显示错误的BUG。如果觉得天池中应该是雪不是岩石,可以用笔刷进行修改。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    如果想要达到下图这种效果,需要在WM中对地形进行很细节的刻画,以及对UE4中材质进行复杂的处理如贴图混合,法线混合等等。
    这里写图片描述

    另外有的小伙伴发现地面贴图重复度太高,很不真实,那么可以与平铺次数较低的贴图lerp一下解决。下面是对比图。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    END

    展开全文
  • UE4这些扰人的坑

    万次阅读 2017-05-22 19:49:49
    日本网站4Gamer曾刊登一篇文章,分享了使用UE4在图像渲染中会遇到的难点以及解决方法,分享人是该引擎的开发商Epic Games日本分公司的高级工程师篠山範明。在研讨会上,篠山首先展示了UE4的整体流程图,随后他对和...

    日本网站4Gamer曾刊登一篇文章,分享了使用UE4在图像渲染中会遇到的难点以及解决方法,分享人是该引擎的开发商Epic Games日本分公司的高级工程师篠山範明。在研讨会上,篠山首先展示了UE4的整体流程图,随后他对和流程图上各功能板块有关的技术进行了介绍。

    绘制物体缓冲的“Base Pass”时要注意的问题

    我们先来把整个流程分为不同的单元,在各个单元里进行深入解读。

    首先从上图左起第二个板块“Base Pass”开始。Base Pass等同于产生了物体缓冲(G-Buffer)。
    众所周知,UE4的绘制引擎采用了延迟渲染(Deferred Rendering)。所谓延迟渲染,是指将一个场景的几何体(3D模型、多边形)的光照、阴影、质感搁置到一旁,先着手于绘画,然后在后半段再对光照、阴影、质感进行处理的处理方式。
    即给人一种把原本的多边形先绘制出来的印象,实际上不仅要绘制多边形,前者的参数还需要配合后面光照和阴影的处理。其输出目标,在成为复数缓冲时具有普遍性,但是这里的缓冲我们称之为“物理缓冲”。
    为何要做这么麻烦的事情?其实延迟渲染有两个优点。第一个优点就是能将十分复杂的光照、阴影以每次一像素的方式进行处理。第二个优点是并不明确限定用于光照的动态光源数,所以可以进行丰富的光照渲染。
    现代游戏图像在绘制复杂的场景时需要大多的光源,而在移动复杂着色器的时候,最终其结果不是在画面上输出,而是通过像素着色器,处理像素的编写和撤销,导致耗时严重、性能下降。为了全力回避这一点而开发出的就是延迟渲染。(物体缓冲是指使用后照明和后处理特效的中间过渡环节)
    根据以上提到的这些,使用Base Pass输出物体缓冲需要注意的两点。
    第一点简而言之即“不绘制没进入视线的对象”。
    这种“投影剔除”(Frustum Culling),一般是通过CPU端来处理;为了整体覆盖被称为“包围球”(Bounding sphere)的各个3D对象,对象是否在视野内的判定标准,是通过预先设定的包围球来实行的。举一个包围球被错误(或是正确)设定的案子。这种情况下如果绘制没有被正确地剔除,会导致最终明明没有绘制,但作为GPU的绘制对象却投入了渲染管道(rendering pipeline),造成GPU产生多余的负担。什么程度的剔除会成功,可以通过Stat初始视图(Stat InitViews)指令的“视锥体裁剪基元(Frustum Culled Primitives)”进行确认。
    另外,实行强制冻结渲染(FreezeRendering)指令后移动镜头,就能够确认视野外绘制了什么。如果那个时点上,视野外本应剔除的3D对象被描绘了出来,就会显示出不能被剔除的理由。在这种情况下需要特别注意确认包围球的设置。(强制冻结渲染能够看到此时点摄像机提出的结果)
    Base Pass要注意的第二点,是“不计算多余的像素”。
    在图像处理的流程中,使用像素着色器实际处理前,会有运行深度测试(Z 测试)的“Pre Z 测试”这一步骤。从这里着手处理的像素,会因为被某个东西所遮挡而无法绘制出来,这时可以进行撤销处理。但是,像半透明对象这种会伴随α测试的绘制、视差遮蔽映射这种像素着色器处理后会重新编写深度值的情况,就不进行Pre Z测试,而通过处理实行分路迂回。(运行α测试的隐藏(Masked)材料)

    (像素深度撤销(Pixel Depth Offset)可以变更像素深度(Pixel Depth))
    但是,就算是不透明的对象,设定回避Pre Z测试之后,便无法撤销本来能够撤销的Pre Z 测试。这种情况是因为虽然用了像素着色器处理,但是(之后的)Z测试失败,这一操作被撤销了,虽然绘制结果没有变得奇怪,不过性能会跌落到最坏结果。

    Z值的预阶段“Z预阶段”的注意点

    下一个主题是“Z预阶段(Z Pre Pass) ”。UE4的渲染管道,是在Bass Pass的物体缓冲写出来之前,在仅预处理深度值(Z值)之后,运行Z预阶段。

    事先预处理深度值的目的,是将最终影像和同一深度缓冲的内容结果,在透视前获得。Z预阶段之后的Base Pass则是,参考预先得出的深度值缓冲进行Z预测试,因此通过在最终的画面里不留下像素痕迹(即编写后又被消去的像素),以回避像素着色器的运行。
    UE4只将背景对象这种静态对象计入Z预阶段,而动态对象则不计入Z预阶段,以上设定为默认设定。但是UE4可以按照客户要求来设定项目文件“早Z阶段(Early Z-pass)”和“动态早Z阶段(Movables in early Z-pass)”。
    或者通过勾选“作为遮光板使用(Use as Occluder)”可以设定各对象单位是否计入到Z预阶段之中。

    (各项目的关闭渲染选项里面,有“作为遮光板使用”这一项目。在设定为默认为ON时,勾选为off,就能够调整各项目单位是否参与早Z)
    通常默认设定应该就可以了,但是在多边形数很多的场景中,Z预阶段的运行本身会对GPU造成很大负担,所以这种场景下,上面提到的两个设定,通过选择on/off来比较性能可能会比较好。

    光照的前段处理“预照明”需要注意的点

    UE4中通过血溅和弹痕这种投射材质贴图来实行的印花式绘制,是在光照(Lighting)之前,即通过“预照明(Pre-Lighting)”部分来处理并设计的。对于后段的光照处理,可以将印花式绘制囊括在光照对象里。
    和印花绘制相同,“从所有方向插入有关假想环境光的遮蔽率”(Ambient Occlusion,环境光遮蔽)的处理,也能通过预照明来完成。

    与这种预光照绘制相关的麻烦已经成了常见问题,比如“印花被描绘得照明颜色过深”、“设置天窗后,印花下面变透明了”等等。从结论来说,这是“UE4的做法”,当然UE4也提供了回避此类问题的对策。那就是“延迟贴花(DBuffer Decals)”功能。所谓延迟贴花(或称Deferred Decal),是指和将印花进行物体缓冲不同,而是使用被称作“延迟贴花”这一印花专用特殊缓冲来进行绘制,用物体缓冲进行光照和阴影处理之后,延迟贴花的内容也反映并实行了出来。印花的绘画结果统合到了物体缓冲之中后,也因此出现了上文提到的问题。为了回避这个问题,要准备专用的缓冲。
    但是,加上利用物体缓冲这一条件,绘制比之前的处理线程更多,绘制负担变高也成为其瓶颈。
    虽然导致负担变高了,但是应该实行印花表现而导入物体缓冲吗?还是说应该选择别的表现方式来回避延迟贴花,这需要开发者好好考虑后再做决定。

    通过光源周围的处理而改变性能的“照明”阶段

    接下来,篠山说明的是光照的阶段。UE4的光照分为“静态光照(Static)”、“固定光源(Stationary)”、“动态光照(Movable)”三种光照范畴。最先提到的静态光照,为通过全部事先计算过的光线映射来处理的静态光照。这一事先计算,可以使用专用的光照烘培,来计算将间接光都考虑在内的光照。
    其次是固定光源,固定光源的光照本身是以实际时间来运行的,但是只有阴影计算是事先进行了处理的。
    具体而言,固定光源在UE4的图像引擎内部会被当作一般的动态光源,但配置到场景里又成了基本不动的光源。因为它不动,所以也可以在阴影贴图中用于预先生成阴影。
    虽然有点复杂,但这种做法有个好处,就是配置的固定光源一组最多可以放置4个,其内部处理是稍有限制。
    固定光源预生成的阴影贴图中,一个光源能够分别对应αRGB中4条通道的像素格式。也就是说,第一个光源对应α通道,第二个光源对应R通道,以此类推。所以在αRGB中最多对应四个光源,一组光源的上限也就是四个。
    如果设置第五个固定光源,那么它将被当作动态光源来处理,即便是定义为固定光源,也不会提升其性能。(固定光源在一张阴影贴图上最多设置4个,超过第五个将被视作动态光源)
    而动态光源如前文所述,包括阴影生成在内,它将完全在运行时进行处理。
    我们之前说过延迟渲染下动态光源的数量不受限制,再来看它实际的性能。
    设置两组对比场景,一是将100个照射范围狭小的动态光源放置到同一场景内,二是将8个照射范围较大的光源放置到同一场景内,对比两者的负荷大小。

    得出的结果是后者的负荷更高。这里的负载大也可以看作是计算量大。而计算量的大小,取决于场景内各个像素受到多少个光源的照射。所以比起处理八个像素各自被一个光源照射,处理一个像素被八个光源照射的负荷要更高。负荷率大小:蓝>绿>红。UE4可以通过光效复杂性(Light Complexity)功能来查看光源的处理负荷,所以在设计的时候,可以不依赖延迟渲染的特性,而通过精确计算光源负荷来构建场景。(通过光效复杂性功能,就可以查看已设置的光源的负荷率)

    光照反射存在最优解吗?

    不仅限于UE4,在所有即时游戏的美术中,需要不少设计技巧的就是光照反射(Reflection)。
    如果反射的材料是镜面反射更强的金属类,那么周围的场景就应该被映入其中,如果以材料的角度来看,就相当于受到了周围所有光源的照射。光照反射要应对的就是周围所有的光源,所以它是在表现材料材质的时候,关于真实程度的关键要素。
    在UE4当中,有三种反射生成方法来处理会引起镜像、映照等情况的材料,如下图所示。第一种是采用反射探头来生成静态反射。
    在场景的任意位置都可以预先设置坐标,然后可以进行全方位的透视,最后会生成立方环境贴图(CubeMap)材质。而这里的预生成坐标点,被称作反射探头(Reflection Probe)。

    (静态反射就好比是反射探头处拍下的360°照片)
    关键的问题在于:在反射探头处获得的全方位场景,应该影响到场景内多大的范围。
    依然采用对比分析,首先在一个场景里配置一个静态反射,将其设置为影响整个场景;再配置200个静态反射,设定为只能影响非常狭小的范围,可以看到两者的绘制负荷差距不大。但是在设置了200个静态反射的例子中,如果将各自的影响范围调大,符合就会急速增大。
    其原因与动态光源的例子相同。如果将多个静态光源的影响范围扩大,那么在绘制一个像素的时候,就必须参考计算多个静态光源的参数,负荷自然就增大了。(稍微调大200个静态反射的影响范围,负荷就立刻增大)
    其实,已经配置了相邻的反射探头时,再将两者的影响范围重叠的意义并不大。反射探头的设置以及其影响范围的设定如果不合情合理,那么就会增加很多无效的计算负荷。
    如下图实例的配置就更为合理:红圈:让整个场景都处于光照反射的影响范围内。
    覆盖各个房间的蓝圈:主要的静态反射,在这里可以定义大致的统筹性参数。
    绘制物件细节的绿圈:仅配置在能产生光照反射的特殊物件上。
    第二种是屏幕空间反射(Screen Space Reflection,简称SSR)。
    屏幕空间反射会根据透视图的结果,在画面坐标系中进行局部的光线跟踪,在运行时刻(Runtime)上实时生成计算结果。
    这种处理方式的好处是,即便仅截取场景中任意一瞬间的画面,也会精确地反映出动态角色以及动态光源影响下的光照反射。相对的缺点,就是对于画面外场景的影响,会被完全无视掉。
    使用SSR最典型的报错,就是暴露了这个缺点所造成的。弥补它的有效方法,就是结合静态反射来做处理。如右图,岩壁左侧被画面隔断的地方,应该在水面中被反射,但是因为岩壁被隔断在画面之外,所以无法被正确反射。第三种是平面反射(Planar Reflection)。
    这是将场景准确的映入平面的光照反射处理手段。如下图实例,以水平面为反射面,从视点E来看右侧的岸边,那么相当于在水下的视点E'来透视上下颠倒的岸边的场景。所以被反射的场景需要进行两次绘制,光照反射处理的负荷必然会高出不少。

    又因为处理负荷比较高,所以平面反射常限定在水面等平面上使用,同时画面的品质非常高。由于这些特性,比较推荐在过场动画中使用平面反射的处理。比如《地狱之刃》在GDC 2016上放出的宣传片,其中就使用了平面反射的处理技术。

    关于半透明的各种问题

    不仅限于UE4,半透明物件的绘制在实时图形绘制领域都算是很难处理的问题。UE4在绘制半透明物件时也会遇到不少棘手的问题。
    离我们最近的问题,可以说就是粒子效果,可能是因为日本的画师都特别喜欢粒子效果,所以对它比较关心吧。
    UE4在绘制半透明粒子效果时,不会更新深度值(Depth)。(将特效配置在场景中)(但深度值没有变化)
    这种情况下会产生的问题就是,将深度值设为关键值时,后期处理会变得很奇怪。
    如下图所示,聚焦到中间的火焰时,利用景深来让图像增加朦胧感,但火焰的粒子效果在地平线上方的都被模糊了,下方则没有变模糊,这样的图像就非常奇怪。这就是因为火焰的粒子效果没有深度值,所以Z缓存(Z buffer)里只存在地面的制图深度值。再加上地平线上的背景里镜头非常的遥远,所以背景和火焰都被判断为离镜头非常遥远,就被做了模糊处理。模糊处理器是无法判断有没有火焰粒子效果的,于是就成了这副样子。
    为了解决这类问题,就要使用到独立透明度(Separate Translucency)功能。
    使用时,半透明粒子效果在绘制时仍然不会更新深度值,但它被分离到别的缓存中,与景深等后期处理分开。
    换句话说,就是将半透明物件与不透明物件的绘制分开,在后期处理时优先应用于不透明物件。这种情况下会产生的问题就是,将深度值设为关键值时,后期处理会变得很奇怪。
    如下图所示,聚焦到中间的火焰时,利用景深来让图像增加朦胧感,但火焰的粒子效果在地平线上方的都被模糊了,下方则没有变模糊,这样的图像就非常奇怪。在通常的后期处理中,粒子效果的绘制与普通场景的绘制是在同一缓存里处理的:而利用独立透明度功能,就可以将粒子特效分离到另一个缓存里,并将其与后期处理分隔开,对比两种处理效果的区别。利用这个功能的确能够避免半透明粒子效果出现一些奇怪的模糊情况,但是却没法给它添加适当的模糊处理。所以即便能够避免问题,但解决不了实际的困难。
    所以即便是UE4,也会存在很多限制,而引擎的开发方还在试图解决这些问题。
    而在半透明绘制方面,还存在一个很棘手的问题,也就是绘制的负荷过高。首先可以思考一个问题:让画面整体的颜色都改变的后期处理,与近让画面一部分出现冒烟的粒子效果,哪边的处理负荷更高?简单的看,可能因为画面整体的像素数很多,所以可能是前者更高,但其实答案恰恰相反。
    乍一看,半透明粒子效果的烟雾仅占画面的一小部分,实际上它是经过多次重叠绘制而成的。查看粒子的驱动线的框架,原因就一目了然了。在画面的同一部分,烟雾的粒子改变大小并反复绘制了多次。我们可以用着色复杂性(Shader Complexity)功能的排错视图,来查看。
    在这个视图中,重复绘制的区域会用红色表示,可以借此判断产生问题的部分。越红则表示改区域中,粒子绘制的负荷越高,需要调整。降低粒子绘制负荷最有效且最简单的手段,就是用独立透明度功能,将粒子绘制分离到别的缓存重,用低分辨率进行绘制。
    可以将反复绘制、重合的半透明粒子用低分辨率绘制,再调整好合适的大小,与主透视图合成就可以了。如果将绘制半透明粒子的缓存降低为纵横各半的分辨率,那么简单算下来绘制负荷就能变为原先的1/4,要是再将其减半,就能变为1/16。在低分辨率的缓存里绘制,然后扩大并合成,就意味着粒子的轮廓会变得更加模糊,而原本就是半透明的粒子即便更模糊一些,产生的影响也不会有多少。但分辨率调得过低,也会暴露出分辨率不高的问题,所以选择缓存分辨率的时候要相当慎重,与负荷变化放在一起寻找最佳的配置。以下三张图就是在半透明物件的缓冲分辨率在100%、50%、10%的绘制状态下,绘制负荷的变化。
    粒子绘制的符合降低方法还有一种,就是在粒子动画中,完全透明区域更多的时候可以用到的粒子剪影(Particle CutOut)功能。
    通常的粒子是由两个多边形构成的,而粒子剪影的原理,就是为了避开完全透明的区域,由多个多边形自动分割来进行绘制。
    虽然这样一来多边形的数量会增加,但由于能够避免像素着色器的无意义运行,所以在大量的粒子进行绘制时,这或许会减轻负荷。粒子剪影会自动分割多边形:利用着色复杂性功能的排错试图,可以看到左侧的四边形粒子,与右侧的多边形粒子,在绘制时产生的重复绘制区域更少:

    UE4中顺序被固定的后期处理

    后期处理就好比相片修饰一样,需要对最后的绘制结果进行加工处理。
    相片修饰通常是针对2D的照片,在3D游戏内的图像方面,由于需要利用透视图中附带的多种信息,对图像进行三维的加工,所以两者差距非常大。部进行后期处理(左)与进行后期处理(右)的区别如下图:UE4中预设了诸如色调、景深、光晕等加工图像的多种表现形式。而UE4比较有特色的是,能够将后期处理的效果,设置到3D场景内的指定位置,或者是特定的摄像头上,所以能够实现诸如“进入3D场景某个位置的时候就会有景深的表现”,或是“在这个摄像头上绘制图像的时候需要棕色调”等效果处理。所以在用UE4的后期处理时,建议最好熟记处理的顺序,因为处理顺序无法改变,只能按部就班地进行。

    结语

    尽管文章到此结束了,但其实还有很多内容没有提到(几百页ppt),仅从提到的内容来看,也能发现,对于想要用UE4做好游戏的开发者来说,花时间打磨游戏的细节是必不可少的,而这份指南能切实的解决很多使用上的问题。感兴趣的读者可以访问下面链接:http://www.slideshare.net/EpicGamesJapan/cedec2016-unreal-engine-4

    展开全文
  • UE4使用unlua、EmmyLua 和IDEA开发 一:相关软件/插件的下载安装 1、UnLua :https://github.com/Tencent/UnLua 2、IDEA:自搜 二:IDEA的安装破解以及安装EmmyLua插件 自己解决 三: UnLua导出 智能提示 1、修改...
  • UE4&lua

    千次阅读 2019-04-23 19:44:53
    UE4层面 Entity(c++)---------->ACharacter/APawn M V&C lua层面 Entity(lua)----------->Entity Controller------------>Actor M ...
  • UE4热更新:基于UnLua的Lua编程指南 https://zhuanlan.zhihu.com/p/117236078 另外,Lua文件打包成Pak可以用我之前开源的UE资源打包工具:hxhb/HotPatcher,而且我基于UnLua自己修改了一个版本,添加了一些额外的...
  • 如New一个ResLoader.h 类: 通过NewObject 实现: --@param outer:UObject对象 function UObjectLoader.CreateLoader1(outer) this.index = this.index + 1;... --踩的坑:传入name,会寻找name是否已存在的c++...
  • UE4 引擎剖析 - UnLua插件 https://zhuanlan.zhihu.com/p/79050796 一、UnLua模块的初始化: class FUnLuaModule : public IModuleInterface { public: virtual void StartupModule() override { // 创建Lua环境 ...
  • UE4移动组件详解(一)——移动框架与实现原理

    万次阅读 多人点赞 2018-03-03 11:27:33
    关于UE4的移动组件,我写了一篇非常详细的分析文档。由于篇幅比较大,我将其拆分成三个部分。分别从移动框架与实现原理,移动的网络同步,移动组件的优化与改造三个方面来写。这三篇文档中难免有问题和漏洞,所以我...
  • UE4UE4读写Json文件

    千次阅读 2019-11-08 10:18:26
    如果我们想要在UE4中读写Json文件,那么我们必须使UE4包含Json和JsonUtilities这两个模块,那么UE4如何添加模块呢? UE4添加预定义模块的方法很简单,我只需打开工程的.Biuld.cs文件,在其中的...
  • 注意:离线安装是指不用通过Epic的客户端下载巨大的安装包,但是某些步骤还是需要网络连接的。并且Epic的账号也是需要的。 下载地址见文章最下方
  • UE4UE4内嵌Web及与Web通信

    千次阅读 2020-06-18 10:59:24
    UE4嵌入Web及UE4到Web的通信,我使用UE 4.22.3版本,以UE4嵌入ECharts并与ECharts通信为例。 一、自定义WebBrowser UwebBrowser是UE4自带的用于浏览Web的插件类,为了后面进行UE4与Web的通信,所以这里我们需要...
  • UE4蓝图碰撞检测解析

    万次阅读 多人点赞 2020-02-04 16:44:10
    虽然UE4官方文档对碰撞好像讲的很清楚,但是尝试的时候发现有很多问题,而且和官方文档描述的总会出现一些差异,所以自己总结一下所有有关碰撞的内容,持续更新吧~ 下面总结了一般的碰撞以及多组件碰撞的一些...
  • UE4摄像机系统解析

    万次阅读 多人点赞 2018-03-03 11:57:01
    一.摄像机工作原理在游戏中,摄像机是玩家的眼睛,他控制了玩家的视点(POV即PointOfView,后面简称POV)位置以及玩家的视野大小(FOV即FieldOfView,后面简称FOV)。一句话,摄像机决定了我们去观察这个游戏世界。...
  • UE4网络同步(二)——深入同步细节

    万次阅读 热门讨论 2019-12-05 20:37:41
    前言 UE同步是一块比较复杂而庞大的模块,里面设计到了很多设计思想,...PS:如果只是想知道怎么使用同步,不建议阅读这篇文章,不过可以参考我另外一篇博客 UE4网络同步(一)——理解同步规则 另外,博主参考的源...
  • UE4物理模块分析

    千次阅读 2019-12-05 20:15:42
    (官方文档链接,UE4蓝图碰撞检测解析,UE4碰撞规则详解(2016.7.12更新)) 这里主要是从代码方面,简单分析一下UE4里面的物理是如何使用与生效的,StaticMesh以及SkeletalMesh对应的物理都是如何产生与作用的。第...
  • 解决UE4缓存使C盘膨胀的问题

    万次阅读 多人点赞 2019-12-10 23:03:49
    大家好,可能很多新手使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故。下面来告诉大家怎么解决这个问题。 概述 一、出现的问题:UE4的缓存文件会导致C盘膨胀! 二、解决的...
  • ue4卡通渲染

    千次阅读 2018-08-27 18:03:32
    UE4中的卡通渲染效果 卡通渲染材质 色块的实现方式是,判断光照方向和角色法线之间的关系,根据点乘的结果,划分几个范围,涂上不同的颜色。这就造成了色块的效果。 如下是材质。要完成还要对光源进行设置。....
1 2 3 4 5 ... 20
收藏数 74,674
精华内容 29,869
关键字:

ue4