当前位置:首页 » 编程软件 » ue4怎么编译材质

ue4怎么编译材质

发布时间: 2022-08-18 06:01:34

㈠ ue4 paper2d 材质

纹理材质。
是Paper2D的核心,是一种纹理映射平面网格物体和相关材质。在UE4中可通过Sprite编辑器对sprite进行编辑,并利用Flipbooks实现基于sprite的动画。
UE4,即虚幻4,它是一套为开发实时技术而存在的引擎工具目前广泛应用于3D建模渲染,游戏开发中。

㈡ ue4怎么编写无衔接的材质

选择一维数值,调节金属感和粗糙度
三维基础颜色(想要啥颜色就选啥颜色)与主节点链接,调节各个数值便可调节出相应的金属材质

㈢ UE4粘液材质

纹理材质。UE4是Paper2D的核心,UE4粘液是一种纹理映射平面网格物体和相关材质。在UE4材质中可通过Sprite编辑器对sprite进行编辑,并利用Flipbooks实现基于sprite的动画。虚幻4是一套为开发实时技术而存在的引擎工具,广泛应用于3D技术。

㈣ 虚幻4怎么延迟改变材质

首先在看这个系列之前,你需要具备以下:
(1)至少要敲过简单的渲染器,不管是拿dx敲还是拿gl敲或者vk之类的。
(2)对虚幻引擎有一定了解,对虚幻的渲染有一定了解。可以看我前几篇文章,或许可以有所帮助。
(3)C++基础。其实本人c++水平也是一般般(常常受到公司程序大牛的鄙视,不过我是美术)。
(4)至少一块RTX显卡可以用来做实时光线追踪(2019年)
随着引擎版本的更新,后续会逐步加入新版本。那么下面就正式开始吧!
【概览虚幻4渲染管线】
首先,虚幻有很多个管线的。Mobile管线和Deferred管线。首先找到
在这个函数里你将会看到很多熟悉的函数名称
虚幻就是通过调用这些函数来一步步绘制的。是不是很眼熟?这个就是各大论坛啦,博客啦讲的虚幻渲染流程的真面目。
下面就是官方的DrawOrder了。那么这个顺序是怎么来的呢。就是上面那个函数的调用顺序。
再打开这个Render函数,你就将看到延迟渲染一帧所调用的各个函数。(反正我看了半天就看到个大概的渲染顺序之外,还是啥也不知道)
那么当我们把一个模型托到场景里,这个模型被渲染出来的整个流程到底是什么样的呢?这个流程其实是非常庞大的。下面我就来一个一个拆分。
(1)第一步:资源准备阶段。这个阶段包括顶点缓冲区的准备,索引缓冲区的准备。这一步由场景代理管理完成。当然从磁盘里读取模型资源这些就涉及到StaticMesh这些了。想了解这一步可以去看我以前的博客,或者直接去看UPrimitiveComponent,UMeshComponent,UStaticMeshComponent,UCableComponent,UCustomMeshComponent。当你把这些源码全部研究一遍后,这个阶段算是了解了。这个阶段我不打算再描述了,因为已经有了很多现成的代码了。
(2)第二步就是shader资源的准备了,这个又是一个非常大的话题了。可以去看我以前关于给改材质编辑器和加shadingmode的文章便可以有个大概的了解。这一步我还会进一步阐述。
(3)第三步就是绘制了。
我们先不看Render函数那些复杂的调用,我们把精力先集中到shader层面来。一张画面是怎么开始绘制的呢?

