23 KiB
title, date, excerpt, tags, rating, status, destination, share, obsidianUIMode
title | date | excerpt | tags | rating | status | destination | share | obsidianUIMode |
---|---|---|---|---|---|---|---|---|
未命名 | 2025-03-28 13:11:54 | ⭐ | inprogress | false | source |
背景
-
项目大致背景
- 项目类型:赛车
- 制作人以前做极品飞车。
- Demo期间,制作周期半年。
-
面试信息
- HR + 主管
-
TODO
- 查看一些网易面试经。
- 工作经历
- 说自己是TA, 达瓦、乐华。(避免说国企经历)
- 偏T的TA,
- 对TA很感兴趣。
- 相关作品产品。
- 做了什么、解决了什么问题、怎么解决怎么好?表现出能Hold住全场。
- 乐华(ASoul)项目
- Dawa 崩坏3 音乐会。
- 技术栈说明
- 学了哪些东西,有哪些技术栈。
不要提二次元渲染技巧 风格化渲染。 风格化渲染的论文。 瓶颈是什么?
可能会问的问题
-
我是TA,但什么东西都做。
-
自己的未来目标与计划都是做成一个TA的要求。
- 流程
- 工具开发
- 流程
- MultiDraw插件,收到行业广泛的认可,很多人都在使用。
- 简单说一下原理。
-
赛车的3C、GDC文章、道路生成。
- 【[UOD2022]极速光影-探讨《Racing Master》中的光影技术 | 网易 周潜】 https://www.bilibili.com/video/BV1sP4y1R7TV/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
自我介绍 & 主要技术栈
面试官您好,我是楼嘉杰,一名技术向TA。 首先很荣幸参加贵公司的面试,在仔细研究过岗位要求后,我认为自己能完全胜任本岗位。
个人优势
个人优势:
- 熟悉UE各种常用模块,可以按照需求进行Demo搭建。
- 具备一定的图形学知识,可以从更多角度分析需求并且完成。熟练使用Renderdoc、Pix、NSight、UrealInsight工具分析性能瓶颈以进行优化。可以按照需求修改渲染管线。
- 熟悉Qt与Pyside2,可以编写跨平台的工具。以及DCC软件的深度定制。
- 具备Docker相关知识,能够玩转NAS以及部署版本管理、自动化等相关服务。以及部署UE项目测试用专用服务器。
技术栈
首先说一下技术栈 UE方面
- Gameplay:3C、AI、GAS、OnlineSubsystem。解析过ActionRPG、GASDocument、Lyra(部分逻辑)项目。
- UI:熟悉UMG、Slate来编写一些自定义组件。
- 工具:CommandLet、EditorUtilityBlueprint、Puerts Editor。
- 动画:动画蓝图、大部分动画节点。解析过AdvancedLocomotionV4。
- Puerts:熟练使用Puerts编写各种功能。
图形学与Shader • 熟悉UE5中的RDG、MeshDraw渲染框架以及渲染流程。能够按照需求来修改渲染管线。 • 编写基础的离线光线追踪渲染器。 • 学习过UnityShader以及SRP自定义管线,分析过UnityChan2.3的Shader。 • 熟练使用RenderDoc、UnrealInsight、Pix、NSight等工具对性能进行分析并且对项目进行优化。
美术相关 • 熟悉Maya的建模、动画、渲染模块,能使用Python编写插件。熟悉PySide2库,可以编写更多高级功能。 • 熟悉UE5动画、光照相关功能与物理光照系统,并撰写相关经验文章。
项目流程管理 • 搭建Gitea平台实现协同开发。使用GitBook、Obsidian作为项目文档与知识库,方便协作。 • 搭建Perforce Server以及Proxy Server,并设计分支以及协作流程。 • 研究与使用FastBuild加快源码引擎的编译,大大提高修改渲染管线的效率。
其他技术栈 • 前端框架:Vue、Vue-cli、Nuxtjs、ElementUI、Echart、Electron-vue • 后端技术:Node.js、Express • GUI框架(Qt):Qt、QtQuick • 语言:C++、JavaScript、Python
工作与学习经历
国企期间
2013.7-2022.6 使用Qt编写各种工具与App,使用VUE与Nodejs相关生态工具编写数据管理综合平台。实现数据生产、综合查询、用户终端的生产流水线。 在2013年接触到了Maya、UDK,对此特别感兴趣并且使用空闲时间进行自学。在2015年UE4免费之后转而对UE4进行系统学习。 在此过程中
在此之间也做了一些东西,这里我只介绍最有代表性。
- 一些RayMarching材质:溶球、2D、3D体积云。
- 一些后处理效果:描边、模糊。
- 使用GAS制作的Demo。
- Slate UI组件定制。
- 自费走完次时代外包流程,并且使用Ornatrix制作角色头发。
- 制作基于Maya HumanIK的批量重定向插件。
MultiDraw
主要解决了:
- 在不修改引擎的情况下,给模型添加Outline的功能。Outline是BackFace Outline,不容易出现自遮挡问题。同时具备Fov、深度曲线适配,是不修改引擎情况下,挤出式Outline的最佳方案。
- 避免使用多个模型进行渲染,减少了额外的性能损耗。也因此解决了多骨骼模型渲染Outline,而出现的动画不同步的问题。
- 可以在各个平台运行,包括移动端。
目前有很多许多公司与个人使用。
同时还有其他功能:
- 模拟Muti Pass功能,使用像素偏移进行排序。
- Cutoff 剖面功能。
- UE材质背面渲染功能。
达瓦(2023崩坏三音乐会、2024原神音乐会、AI、乐华技术支持)
2022.6-2024.10
- InHouse插件维护:从UE4迁移到UE5、提升使用体验、编写大纲组件并且内容与Maya场景完全对应。
- 【[UnrealOpenDay2020]MUTOOLS-虚幻引擎动画生产新流程 | 达瓦科技 朱子威】 https://www.bilibili.com/video/BV1ct4y1Y7qP/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
- 难点:需要对Maya 插件的C++开发以及数据逻辑(DAG,有向无环图)以及UE的渲染逻辑有一定了解。
- 项目技术支持:
- 日常的疑难问题解决:各种各样的问题,DCC、模型摆放、渲染、动画、工具都会有所涉及。比如在Editor下在Sequence中K某个Actor的逻辑、角色口腔里有奇怪的光(Subsurface Profile Skin导致的)。主要是一些外包的番剧制作或者使用商店素材快速搭建的项目。
- 难点:N手包的各种糟糕资产以及地编同学在不太了解商城资产的情况下滥用。
- 优化场景性能:主要是XR、虚拟拍摄类型的项目。将帧数优化到指定要求同时保证效果不会出现较大变化。比如XR项目需要达到4K50帧、虚拟拍摄要求2K50帧。
- 根据需求实现一些功能:
- 在XR拍摄中让角色具有阴影。XR拍摄使用Disguise软件,会将角色与场景分开各渲染一次,再与摄像机拍摄的现实结果进行合成。因为阴影是投射产生并不存在可以选中的实体,所以XR拍摄中的虚拟角色会没有阴影。
- 解决方法:
- 通过SceneCapture2D渲染与主光方向一致的方向的深度信息,再在地面材质中对该信息进行空间转换,判断是否大于之前的深度信息来判断是否处于阴影中。
- 使用UE的Composure功能,将当前角色与接受阴影的地面使用作为一个Pass单独输出到Disguise。这样就解决了这个问题。
- 解决方法:
- 使用第三方库分析音乐来寻找鼓点,并在Sequence中在鼓点位置摆动DMX灯光。
- 在XR拍摄中让角色具有阴影。XR拍摄使用Disguise软件,会将角色与场景分开各渲染一次,再与摄像机拍摄的现实结果进行合成。因为阴影是投射产生并不存在可以选中的实体,所以XR拍摄中的虚拟角色会没有阴影。
- 工作流优化:搭建SVN、Perforce服务,并且手把手教会同事;推广UE的Muti-Users。
- 参与项目:
- 武庚纪
- 燃夏
- 2022 EOE米诺生日会
- 2022 音乐盛典咪咕汇(未中标)
- 2023 新春湖南电视 周笔畅《追星》
- 日常的疑难问题解决:各种各样的问题,DCC、模型摆放、渲染、动画、工具都会有所涉及。比如在Editor下在Sequence中K某个Actor的逻辑、角色口腔里有奇怪的光(Subsurface Profile Skin导致的)。主要是一些外包的番剧制作或者使用商店素材快速搭建的项目。
- 2023崩坏3音乐会
- 工作内容:提供场景优化方案与现场技术支持。
- 难点:
- XR拍摄的帧数要求较高:4k50帧
- 现场使用的渲染机CPU是频率不到4.0的线程撕裂者,非常容易出现CPU瓶颈。需要较多的UE渲染管线知识才能找到问题并解决。
- 工期非常紧张:这个项目因为前一个公司做到一半放弃了,导致接手时工期非常紧张。到重庆影棚进行拍摄时,相关每个场景只有70
90%的完成度。所以只能边制作边出优化方案了,制作进度较快的场景会给我留12天时间,一些比较慢只会给我留0.5~1天。 - 在工期紧张的同时,场景频繁出现较大改动,进一步得增加优化负担:为了尽可能得提升演出效果,导演经常会改镜头与效果。往往改动的东西与添加的资产会比较多,导致本来符合拍摄要求的帧数一下子又不行了。所以每个节目场景会出个3~5个版本的优化方案。
- 部分商城资产滥用导致性能问题出现。
- DMX灯光优化:
- 模型转Nanite,DMX组件里的模型都改成StaticMeshInstance。
- 关闭DMX灯光组件的照明与阴影效果。对于不能关闭的照明效果的,减小照明范围。
- 改进DMX Beam材质以减少RayMarching步长与不显示区域。劲量减少Beam的相互叠加。
- 资产优化:
- 修改EasyFog的材质(大纲搜索EasyFog),从Translucent=>Additive。并且重新调整亮度。
- EnvEmitter,调整大小并使用Cutoff工具对齐进行裁剪。(覆盖范围过大)。修改材质MI_Env_Inst~MI_Env_Inst22,从Translucent=>Additive。并且重新调整亮度。
- Lumen:根据场景舞台大小调整Lumen Scene View Distance、Max Trace Distance。在保证效果不会大变的基础上,调整Quality与Detail。
- Lumen Scene Lighting Quality: 2 =>0.25
- Lumen Scene Detail:4=>1
- Lumen Scene View Distance:20000=>1000~3000
- Max Trace Distance:20000=>1000~3000
- CyberAngle:
- 光影 & Lumen参数调整
- 去掉部分效果不明显灯光的阴影渲染。
- 部分阴影设置成距离场阴影。
- 使用SourceLength匹配的点光源来代替RectLight
- 其他类型的灯光是用PointLight或者SpotLight来代替。
- DMX灯光调整
- 对EasyFog粒子进行裁剪
- 粒子从CPU移植成GPU
- 远景模型根据视角角度进行Merge。
- 光影 & Lumen参数调整
- Journey Of MoonLight:
- 光影 & Lumen参数调整
- 地面的点光源照明效果使用贴花代替(数量特别多)。
- 基础没有明显效果的灯光。
- 关闭飞船模型的阴影。
- DMX灯光、DMX模型、Beam材质调整。通过距离判断来设置DMX材质质量等级,以此减少步长。
- DMX模型卡空气Nanite,并且调整参数使其不会有太大变形。
- 星云资产与星光调整(商城资源)
- 在保证效果不变的基础上,调整生成随机球体模型的数量以及球体大小。
- 关闭Separate Translucency渲染功能。
- 光影 & Lumen参数调整
- The Flawless Human、Elysian Realm
- 光影 & Lumen参数调整
- 帮忙制作了一下12英杰的头框材质
- TruE
- 优化粒子
- CPU => GPU,减少不能转换的粒子数量与出现频率。
- 场景与粒子材质 Translucent => Addtive,顺便解决鬼影问题。
- 电视机模型Nanite & InstancedStaticMesh,并且删除下方看不清的电视机模型进行Merge或者删除。
- 电视机播放视频使用Bink进行优化。
- 与特效同学协作,实现最后的通道状粒子效果。并且使用Nanite & InstancedStaticMesh进行优化(需要修改材质,将ObjectPosition => InstancePosition节点)
- 灯光:
- 因为场景几乎没有渲染阴影的需求所有关闭若干的阴影渲染
- 调整灯光的渲染范围。
- 调整主光阴影参数:
- Dynamic Shadow Distance MovableLight:20000 =>4000
- Num Dynamic Shadow Cascades:5 => 1
- DistanceField Shadow Distance:4000
- DistanceField Trace Distance:25000 =>2000~4000
- Shadow Resolution Scale:1 => 0.1
- 调整主光阴影参数:
- ExponentialHeightFog1 关闭体积雾
- 优化粒子
- Dual-Ego
- 灯光阴影:关闭点光源阴影。
- 场景与粒子材质 Translucent => Addtive,顺便解决鬼影问题。
- 远景雾片Cutoff
- 舞台模型 Merge
- Oaths
- 调整Lumen参数
- 灯光
- 关闭阴影效果不明显的灯光阴影。
- 调整主光阴影参数:
- Dynamic Shadow Distance MovableLight:20000 =>4000
- Num Dynamic Shadow Cascades:5 => 1
- DistanceField Shadow Distance:4000
- DistanceField Trace Distance:25000 =>2000~4000
- Shadow Resolution Scale:1 => 0.1
- 解决一个屏幕出现奇怪噪点的问题:一个Niagara尘土粒子因为参数问题导致速度与粒子大小
- Domineer
- 解决鬼影问题:
- 修改材质,从Masked=> Translucent,并且开启材质的Responsive AA。
- 模型合并 & Nanite
- 调整Lumen参数
- 灯光阴影调整
- 解决鬼影问题:
- Rubia
- 删除场景中的PlanearReflection,该用屏幕空间反射。
- VSM => ShadowMap,解决因为场景都是透明物体切没有Nanite会导致VSM无法缓存,使得帧数下降的问题。
- Nightglow
- 中间舞台优化:因为采用Houdini的VAT制作破碎动画(逆播放),负责制作的TA同事在这里使用的StaticMesh,这会使得帧数降得非常厉害,只有3~10fps。
- 解决方法:
- 将这里所有模型都改成Nanite。
- 整个舞台为六边形石柱组成的六边形舞台。按照形状可分为7种模型,分别做成InstancedStaticMesh。
- 修改材质,ObjectPosition节点改成float3(0,0,0) => TransformPosition(Instance&ParticleSpace)这2个节点。
- 解决方法:
- 因为场景比较暗,所以关闭几个SpotLight的阴影渲染。
- Luemn参数修改:
- Lumen Scene Lighting Quality: 1=>0.25
- Lumen Scene View Distance:20000=>1000
- Max Trace Distance:20000=>1000
- 透明物体
- EasyFog材质从Translucent=>Additive
- SM_Cloud_Single的材质从Translucent=>Additive
- geogrp的NewMaterial1_Inst从Translucent=>Additive
- 中间舞台优化:因为采用Houdini的VAT制作破碎动画(逆播放),负责制作的TA同事在这里使用的StaticMesh,这会使得帧数降得非常厉害,只有3~10fps。
- Da Capo
- 粒子:删除看不见的CPU粒子。
- 植被
- 将所有植被模型设置成Nanite。材质中WPO引脚中的ObjectPosition节点改成float3(0,0,0) => TransformPosition(Instance&ParticleSpace)这2个节点。
- 设置r.Nanite.AllowWPODistanceDisable 。
- 光影
- Lumen相关参数
- r.Shadow.Virtual.Cache.MaxMaterialPositionInvalidationRange 1000
- 场景整理:
- 删除场景中镜头看不到,效果不明显的东西(Mesh与蓝图)
- 将一些渲染效率低的StaticMeshInstance => Nanite
- 粒子
- 见扫瀑布粒子数量与Life,并且在Sequence中K可见性。(有较大性能影响)
- P_Wind粒子 CPU => GPU
- 2024原神音乐会
- 针对原神渲染进行分析
- 原神刚开服是可以截帧的,有renderdoc,分析Renderdoc文件来指导美术如何制作。
- 蒙德教堂(未播出),项目招标用。
- 因为对接方提供的场景模型缺损严重,之后有研究原神资产与场景模型的提取方式,以及还原场景的方法。
- 具体方法:
- 使用改模版的AssetStudio来提取资产。
- 搭建原神私服,在游戏中使用Ninja Ripper截取游戏场景,并在Blender加载结果。
- 在UE中进行还原。
- 具体方法:
- 正机之神:Boss模型提取+绑定分析、场景分析。
- 针对原神渲染进行分析
- AI项目:
- AI实时添加动作、并且渲染视频。
- AI 表情、口型 Sequence。
- AI 实时动画重定向。
- AI虚拟偶像陪伴项目
- 导播台
- AIGC赋能工具:以上都是一些基础功能Demo。原本还打算制作更进一步的工具:
- 比如根据当前Sequence 通道的动画信息以及用户提供关键字,以此在AI 专用轨道中生成动画数据。
- 根据关键词生成模型数据,之后将模型数据下载到本地并在关卡编辑器中创建StaticMesh并生成Asset。
- 4DGaussians
-
乐华ASoul技术支持
蛋仔派对:AI赋能&UGC:
- 【[UOD2022]让用户更快捷的创建世界- 基于UGC方法的动态世界解决方案 | 腾讯 杨拓】 https://www.bilibili.com/video/BV1384y117Zm/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
- Promethean AI:场景创建辅助用大模型。www.prometheanai.com
- Ludas AI:针对虚幻引擎通用大模型AI。https://ludusengine.com/
乐华(ASoul)
2024.10-2025.1 实际上是从2024.4月开始进行技术支持的
因为乐华从字节收购Asoul业务时,字节只教了基础使用方式,只交付了UE工程、脱敏的美术资产源文件。 最为关键的使用文档、中台插件、版本管理工具都没有提供。 所以需要有一位技术栈宽广的人来Hold住这个项目。在我接收到项目后,发现存在若干之前直播版本不存在的bug,怀疑是交付时搞错了Perforce分支或是使用较早版本进行交付。
作为唯二的技术人员,我主要负责:
- 解析ASoul导播系统,以进行工作流的适配与改造。
- Sequoia编辑器改造以适配流程。
- 分析ASoul的渲染管线与配套材质系统。
- 分析大气环境、道具、换装系统,并进行改造。
- 根据 运营 要求制作一些效果道具。
- 修复导播系统bug。
- 大型节目优化。
- 日常技术支持
- 技术答疑
- 日常问题解决
- 搭建协议服务与工作流
另一个位更加偏向于虚拟偶像直播,是技术负责人:
- 动捕 & 动捕棚搭建,相关问题解决。
- 网线 & 工位改造。
- 直播相关问题解决。
导播台架构
采用C/S分布式架构,即专用服务器作为终端,其他控制客户端分别控制(服务端会检测客户端身份)。 采用这种分布式架构的原因是:
- 可以防止All in Boom的问题。控制用客户端挂掉或者电脑出现硬件问题也可以通过其他电脑打开该类型的控制客户端重新运行。该系统主要由 c++为主要底层(20
30%),大量Puerts(5060%),蓝图(5~10%)构成。 - 满足导播切镜头的需求,可以先从24个镜头中(可以通过SteamDock翻页)选择想要镜头,之后再PVW预览觉得OK后,通过切镜让PGM也开始播放这个镜头。
- 地图控制:
- 加载指定表演区域(采用大世界系统,提前加载,UE4版本采用的是关卡流)
- 控制天气、昼夜循环、天空盒。
- 添加地图道具、特效。
- 控制表演区域的特殊功能。
- 角色换装&道具:
- 角色换装
- 身体各部位的道具
- 特效
- 动捕&面部&手套控制
- 动捕、面部、手套数据ID对应。
- 脚步着地。
- 动捕时间戳同步。
- 动捕道具控制。
- 渲染机画面通过采集卡+视频线传到显示器上
渲染管线 & 材质系统
渲染管线
为了能在其他线下场所进行直播(替换官方引擎的USH与USF),ASoul的引擎只使用材质与修改UE Shader的方式来实现卡渲。
主要的逻辑是:
- 在FGbufferData中添加额外的卡通渲染用变量,之后在DeferredShadingCommon.ush的Encode/Decode函数从GBuffer进行Encode/Decode。
- 在BasePassPixelShader中写入相关信息,并且修改ShadingModelID输出(使用CustomNode):
- ToonSpecularColor
- ToonShadowColor
- ToonShadowLocation
- ToonShadowSmoothness
- ToonSecondaryShadowColor
- ToonForceShadow
- 在ShadingModel.ush 添加对应的ToonShadingModel。
- 修改DeferredLightingCommon.ush,添加了阴影控制功能。
- 修改DeferredLightPixelShaders.usf,设定为LightChannel为2时,才会进行卡通渲染。
- 修改PostProcessCombineLUT.usf实现 NoToneMapping
材质文档编写
天气系统采用纯蓝图 + DataTable(Curve、Parameter)+ 材质制作。
动捕 & 动画系统
有一个名叫MotionProcessor的客户端负责收集各种动捕&面捕&手套信息。
动捕
动捕系统用的是青瞳,为了解决因为动捕系统延迟抖动问题以及其他客户端获取数据需求。这里采用这个方案:
- 在接收到原始诗句后,按照时间戳进行采样。(新开线程,接收120ms的数据)
- 发送给一个c#编写的程序,进行数据广播。
- 各个客户端在接收动捕数据后,还会根据时间戳再次采样(动画节点)
- MotionProcessor中的角色与直播角色共用同一个动画蓝图,不同的逻辑与节点通过一个Bool变量进行区分。
除此之外还需要处理动捕道具的逻辑(一些道具黏上动捕反光点,可以与虚拟世界的道具同步位置)
面捕
使用Unity + Arkit实现一个面捕App,主要为了实现:
- 突破52个BlendShape限制。
- 提高单个BlendShape的表现能力。举个例子:吐舌,演员表情被识别后,使用多个BlendShape插值拼合最终得到一个不错的效果。
- 限制一些NG表情。
可以看到这个节点可以添加一个DataAsset,里面的数据都是由中台的dcc工具根据maya工程中角色的BlendShape生成csv,再导入UE生成。
ChaosBone
使用CUDA编写的物理系统(整合了KawaiiPhysical、SPCR Joint Dynamics) 主要用于模拟布料以及刚体(头发) 主要解决了:
- 效率问题
- 布料穿模问题
除了解析之外我还做了哪些工作
- 摸索出
- 日常解决地编、动捕、建模、导播同学的问题。
- 一些效果、道具制作。
日常问题解决
- 较容易解决的,通过截图,并在图上附上操作步骤与箭头指示,示意解决方案。
- 一些容易重复的问题会编写知识库文档,之后发送文档链接。
- 一些复杂问题会直接录视频告知解决方法。
乐华 实时演出 / 预录制演出切换 适配
之前ASoul全都是实时直播,比较容易出直播事故。乐华的方法是半直播半录制(才艺、跳舞、表演),这样可以大大降低失误概率。 需要用导播系统进行切换(RootMotion Enable/Disable 与 Runtime修改动画蓝图中Montage Slot中动画资产)。
难点:
- 各种后续bug修复。比如:
- 道具bug。
- 开发电脑与直播电脑效果不同。
- PVW与PGM效果不同。
- 乐华不像字节有配备测试用电脑,只能卡在直播、排练、QA空隙进行测试。
版本管理 & 协作
先后搭建SVN与Perforce进行版本管理与协作。 弃用SVN的原因是:
- SVN会在本地占用大量空间,而直播用的电脑固态硬盘空间都比较小,进而产生各种直播问题。
- SVN的分支系统比较拉胯,无法对开发版本、测试版本、直播版本进行分离,需要进行手动控制,容易触发直播事故。
- 本地文件改动较多时,SVN Checkout速度太慢。
采用邪道方法为公司节约成本(使用免费版本的Perforce):
- 采用不同电脑,同账号登录。工作区与Commit进行严格命名控制。工作区命名格式:地区_职位_名字缩写。Commit标题添加名字缩写。
- 因为开发人数在18人左右,一套直播系统需要9台机器。所以开发组使用一个Perforce服务,直播间使用另一个Perforce服务。由QA同学验收后,切换P4V服务地址,再进行上传。
大型活动优化
【【A-SOUL】贝拉 2024.07.20 星之回响-贝拉生日演唱会【直播录像】】 https://www.bilibili.com/video/BV1TE421w7ae/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e