UE5 体积雾渲染流程与源码分析
UE5.3 对体积雾的实现和原理是基于 寒霜引擎 Siggraph 2015 和 Siggraph 2014 Wronski关于大气散射的演讲
UE 渲染管线对体积雾的实现是基于体素网格
散射原理浅析Wronski Siggraph 2014 scattering
散射基本概念从能量角度看,入射光被分解成了三个部分,透射光,散出光,被吸收
$$L_{incoming} = L_{transmitted}+L_{absorbed}+L_{scattered}$$
在存在散射的场景中,光线在传播的过程中不断的散出,散入,被吸收
如下图,黑色是光线路径,绿色是被光线被散出,灰色是不断有其他散射光加入当前光路
Beer-Lambert law物理公式,定义了散射下 出入射光线比 T
$$T(A\rightarrow B) = e^{-\int_{A}^{B}\beta e(x)dx}$$
Phase functions用于描述各个角度的散射强度,如下图,描述了光线入射云后往各个方向的散射情况
具有能量守恒的性质,因此所有方向的积分必须等于 1计算体积雾实际使用的是 Hen ...
UE5 延迟贴花渲染流程浅析
分析基于 UE5.3,DefferredDecal 的默认渲染流程
贴花具体使用请参考 [虚幻引擎中的贴花材质]
UE5和UE4区别
UE5默认启用DBuffer贴花,贴花混合模式不可选,按照材质的设置自动选择贴花混合模式
控制台变量 r.DBuffer 为只读字段
以下是此变量的描述
123456789static TAutoConsoleVariable<int32> CVarDBuffer( TEXT("r.DBuffer"), 1, TEXT("Enables DBuffer decal material blend modes.\n" "DBuffer decals are rendered before the base pass, allowing them to affect static lighting and skylighting correctly. \n" "When enabled, a full prepass will be ...
UE5 Lit Translucency 性能优化指南
作用使用更低分辨率的体积纹理简化半透明材质的光照(常用于粒子系统、体积效果)
光照半透明的大部分光照是通过一系列围绕视锥体定向的级联体积纹理获得的。因此对于体积内部的任何一个点,都可以通过一次正向传递了解光照信息,但缺点是体积纹理的分辨率相当低,而且只能覆盖以观察者为起点的有限景深范围。
Renderring Event在profile GPU中,一般主要涉及两个过程
ClearTranslucencyLightingVolumeCompute,清空需要的纹理
InjectTranslucencyLightingVolume,执行光照注入
FilterTranslucentVolume,用于过滤纹理,做blur效果
视材质的具体使用可能还有如下流程
InjectAmbientCubemapTranslucentVolumeLighting
InjectSimpleTranslucentLightArray
r.TranslucentLightingVolume 1,默认1,是否开启半透光照注入,设置为0可以关闭整个过程。
r.TranslucencyVolumeBl ...
UE RenderDoc 使用小记
仅为个人在使用过程中的一些经验总结
基于 UE 5.3
UE5 配置编辑-项目设置-插件-RenderDoc-启动时自动附加
重启 Editor 后,可以在视口的工具栏中看到如下标志,单击即可捕获当前帧,并拉起RenderDoc
编辑器在游戏中时,也可以选择在控制台键入命令renderdoc.CaptureFrame
更多其他命令如下
修改配置,否则 shader 全是助记符
123// Engine/Config/ConsoleVariables.ini 中配置如下r.Shaders.Optimize=0r.Shaders.Symbols=1
Event Browser如下图,过滤器可以去掉很多渲染无关的事件,大部分是CPU和GPU数据传输的事件,此处加上 -Execute 可以更加精简视图
Scene 是就是当前帧的渲染逻辑
Texture Viewer常用部件
三个箭头从左至右
Slice/Face 可以用于查看一些3D纹理,在各级截面上的具体表现
自动范围设置 自动将当前纹理的最大和最小值设定给Range,相当好用且非常常用,尤其在查看SceneDept ...
3DGS
3D Gaussian Splatting for Real-Time Radiance Field Renderinghttps://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
施工ing
games104-gameplay和游戏AI
gameplay事件机制
发布订阅模式
核心:
事件定义:可以用面向对象的类定义,但是如何扩展、如何热重载是个很大问题,利用反射写在外部文件?dll注入?
回调函数注册:GO没了咋办,空指针问题,强引用(shared_ptr,有东西没释放对象也不能释放)/ 弱引用(常用一点,对某一时刻查看场景中其他对象可以用如weak_ptr)
消息分发:循环队列事件池,加上多个不同类型的队列架构,大量消息的触发导致帧延迟,如何解决?
脚本系统
游戏逻辑,热更新,编译型语言不行
解释型语言闪亮登场,方便热更新,寄了也是虚拟机寄不影响引擎,非常哇塞
GO管理,利用解释性语言的垃圾回收!,适用于对象特别多的,简单的可以引擎内核直接管理
可视化脚本
blueprint蓝图!低代码平台
基础AI导航Navigation
地图表示
寻路:A*算法:启发式算法,g(n)+f(n)已经走过的距离+估计要走的距离,优先搜索估计最近的点,同时找到目的就结束计算(区分与迪杰斯特拉算法)
路径平滑:Funnel算法,烟囱收缩大法,很强,直接直线走
转向
主要用于车辆寻路
群体模拟
宏观定义:定义一个路线 ...
games104-简化的引擎架构和渲染组件
简化的架构
Tool Layer:面向用户,DCC和引擎交互
Function Layer:tick,渲染+逻辑,etc…
Resource Layer:资源格式转换为资产(更高效的内部数据),GUID资产识别,资产生命周期管理(核心)
Core Layer:数学库,更高效的数据结构、容器,内存管理
Platform Layer:RHI(封装不同的图形API,向上提供统一接口)
Function 和 Core 可能有很多交汇
Game World
各种光源、人物角色、像机乃至空气墙、触发器都可以表示成对象Object
各种过于复杂的关系导致继承系统很难表示,引入组件components,可以看一下ECS模式
component-based Tick,相同组件同时tick,更加高效
事件系统,消息机制类似进程信箱通信,需要可扩展消息以支持物体间各种交互事件
场景管理,八叉树、BVH(bounding box)等等
pretick & posttick,多线程下统一时序
引擎中的渲染
可结合games101
一些挑战
场景中的大量物体需要渲染
复杂的底层硬件适配
稳定的帧率
...
cmake
cmake的小记录,最近在Linux上整活,正好学一下
暂时不涉及库文件的生成
文件树
123456# 项目标准文件树.├── CMakeLists.txt├── include├── linux.sh└── src
12345678# cmake后的文件树,可执行文件在bin中,构建在build中.├── CMakeLists.txt├── bin├── build├── include├── linux.sh└── src
CMakeLists.txt
CMakeLists感觉CMakeLists放最顶层方便一点,当然模块化的话就通过add_subdirectory递归地构建,基本满足目前的99%需要
12345678910111213141516171819202122232425262728293031cmake_minimum_required(VERSION 3.15)# set the project nameproject(test-cmake)# bin file output# you can also set others set(EXECUTABLE_O ...
WSL2+miniconda+Jupyter notebook
WSL2+miniconda+Jupyter notebookwin11下构建的开发环境,顺便熟悉一下Linux下的开发
cuda、cuDNN可以直接在win下处理,会直接集成到WSL2,可用nvidia-smi查看相关信息
WSL2安装
安装 WSL | Microsoft Learn
minicond安装
Miniconda — miniconda 文档
conda包含了包管理和环境管理,很方便
1234567# 免不了 conda 换源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forgeconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --a ...
Linux拾遗
回顾了以前学的内容,纯纯的只学命令而没有真的在linux下整过什么东西,恶补有关内容,真正拥抱这个社区
最近重新把 win+wsl2 拿起来,发现 nvidia 的 cuda 在 win 下安装后通过某种方式直接集成到wsl中了,vscode也接入了wsl,准备日后学习和工作迁移到linux上
拾遗GNU计划
GNU - 维基百科
名称是GNU’s Not Unix!的缩写
Linux操作系统包涵了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux
其内容软件完全以GPL方式发布
POSIX标准
可移植操作系统接口(Portable Operating System Interface of UNIX)
定义了应用程序和操作系统之间的接口,以及命令行shell和程序接口,以实现软件的可移植性
常见的Linux, BSD, macOS, iOS, Android等操作系统均遵循POSIX
开源许可证
宽松式:BSD、MIT、Apache2
Copyleft:GPL(传染性)、LGPL、AGPL、Mozilla(MPL)
选择时可以看那张经典的 ...