通过这个我们便能知道一个大概的绘制流程(千万别以为虚幻只有这几步,不过主要的大概的流程是这样)。先绘制那些深度啊,初始化视口啦我们先不管。我们来看下这个BasePass。这个BasePass干的事情就是把GBuffer画出来。
这里就是像素着色器的入口。绘制完这一步后,我们就有了GBuffer然后再绘制剩下的。环境遮罩骤就先不说了。来看看最重要的光照部分。
光照部分的入口在这里:
虚幻的TiledDeferredLighting的渲染方式。不知道这个的去看毛星云的RTR3的博客的光照那节,讲得特别好。这里给个传送门:
https://blog.csdn.net/poem_qianmo/article/details/77142101
这里会调用
GetDynamicLighting这个函数会调用
这里会接着调用
看到这里就很熟悉了,看过前面我修改shadingmode的博客应该会对这里很熟悉。
lighting绘制完了之后就会绘制一些反射啊之类的东西了,然后就是透明物体啊后期啊。这些后面会慢慢分析他们。我们先把两个最重量级的研究了。
接下来我们研究一下fog渲染阶段。找到FogRendering.cpp你就会发现,其实绘制fog的是一个globalshader。前面绘制各个物体的是materialshader。
你会发现绘制fog的是一个globalshader。虚幻一共有这么几种shader:Globalshader materialshader和meshshader。
这篇博客只是一个概述性和引导性的。只是说明一下虚幻绘制的一个大概情况。下一卷我将演示一下怎么自己写个shader,引擎识别它,编译它,然后如何cpu和gpu进行信息交流的
4.20的Unreal渲染模块有了较大改动。
主要是为了配合引擎新增特性和性能优化。不过大体上的流程还是和上个版本的保持一致。
为了给LTC让道,所以shader做了大面积重构。
ShadingModel改为了IntergrateBxDF
下面会对绘制流水线详细写一遍,由于量巨大所以我会慢慢更新。
(1)【InitView】
引擎代码注释写得非常简单:Initialize scene's views.Check visibility, build visible mesh commands, etc.
这是渲染管线的开始,这步是为渲染管线准备绘制当前帧所需要各种资源。后面的管线就是判断一下画不画,绑定一下状态和RT然后就画画画就好了。这一阶段做的事情非常多也非常杂。首先来看看一些主要的
ComputeVisibility
可见性剔除有很多种技术,引擎会使用多种方法进行组合剔除,把没必要渲染的东西剔除干净,最大限度在渲染之前就做到最省。
虚幻提供了几种剔除方法
他们各有优劣,可以根据不同平台和情况进行选择。
VisibilityMap
在后面会把视口中可见性属性是非可见的物体剔除掉。
PrecomputedVisibilit
在场景中可以使用预烘焙的可见性数据。
如果当前视口场景中有可见性烘焙数据就会启用可见性烘焙的剔除方式
ViewFrustomCulled
做完前面的步骤后,还会进行视锥体剔除,并且大部分情况下,视口会使用视锥体剔除
进行视锥体剔除后可以减少大部分没必要绘制的图元
这时再配合各种其它的剔除方法就可以进一步剔除
而这里的“其它的剔除方法”包括但不限于PrecomputedVisibility,Distance,DynamicOcclusion
DistanceOcclusion
不在距离范围内就不绘制,非常简单有效的绘制方式。这种剔除方式挺适合地面上摆的小物件,摆的一些decal或者小道具,对大型建筑不适合。
Hardware Occlusion Queries
硬件的可见性剔除。这种方法将每帧的可见性检查作为每个Actor的查询发出。 Actor的可见度在一帧之后被回读 - 如果相机移动得非常快,有时会产生不利影响,导致它们“弹出”。 硬件遮挡的成本随着在GPU上执行的查询的数量而变化。 使用距离和预计算可见性方法可以减少GPU每帧执行的查询次数。
在各种剔除后,在InitView的最后会根据这些数据建立MeshPass
(2)【EarlyZ-PrePass】
EarlyZ由硬件实现,我们的渲染管线只需要按照硬件要求渲染就可以使用earlyz优化了,具体步骤如下:
(1)首先UE4会把场景中所有的Opaque和Mask的材质做一遍Pre-Pass,只写深度不写颜色,这样可以做到快速写入,先渲染Opaque再渲染Mask的物体,渲染Mask的时候开启Clip。
(2)做完Pre-pass之后,这个时候把深度测试改为Equal,关闭写深度渲染Opaque物体。然后再渲染Mask物体,同样是关闭深度写,深度测试改为Equal,但是这个时候是不开启clip的,因为pre-pass已经把深度写入,这个时候只需要把Equal的像素写入就可以了。
关于EarlyZ的具体详解可以去看参考文章【1】
首先渲染prepass的第一步肯定是渲染资源的准备啦。primitive资源会在InitView的时候准备好。
然后会再BeginRenderingPrePass函数中设置各种绘制管线的绑定,包括关闭颜色写入,绑定Render target
然后再调用draw之前会把各种UniformBuffer和渲染状态设置好
然后调用draw
最后完成PrePass的绘制
(3)【ShadowDepthPass】
根据不同的灯光类型会绘制不同种类的shadowmap。总的来说绘制shadowmap的时候不会使用遮挡剔除。
Unreal渲染shadowmap目前我就找到个视锥剔除
shadowdepthpass可能是在basepass之前,也可以是之后,具体看EarlyZ的方式
我们的灯光种类繁多大致可以分为两类,一类使用2Dshadowmap的,一类使用Cubemapshadowmap的
上图的1部分就是渲染2DshadowMap,2部分渲染的就是Cubemapshadowmap,这一步只是渲染出shadowmap供后面的Lightingpass使用。
(4)【BasePass】
BasePass使用了MRT技术一次性渲染出GBuffer。
再上一次GBuffer的数据分布
BasePass把GBuffer渲染出来之后就可以供后面的LightingPass使用了。我们的材质编辑器再Surface模式下也是在生成MaterialShader为BasePass服务
这部分可以去看看我的材质编辑器篇有详细介绍。
也是通过一系列设置绑定渲染状态资源等,最后调用dispatchdraw
可以注意到,MRT0是SceneColor而不是BaseColor
Scene在BasePass中做了简单的漫反射计算
这一步用到了,这个测试场景我是烘焙过的,我把烘焙数据去掉,SceneColor其实是这样的:
啥也没有黑的
BasePass会在这个阶段把预烘焙的IndirectLiting计算到SceneColor这张RT上供后面的pass使用
(5)【CustomDepthPass】
上面的图渲染了一个球的customdepth(在红圈处可以看到一个球,可能不是很明显哈)。CustomDepth没啥特别的,就是把需要绘制CustomDepth的物体的深度再绘制一遍到CustomDepthBuffer上。
(6)PreLightingPass
虚幻封装了一套方便画PostPass的机制,后面的绘制SSAO,Lighting,SSR,Bloom等各种pass都是用的这逃Context的机制。
PreLighting这步主要是在用前面的GBuffer算decals和SSAO为后面的Lighting做准备。
SSAO使用的是FPostProcessBasePassAOPS这个C++shader类。
对应的USF是PostProcessAmbientOcclusion
并且使用Computeshader来加速计算。
(7)【DirectLightPass】
LightPass也非常复杂,整个pass的代码有几千行,shader代码也有几千行非常恐怖的系统。我们先找到入口函数:
(1)方向光
根据不同的情况,使用不同的渲染策略
渲染不同情况下的灯光大体分类如下。还会根据不同的渲染方式分类。
比如一般的方向光:
在渲染方向光的时候因为不需要考虑分块,所以直接把每盏灯挨个画出来就可以了
下面我只放了一盏方向光
下面我放三盏方向光:
(2)TileDeferredLighting
如果灯光不渲染阴影,并且灯光没用IES并且灯光数目达到80盏以上(4.22)并且启用了TileDeferred管线,那么虚幻4就会使用TileDeferredLight来计算光照,虚幻实现TileDeferrdLight使用的是一个Computeshader
有很多灯光使用的潜规则。
(8)【ScreenSpaceReflectionPass】

(9)【TranslucencyPass】
透明物体会放在最后渲染,但是在后期的前面。需要看是否在DOF(景深)后合并。
对于这个上图的那个场景来说,透明物体渲染的buffer是长下面这样的:
最后在后期中组合
如果没有启用r.ParallelTranslucency透明物体只能挨个渲染。
如果启用了就可以走上面的并行渲染分支。
透明物体的渲染在实时渲染中一直比较迷,会有各种问题。比如排序等等。在默认情况下是走AllowTranslucentDOF的。AllowTranslucentDOF是什么意思呢,代码的注释里有解释。
Translucent物体的渲染有几种模式:
这里的代码我们在BasePassPixelShader.usf里能找到
对于非透明物体来说basepass是渲染GBuffer的,但是对于透明物体来说,BasePass是渲染基础的+Lighting的,会在这里一次性渲染完,如果我们想改透明物体的shading方式,就需要用在这里改了。

㈤ 如何学习Unreal Engine 4的材质系统源代码

双击GenerateProjectFiles.bat文件,一分钟后会生成一个UE4.sln
用Visual Studio 2013打开UE4.sln

进入后按F5进行编译,时间较长请耐心等待
(外星人20分钟,小编的机子1.5小时,听说还有2小时的,心里瞬间平衡多了……)

打开图示目录(Win32和Win64文件夹是按机子的信息打开)
找到UE4Editor.

看可以在桌面创建一个快捷方式。

打开中……

出现这个窗口后,可以选择你想要的类型,下面的框是命名。

扩展后还可以更改文件目录。

㈥ ue4怎么渲染

虚幻引擎在FEngineLoop::PreInit中对渲染线程进行初始化。使用ue4渲染慢卡顿可以借助云桌面来完成渲染。
渲染线程的启动位于StartRenderingThread全局函数中。
创建渲染线程类实例
通过FRunnableThread::Create函数创建渲染线程
等待渲染线程准备好,从TaskGraph取出任务并执行
注册渲染线程
创建渲染线程心跳更新线程
渲染线程的主要执行在全局函数RenderingThreadMain中,游戏线程会借助EQUEUE_Render_COMMAND宏,向渲染线程的TaskMap中添加渲染任务。渲染线程则不断的提取这些任务去执行。
这里需要注意,渲染线程并非直接向GPU发送指令,而是将渲染命令添加到RHICommandList,也就是RHI命令列表中。由RHI线程不断取出指令,向GPU发送。并阻塞等待结果。此时,RHI线程虽然阻塞,但是渲染线程依然正常工作,可以继续处理向RHI命令列表填充指令,从而增加CPU时间的利用率,避免渲染线程凭空等待GPU的处理。
渲染架构
虚幻引擎对于场景中所有不透明物体的渲染方式,是延迟渲染
对于半透明物体的渲染方式,是前向渲染
在虚幻引擎中,先进行延迟光照计算不透明物体,然后借助深度排序,计算半透明物体。
FDeferedSceneRender::Render函数
1、初始化视口 InitViews
进行必要的可见性剔除。分为三步:预设置可见性,可见性计算,完成可见性计算。
预设置可见性 PreVisibilityFrameSetup
1.根据当前画质,设置TemporalAA的采样方式,同时确定采样位置。采样位置用来微调视口矩阵。TemporalAA采样,每一帧渲染的时候,让这个像素覆盖的位置进行微弱的偏移,然后混合前面几帧的渲染结果。
2.设置视口矩阵,包括视口投影矩阵和转换矩阵。
可见性计算 ComputeViewVisibility
1.初始化用于可视化检测的缓冲区,位数组,用0和1表示是否可见。翻译为位图BitMap
2.视椎体剔除,对应函数FrustumCull,该函数内部使用ParallelFor函数的线性剔除,进行并行化的异步剔除。
3.遮挡剔除
4.根据可见性位图,设置每个需要渲染对象的可见性,即Hidden flags
5.开发者控制对象可见
6.获取所有对象的渲染信息,对应函数是每个RenderProxy的GetDynamicMeshElements函数。
网格物体组件对应的容器是RenderProxy,材质对象的容器是MaterialRenderProxy
完成可见性计算 PostVisibilityFrameSetup
1.对半透明的对象进行排序。半透明对象的渲染由于涉及互相遮挡,必须按照从后往前的顺序来渲染。
2.对每个光照确定当前光照可见的对象列表
3.初始化雾与大气的常量值。
4.完成对阴影的计算。包括对覆盖整个世界的阴影,对固定光照的级联阴影贴图和对逐对象的阴影贴图的计算。
虚幻引擎的剔除方式是借助ParallelFor的线性剔除,并行化的线性结构剔除在性能上优于基于树的剔除。
2、PrePass 预处理阶段
降低Base Pass的渲染工作量。通过渲染一次深度信息,如果某个像素点的深度不符合要求,这个像素点就不会进行工作量最大的像素渲染器计算。
不是基于分块的GPU,渲染器的EarlyZPassMode参数不为DDM_None,或GEarlyZPassMovable不为0,才会进行PrePass计算。
对象的渲染按照设置渲染状态,载入着色器,设置渲染参数,提交渲染请求,写入渲染目标缓冲区的步骤进行。
设置渲染状态 SetupPrePassView
关闭颜色写入,打开深度测试与深度写入。PrePass不需要计算颜色,只需要计算每个不透明物体像素的深度。
渲染静态数据
三个绘制列表由静态模型组成,通过可见性位图控制是否可见。
只绘制深度的PositionOnlyDepthDrawList
主要绘制不透明物体的DepthDrawList
带蒙版的深度绘制列表MaskedDepthDrawList,蒙版对应材质系统中的Mask类型
渲染动态数据
通过ShouldUseAsOccluder函数询问Render Proxy是否被当做一个遮挡物体,是否为可移动,决定是否需要在这个阶段绘制。
写入渲染目标缓冲区
通过RHI的SetRenderTarget设置。
TStaticMeshDrawList::DrawVisible函数
绘制可见对象
绘制可见对象的基础是可见对象列表,在绘制之前,每个绘制列表已经进行了排序,尽可能共用同样的绘制状态。
每个绘制列表都共用以下着色器状态,区别只是在于具体参数不同:
顶点描述 Vertex Declaration
顶点着色器 Vertex Shader
壳着色器 Hull Shader
域着色器 Domain Shader
像素着色器 Pixel Shader
几何着色器 Geometry Shader
载入公共着色器的信息 SetBoundShaderState 和SetSharedState
SetBoundShaderState 载入需要的着色器
SetSharedState 对于TBasePass,设置顶点着色器和像素着色器的参数。
逐元素渲染
1.对于每个DrawingPolicy调用SetMeshRenderState函数,设置渲染状态。包括调用每个着色器的SetMesh函数,以设置与当前Mesh相关的参数
2.调用Batch Element的DrawMesh函数,完成绘制。调用RHICmdList的DrawIndexedPrimitive函数,指定顶点缓冲区和索引缓冲区的位置。
3、BasePass
极为重要的阶段,通过对逐对象的绘制,将每个对象和光照相关的信息都写入到缓冲区中。
BasePass和PrePass的过程非常接近,分为设置渲染状态,渲染静态数据和渲染动态数据。
设置渲染状态
1.如果PrePass已经写入深度,则深度写入被关闭,直接使用已经写入的深度结果。
2.通过RHICmdList.SetBlendState,打开前4个渲染目标的RGBA写入。TStaticBlendStateWriteMask用模板参数定义渲染目标是否可写入,最高支持8个渲染目标。
RHICmdList.SetBlendState(TStaticBlendStateWriteMask<CW_RGBA, CW_RGBA, CW_RGBA, CW_RGBA>::GetRHI());
3.设置视口区域大小。这个大小会因为是否开启InstancedStereoPass而有所变化。
渲染静态数据
如果PrePass已经进行深度渲染,那么会先渲染Masked蒙版对象,然后渲染普通不透明对象。否则,先渲染不透明对象,再渲染蒙版对象。
渲染动态数据
与PrePass基本相同
BasePass采用MRT(Multi_Render Target)多渲染目标技术,从而允许Shader在渲染过程中向多个渲染目标进行输出。
渲染目标来自哪里?
渲染目标由当前请求渲染的视口(Viewport)分配,对应FSceneViewport::BeginRenderFramw函数。
如何写入?输出到何处?
并没有在C++代码中,而是在Shader着色器代码中。打开Engine/Shader/BasePassPixelShader.usf文件,大体过程:
通过GetMaterialXXX函数,获取材质的各个参数,比如BaseColor基本颜色,Metallic金属等。
然后,填充到GBuffer结构体中
最后,通过EncodeGBuffer函数,把GBuffer结构体压缩、编码后,输出到SV_Target。
RenderOccusion渲染遮挡
虚幻引擎的遮挡计算,实质上是在PrePass中直接进行基于并行队列的硬件遮挡查询。除非在r.HZBOcclusion这个控制台变量被设置为1的情况下,或者有些特效需要的情况下,才会开启Hierarchical Z-Buffer Occlusion Culling 作用遮档查询。
全平台默认关闭
总体来说,这个步骤是为了尽可能剔除处于屏幕内但是被其他对象遮挡的对象。在视口初始化阶段,剔除了处于视锥体之外的对象。但是依然有大量对象处于视锥体内,却被其他对象遮挡。比如一座山背面的一大堆石头,这些石头能够正常通过我们的视锥体遮挡测试,却并不需要渲染。
因此, HZB渲染遮挡技术被用于解决这个问题,通常的HZB步骤如下:
(1)预先准备屏幕的深度缓冲区,这个缓冲区将会作为深度测试的基础数据。因此,这个步骤必须在PrePass之后,如果没有PrePass,则必须在BasePass 之后。
(2)逐层创建缓冲区的Mipmap级联贴图。层级越高,贴图分辨率越低,对应的区域越大。而每个层级对应这个区域“最远”元素到屏幕的距离(深度最大值)。
(3)计算所有需要进行测试的对象的包围球半径,根据这个半径,选择对应的深度缓冲区层级进行深度测试,判断是否被遮挡。这个的用意在于,如果对象较大,我们可以直接用更高的层级进行测试,这个对象的深度若比这个层级对应的距离还远,那么该对象一定被遮挡,因为层级对应的是这一片区域中可见元素的最远距离。
需要注意的是, OpenGL平台下不会进行这个测试。这个步骤中的第二步可以使用像素着色器多次绘制完成级联贴图层级,第三步则可以使用计算着色器ComputeShader,或者使用顶点着色器进行计算,将结果写入到一个渲染目标中。从而借助GPU的高度并行化来加速这个遮挡剔除过程。
这个步骤输出的结果会被用于下一帧计算,而不是在本帧。
光照渲染
对应函数RenderLights,光照渲染与阴影渲染是分离的,阴影渲染是在视口初始化阶段完成的,光照渲染大体步骤如下:
收集可见光源。对可见性的判断,利用视口初始化阶段保存的VisibleLightInfos信息,以当前Id查询即可获得结果。对每个光源构建FLightSceneInfo结构,然后通过ShouldRenderLights对光源是否需要渲染进行计算。
对收集好的光源进行排序。将不需要投射阴影、无光照函数的光源排在前面。
如果是TiledDeferredLighting,则通过RenderTiledDeferredLighting对光照进行计算。如果是PC平台,使用RenderLight函数进行光照计算。
如果平台支持Shader Model 5,则会计算反射阴影贴图与PLV信息。
核心光照渲染RenderLight函数
每个光源都会调用这个函数,遍历所有视口,计算光照强度,并叠加到屏幕颜色上。
1. 设置混合模式为叠加
2. 判断光源类型
平行光源
载入延迟渲染光照对应的顶点着色器(TDeferredLightVS)和像素着色器(TDeferredLightPS)
设置光照参数
绘制一个覆盖全屏幕的矩阵,调用着色器。
非平行光源
判断摄像机是否在光源范围内
如果是,关闭深度测试,从而避免背面被遮盖部分不进行光照渲染
否则,打开深度测试,以加速渲染
载入着色器
设置光照参数
根据是点光源还是聚光灯,绘制一个对应的几何体,从而排除几何体外对象的渲染,加速光照计算。
ShaderMap
顶点工厂:负责抽象顶点数据以供后面的着色器获取,从而让着色器忽略由于顶点类型造成的差异。
当前着色器继承自FMaterialShader,则对每个材质类型编译出一组对应渲染管线的着色器
当前着色器继承自FMeshMaterialShader,则对每个材质类型的每个顶点工厂类型编译出一组顶点着色器和像素着色器。
通过GetMaterialXXX,可以获取材质的参数。
资讯来自网络

㈦ 怎么对导入UE4的模型进行拆分添加材质

导入UE4的模型进行拆分添加材质需要对模型进行编辑和处理的,满意请采纳

热点内容
端口扫描源码 发布:2025-02-07 02:31:01 浏览:470
androidurl获取图片 发布:2025-02-07 02:22:11 浏览:482
调用上传 发布:2025-02-07 02:19:53 浏览:84
aix编译安装 发布:2025-02-07 02:19:52 浏览:906
android界面设计尺寸 发布:2025-02-07 02:16:25 浏览:898
zenly安卓为什么会一直闪 发布:2025-02-07 02:12:02 浏览:357
为什么安卓手机界面总出广告 发布:2025-02-07 02:10:33 浏览:244
plc数据块怎么编译 发布:2025-02-07 02:09:44 浏览:98
ct加密 发布:2025-02-07 02:09:03 浏览:919
编程差别 发布:2025-02-07 02:06:37 浏览:348