置顶文章

572 字 1 分钟

# WallpaperEnginePlugin 这是一个可以改变你 ue 界面的小插件,慢慢更新 下载地址: UE4.26 UE4.27 UE5.0 UE5.1 # 使用方法 1. 选择你引擎对应版本,把 plugins 解压到你项目根目录下。 # 例如: 解压到 Plugins 文件夹下,要是没有自己新建个即可 然后重新编译 要是打开引擎要是提醒版本不同,点是就行 把静态图片放在这文件夹下面,上面列表会自动同步列表,要是视频的话,会自动同步 WallpaperEngine。 # 设置界面说明 💙 Use Wallpaper Engine : 播放视频,ue5.0 版本中...
526 字 1 分钟

# 图形学笔记 图形学笔记 # Lumen # Nanite # 迭代法 # 范数 # Compute shader # BRDF 方程 # Ambient Cube # HZB (Hierarchical Z-Buffer) # MVP 矩阵 # SH 求谐函数与立体角 # TAA # 图片压缩算法 # 空间结构划分 # Visibility Buffer # Visibility Buffer # GTAO # 四元数 # 杂项 # HLSL 语言基础 # ShadowMap # Virtual Texture # 薄膜干涉 # Volume...

文章列表

2.6k 字 2 分钟

# 全导数 全导数(Total Derivative)是在多变量函数的背景下,描述一个函数相对于多个变量的变化情况的导数。全导数考虑的是函数的整体变化,包括所有自变量的直接和间接影响。全导数常用于描述复杂系统的动态变化,特别是在涉及多个相互依赖变量的情况下。 # 全导数的基本概念 假设有一个多变量函数 z = f (x, y) ,这里 z 是自变量 x 和 y 的函数。全导数描述了 z 相对于一个变量(如 x )的总变化率,包括所有间接影响。全导数考虑了 z 对所有自变量的依赖关系,以及这些自变量之间的相互依赖。 # 全导数公式 对于一个多变量函数 z = f (x, y) ,全导数...
6.6k 字 6 分钟

# 导数 导数(Derivative)是微积分中的一个基本概念,用于描述函数的变化率。它反映了函数在某一点处的瞬时变化情况,即函数值随自变量变化的趋势和速度。导数的概念在数学、物理学、工程学、经济学等领域有广泛的应用。 # 导数的基本概念 导数的定义: 导数是函数在某一点处的瞬时变化率,可以视为函数曲线在该点的切线斜率。 如果函数 f(x)f(x)f(x) 在 x=ax = ax=a 处可导,其导数 f'(a) 定义为: f'(a) = \lim_{h \to 0} \frac{f(a + h) - f(a)} 这个公式中的 h...
3.1k 字 3 分钟

# 积分 积分就是反向导数,求积分就是求函数的面积 记作 把要求积分的函数(叫被积函数)放在积分符号后面, 最后放 dx 来代表积分的方向是 x(片沿 x 的宽度趋近零)。 我们这样写答案: ∫2xdx=2x2+C\int2xdx=2x^2+C ∫2xdx=2x2+C # 法则 常用函数 函数 积分 常数 ∫a dx ax + C 变量 ∫x dx x2/2 + C 平方 ∫x2 dx x33+C\frac{x^3}{3}+C3x3​+C 倒数 ∫(1/x) dx ln x + C 指数 ∫ex dx ex + C ∫ax dx ax/ln(a) +...
13k 字 11 分钟

# 矩阵 正定矩阵 酉矩阵 埃尔米特矩阵 共轭转置与转置 奇异值分解 # 秩 一个矩阵主元的数量就是 rank,就是化简到最后的主元 就是有多少个解 rank = 基的维度 = 列向量的 当 R=n<mR= n<mR=n<m 的情况,有 0 或一个解例如.I 是定义矩阵,其中 0 是自由行,m 是 row number 行数,n 是 colunm number 列数 F...
3.5k 字 3 分钟

# 偏导数 偏导数(英语:partial derivative)的定义是:一个多变量的函数(或称多元函数),对其中一个变量(导数)微分,而保持其他变量恒定,函数𝑓关于变量𝑥𝑥x的偏导数写为𝑓𝑥′𝑓𝑥′fx′或∂𝑓∂𝑥∂𝑓∂𝑥∂f∂x。偏导数符号∂∂∂是全导数符号𝑑𝑑d的变体。 对于导数是一元上是切线也就是变化率,但在多元上一个曲面有无穷多条切线,偏导数就是选择其中一条切线,并求出它的斜率。 # 定义 对于函数 f(x,y)=fx(y)=x2+xy+y2。f(x,y)=f_x(y)=x^2+xy+y^2。 f(x,y)=fx​(y)=x2+xy+y2。 对 y...
6.2k 字 6 分钟

# Jacobi 迭代和 Gauss-Seidel 迭代 # Jacobi 迭代 先是线性方程组Ax=bAx=bAx=b, 其解我们可以写成方程组a11x1+a12x2+…a1nxn=b1a_{11}x_1+a_{12}x_2+\ldots a_{1n}x_n=b_1a11​x1​+a12​x2​+…a1n​xn​=b1​, 其中xxx 是未知数,A 和 b 是已知的数,A 和 b 的行列数是一样的。 #...
18k 字 16 分钟

# 利用 FFT 求解压力柏松方程加速烟雾流体模拟 # 前言 往往在基于欧拉网格 2d 烟雾流体模拟中,求解压力场是最费事的一部份,其他步骤莫过于采样上下左右,求散度或梯度,还有平流,而在求解压力场的时候,这需要 Jacobi 迭代法迭代 20~30 次以上才能有好的效果,单单这一步骤的耗时就可能去到 1~2ms 以上,在有一次无意中接触到了 FFT 解柏松方程,就转念一想用迭代法求解烟雾压力场也是个柏松方程,而且 FFT 还是利用 GPU 并行效率快去求解,所以就有今天利用 compote shader 的并行通过 FFT 求解柏松方程,只需要一次就可以求解出压力场。 # NS...
5k 字 5 分钟

# 流体力学基础 # 连续方程 {积分形式:∂∂t∫∫∫pdV+∬cs(ρg→)⋅ds→=0微分形式:∂P∂t+∇→⋅(ρU→)=0\begin{cases} \text {积分形式}:\frac{\partial}{\partial t}\int\int\int pdV+\iint_{cs}(\rho\overrightarrow{g})\cdot d\overrightarrow{s}=0\\\\\text...
3.3k 字 3 分钟

# N-S 动量守恒方程 NS 方程的积分形式 ∂∂t∭pv⃗dV=−∬cs(ρv⃗⋅ds⃗)v⃗+∭cvpf⃗dV−∬cspds⃗+F⃗vis∂∂t∭pv⃗dV+∬cs(ρv⃗⋅ds⃗)v⃗=−∬cspds⃗+∭cvp⃗f⃗dV+F⃗vis\begin{aligned}\frac{\partial}{\partial t}\iiint p\vec{v}dV=-\iint_{cs}\left(\rho\vec{v}\cdot...
140 字 1 分钟

# 奥高公式 奥高公式也称高斯公式,就是最下面一项,就是通量等于散度的体积分 对于左边而言,就是整个大控制体的通量,右边而言,分着看每个小控制体的散度积分,因为两个小控制体而言,左边和右边的通量相加必定等于 0,因为从左边流入到右边其 通量就是正反关系,所以积分过后就是等于大体积通量
20k 字 19 分钟

# MPM 雪、海绵 # 简介 在上一篇文章写完了 MLS-MPM 对于水的模型后,想着记录下其他材质的模拟方法。其实这一篇对现在的项目来说没什么卵用,但打算还是记录下,因为我知道未来在游戏肯定会用上实时模拟,现在所学的没用的东西都是为了未来做铺垫。那么这一篇就写其他弹性材质的其他数学模型。这就是用 MPM 的好处。就是对于其他弹性材料我们只需要换一个数学模型就可以模拟出来并且还可以把他们整合在一起产生互相交互,并且只需要在 P2G 上面做材料判断就可以实现,非常简单,不需要水用 FLIP,软体用 FEM 这样重新写一遍。 Elastic Object (塑形物体):就是用 Neo...
12k 字 11 分钟

# MPM 水 # 简介 对于流体模拟来说有两种视界,一种是拉格朗日视角一种是欧拉视角, 拉格朗日视角就是把物理量存在粒子上,因为粒子是自由移动,所以很容易做 advection,做起动量守恒很容易,但粒子是离散化,使得检测周围邻居变得异常困难,但可以用哈希结构数据储存来检索,就像 niagara neighbor 3d 欧拉视角则是把世界分为一个个 grid,所有物理量在都是在 Grid 上,因为是 Grid 所以很容易求出 Projection,就是压强,但欧拉 grid 面对 advection 很难,模拟的时候回流能量损失,流体看起来非常粘 而 MPM...
11k 字 10 分钟

# 奇异值分解 # 特征值和特征向量 特征值和特征向量的定义如下 𝐴𝑥=𝜆𝑥 其中 A 是一个𝑛×𝑛的实对称矩阵,𝑥是一个𝑛维向量,则我们说𝜆是矩阵 A 的一个特征值,而𝑥是矩阵 A 的特征值𝜆所对应的特征向量。 # SVD 定义 D 也是对矩阵进行分解,但是和特征分解不同,SVD 并不要求要分解的矩阵为方阵。假设我们的矩阵 A 是一个𝑚×𝑛的矩阵,那么我们定义矩阵 A 的 SVD 为: A=UΣVTA = U\Sigma V^T A=UΣVT 其中 U 是一个𝑚×𝑚的矩阵,Σ 是一个𝑚×𝑛的矩阵,除了主对角线上的元素以外全为...
4.1k 字 4 分钟

# Volume Rendering 在光传播时,抽象点来说就是分子把收集到的光带到你的眼睛里,但这过程中会发生各种情况扰乱光的传播。 通过介质传播到眼睛的光束会由于以下原因损失能量 吸收(Absorption)吸收了一部份的光,把收集到的光吸收了一部份 外散射(Out-scattering)把一部份光散射出去给别的分子,从而光能力不能到你的眼睛 通过介质传播到眼睛的光束会由于以下原因损失能量 自发光(Emissive)就是自己的光能量 内散射(In- Scattering)把从四面八方发射出来的光收集起来带到我们的眼睛,可以理解为 Irradiance 渲染时候用...
25k 字 23 分钟

# 新建 niagara renderer # UNiagaraRendererProperties 这是个 niagara renderer 的资产,通过 Uobject 反射宏机制生成界面,让用户可以实现各种绑定材质和各种参数什么的,就是这东西: 顺便说一下其他一些要用到类对应 niagara 界面控件 FNiagaraVariableAttributeBinding: FNiagaraVariable: 说回 RendererProperties,RendererProperties 要通过函数注册到 Niagara editor 模组里面,这样就可以再 Niagara...
9.8k 字 9 分钟

RHI 全称是 Render Hardware Interface(渲染硬件接口) ,是 UE 渲染体系中非常基础且重要的模块,封装了众多图形 API(DirectX、OpenGL、Vulkan、Metal)之间的差异,对 Game 和 Renderer 模块提供了简便且一致的概念、数据、资源和接口,实现一份渲染代码跑在多个平台的目标。 开启 RHI 线程的情况下,与 RHI 相伴相随的还有 RHI 线程 ,它负责将渲染线程 Push 进来的 RHI 中间指令转译到对应图形平台的 GPU 指令。在部分图形 API(DX12、Vulkan、主机)支持并行的情况下,如果渲染线程是并行生成的 RHI...
2.9k 字 3 分钟

# 变量类型 HINSTANCE HINSTANCE 是 Windows 里的一中数据类型,其实就是一个无符号的长整形,是 32 位的,是用于标示(记录)一个程序的实例。它与 HMODULE 是一样的(通用的,这两种类型最终就是无符号长整形)。 HINSTANCE, 分开看就是 H + INSTANCE, 其中 H 代表 HANDLE(再程序中翻译为 “句柄” 的意思),INSTANCE 中文就是 "实例" 的意思。 想得到一个实例, 可通过全局 API 函数 GetModuleHandle 得到,参数传入模块的名字(exe 或者 DLL...
2.4k 字 2 分钟

# 美术贴图资源 PBR 流程 # 两种工作流程 Metal / Roughness 容易调参,应用广泛,但是无法调节菲涅尔反射值。 Specular/Glossiness 的话,可以修改菲涅尔值,但是容易破坏能量守恒。 # 金属 / 粗糙度工作流(Metal / Roughness) # base color RGB 贴图 - sRGB 我们通过折射率算出的折射光线是被吸收的光线。对于金属来说部分光线反射,折射光线直接被吸收。金属的颜色来自于折射的光线也就是 F0, 也就是说金属的 F0 就是金属的颜色。 虽然金属度为 1 通常是剖光金属,通常金属可以在 235-255 sRGB...
7.6k 字 7 分钟

# 基于 LBM (Lattice Boltzmann Method) 流体模拟 相对于基于解 N-S 方程的流体模拟方法,Lattice Boltzmann Method,简称 LBM,LBM 是另外一种截然不同的方法,这种方法和传统解 N-S 方程关系不同,传统方法是纯数值求解,通过逼近域来求解偏微分方程,但大多数求解都局限在二阶精度。LBM 方法避免了传统方法求解流体力学方程的复杂求解及低精度,但也能实现逼真的流体模拟动画,因为不同复杂求解 N-S 方程,所以速度上会快很多,在 3070s 显卡 1024 分辨率仅需 0.06ms,但缺点是显存占用比较多,因为要存 9...
3.1k 字 3 分钟

# 薄膜干涉 # 光程(optical path difference) 先说一下前置知识 光程就是是指在均匀介质中,光行径的几何路径的长度 s 与光在该介质中的折射率 n...
4.1k 字 4 分钟

# Virtual Texture 解析 FVirtualTextureSystem 是整个 Virtual Texture 的管理类,几乎所有的 VT 系统的操作都会通过他来进行调度。 FVirtualTextureSpace 用来管理 Page table 的,其数量上有明显的上限,只有 16 个。一个 Page table 资源对应一个 FVirtualTextureSpace 对象。这里限制的原因应该是标志位的限制,我们在 FeedBack 中仅有 4 位留给我们判断属于哪个 Page table。 FVirtualTexturePhysicalSpace 用来管理 Physical...
2.9k 字 3 分钟

# VirtualTexture # 什么是 VirtualTexture 虚拟纹理就是一种以空间换时间的纹理流送技术,好处是可以让我们使用高分辨率贴图不受内存和带宽影响。 传统流送就是在需要使用某张纹理的时候会一次性将对应的 mip 的整个纹理全部加载到 GPU 内存中,即使这个纹理只看到一小部分,这样就会照成巨大的带宽消耗,而虚拟纹理就是把一张大的贴图切成一个个小 page,只有在看到这个 page 的时候才会加载到内存中 # UE 的 VT 虚幻引擎 4 (UE4) 支持两种虚拟纹理方法:运行时虚拟纹理 (RVT) 和 流送虚拟纹理...
4.6k 字 4 分钟

# 阴影初始化 阴影初始化 InitDynamicShadows 的主要过程,如下: 根据 view、场景光源、控制台变量初始化阴影相关标记。 遍历场景所有光源(Scene->Lights),执行以下操作: 如果光源没有开启阴影或阴影质量太小,或者光源在所有 view 都不可见,忽略之,不执行阴影投射。 如果是点光源全景阴影,则将该光源组件名字加入 Scene 的 UsedWholeScenePointLightNames 列表中。 如果符合全景阴影的创建条件,调用...
3.2k 字 3 分钟

# ShadowMap 若用 d 记作物体在 Shadowmap 中采样获取的深度,z 表示物体的光源坐标深度,f 表示阴影值,那么基础 Shadowmap 算法可以表示为: f(z)=H(z−d)f(z)=H(z-d) f(z)=H(z−d) H(x)=0(x≥0),1(x<0)H(x)=0(x\geq0), 1(x<0) H(x)=0(x≥0),1(x<0) # Shadow 这里直接用 scenecapture2d 作为灯光捕捉的深度,传到材质里,同时也把相机的 VP 矩阵也一起传到材质里,做深度对比。 #...
4.4k 字 4 分钟

# 使用自定义 Niagara 数据接口 继承自 public UNiagaraDataInterface FNDIMousePositionProxy1234567891011121314151617181920212223242526272829struct FNDIMousePositionProxy : public FNiagaraDataInterfaceProxy{ virtual int32 PerInstanceDataPassedToRenderThreadSize() const override { return...
1.3k 字 1 分钟

# 前言 UE 在 5.1 更新了 OIT 算法,其算法原理很简单,把半透明重写写入深度进行排序和颜色混合。这里主要记录一些细节和官方的做法,同时也水一篇文章 # 原理 首先 UE 有两种 OIT 排序,一个是 EOITSortingType::SortedTriangles 三角面排序,另一个是 EOITSortingType::SortedPixels # SortedTriangles 其中三角面排序,可以直接在 component...
20k 字 18 分钟

# 渲染机制解析 类型 解析 UPrimitiveComponent 图元组件,是所有可渲染或拥有物理模拟的物体父类。是 CPU 层裁剪的最小粒度单位。 FPrimitiveSceneProxy 图元场景代理,是 UPrimitiveComponent 在渲染器的代表,镜像了 UPrimitiveComponent 在渲染线程的状态。 FPrimitiveSceneInfo 渲染器内部状态(描述了 FRendererModule 的实现),相当于融合了 UPrimitiveComponent and...
13k 字 11 分钟

# Scene View Extension 在 UE4.17 的时候官方开放了可以在后期插入自己 pass 的接口,那么我们就可以写自己的 shader,甚至可以写 compute shader 去做后期处理。还可以做多 pass。而且使用方式也很简单 我们只需要继承 FSceneViewExtensionBase 12345678910111213class GAMES202_API FDualKawaseBlur : public FSceneViewExtensionBase{public: FDualKawaseBlur(const...
17k 字 16 分钟

# 深入 GPU 和渲染优化(基础篇) # 基础概念 GPU架构概述 GPU 架构概述 GPU,全称为 Graphics Processing Unit,即图形处理单元。 GPU 主要包含控制模块,计算模块和输出模块。 渲染输出单元,纹理映射单元和着色器处理单元 / 流处理器 计算模块 计算模块由通用计算单元组成,即 GPGPU,它适用于所有 shader 类型。 TPC 通用计算单元中,最核心的计算模块,称为 Texture Process Cluster (TPC),它负责: (1)纹理采样 (2)顶点插值,顶点剔除 (3)shader 载入 (4)shader...
11k 字 10 分钟

# 前言 在 ue 里面实现多 pass 比我想象中要简单,并不需要改引擎既可以实现。多 pass 本质上其实就是模型多画一次,所以 ue 需要多 pass 时候只要把模型多复制一份出来就好了,但这样显得有些些蠢,而且 drawcall 也会增加,所以这篇文章就是介绍基于图元多插入一个或多个 Material 来实现多 pass。 # 讲解 首先介绍一下 UE 的模型渲染机制 首先可以看到上图,网格体渲染从 FPrimitiveSceneProxy 开始,FPrimitiveSceneProxy 负责通过对 GetDynamicMeshElements 和...
3.7k 字 3 分钟

# 智能指针 UObject 本身就可以帮我们做回收,做释放的,为了可以在更好释放内存,避免出现野指针,而出现智能指针 # 为什么使用虚幻 4 的智能指针库? std::shared_ptr 不是在所有的平台都能用的 可以和其它虚幻容器及类型无缝协作 更好的控制平台特性,包括线程处理和优化 # 优点 可以像常规的 C++ 指针那样复制,解引用,比较共享指针等 防止内存泄漏:当没有共享引用时资源自动删除 包含了可以通过多线程安全地进行访问的 “线程安全” 版本 可以创建任何类型的对象的共享指针 支持针 “const”、前置声明的不完全类型、类型转换等 #...
7.9k 字 7 分钟

# Lumen Lumen 是各种 GI 技术的整合,可以简单概括成 SDF (Mesh 距离场 + 全局距离场) + “体素”(Surface Cache) + SSGI (屏幕空间追踪)+ RSM (Reflective Shadow Map) + 硬件光追(lumen 补充) SDF (Mesh 距离场 + 全局距离场): 软光追加速结构,其中 Mesh 距离场在 UE4 里已被用于 DFAO,而全局距离场是一张合并了相附近所有 Mesh 距离场的 texture,为了避免遍历每个网格距离场的一种 “低配” 方案;这俩正好对应项目设置里的两种追踪模式:Detail Tracing 和...
5.6k 字 5 分钟

# Nanite 基于 Mesh Shader 的 Pipeline,Cluster 剔除成为了顶点处理阶段的一部分,减少没必要的 Vertex Buffer Load/Store Nanite 把实现分成两个过程三个部分: 预处理过程:在模型导入或者在引擎中修改模型设置时处理,把高模预处理成一簇簇的三角形簇,建立分层分页结构用于渲染和加载 把模型分成 Cluster, 类似 Meshshader 中的 Meshlet。划分在拓扑空间中邻近的 Cluster,是为了提高访问数据时 Cache 命中率。Cluster 分割使用 Metis 库把模型的顶点数据进一步切分为更细粒度的...
192 字 1 分钟

# UnifomBuffer Uniform Buffer 涉及了几个核心的概念,最底层的是 RHI 层的 FRHIUniformBuffer,封装了各种图形 API 的统一缓冲区(也叫 Constant Buffer) 如果项目处于开发阶段,最好将 Shader 的编译选项改成 Development,可以通过修改 Engine\Config\ConsoleVariables.ini
766 字 1 分钟

# shader 优化 避免 if、switch 分支语句。 避免 for 循环语句,特别是循环次数可变的。 减少纹理采样次数。 禁用 clip 或 discard 操作。 减少复杂数学函数调用。 使用更低精度的浮点数。OpenGL ES 的浮点数有三种精度:highp(32 位浮点), mediump(16 位浮点), lowp(8 位浮点),很多计算不需要高精度,可以改成低精度浮点。 充分利用向量分量掩码。 避免重复计算。可以将所有像素一样的变量提前计算好,或者由 C++ 层传入: ・向量延迟计算。 避免或减少临时变量。 尽量将 Pixel Shader 计算移到...
449 字 1 分钟

# shader 编译 shader 的编译是由 RecompileShader 命令去处理过程,里面是 BeginRecompileGlobalShaders 开始编译指定的 shader,shader 的编译作业由全局对象 GShaderCompilingManager 完成,最终的 shader 编译作业实例类型是 FShaderCommonCompileJob,它的实例对进入一个全局的队列,以便多线程异步地编译。 FShaderCompilingManager::AddJobs 等接口加入到 FShaderCompilingManager::CompileQueue 队列中,然后主要由...
4.2k 字 4 分钟

最近疫情被锁在家里半个月多月,有点无聊总想搞点什么,就突然想到我模拟这块在 niagara 上已经做过了基于欧拉视角的 NS 公式和 SPH 模拟流体,还有基于 PBD 的 rigid body dynamics,用 jocobi 迭代隐式积分求解 Mass-spring systems,都是基于 GPU 的效果,无奈 niagara 是个方便的 compute shader,就想着还有什么效果没做过的,就想到个 softbody,前面流体的 niagara 文章在知乎很多大佬都写过,在 b 站也有解析教程,但反观 rigidbody 和 softbody 的 niagara...
5.6k 字 5 分钟

# GPU # SIMD SIMD (Single Instruction Multiple Data) 单指令多数据,例如多维向量 ,c++ 里 SSE 就是调用单指令多数据 SIMT(single Instruction Multiple Threads) 单指令多线程,可对 GPU 中单个 SM 中的多个 Core 同时处理同一指令,并且每个 Core 存取的数据可以是不同的。 GPC (图形处理集群) 计算、栅格化、阴影和纹理处理。40 系列安培架构里面还塞了 AI,还有光追 SM  (流式多处理器)      运行 CUDA 内核的 GPU 的一部分 SFU(Special...
14k 字 13 分钟

# FEM (有限元分析) X10 ,x20,x30 竖向量写入矩阵,逆矩阵后行列式 * 1/6 是四面体面值 大 X 是形变前,小 x 是形变后 矩阵的迹是对角线相加 µ 和 λ 自定义输入,为摩擦力 F0 = -f1...
1.9k 字 2 分钟

# Laplacian 算子(拉普拉斯算子) 在數學以及物理中,拉普拉斯算子或是拉普拉斯算符(英語:Laplace operator, Laplacian )是由欧几里得空间中的一個函数的梯度的散度给出的微分算子,通常写成 Δ、∇2或∇⋅∇{\displaystyle \Delta }、{\displaystyle \nabla ^{2}}或{\displaystyle \nabla \cdot \nabla...
9.4k 字 9 分钟

# GJK 碰撞检测 闵可夫斯基和是两个欧几里得空间的点集的和,也称为这两个空间的膨胀集, 例如,平面上有两个三角形,其坐标分别为 A={(1,0),(0,1),(0,-1)} 及 B = {(0, 0), (1, 1), (1, −1)},则其闵可夫斯基和为 A + B= {(1, 0), (2, 1), (2, −1), (0, 1), (1, 2), (1, 0), (0, −1), (1, 0), (1, −2)}。 若推广至流形的连续集,闵可夫斯基和从几何上的直观体现即是 A 集合沿 B 的边际连续运动一周扫过的区域与 B 集合本身的并集,也可以是 B 沿着 A...
7.6k 字 7 分钟

# Rigid body 角速度 = 点的 vector *rotate matrix(随着力矩变化而变化)cross force vector,就是旋转轴,抵抗质量总和起来是因为每个质量离力矩不同所产生抵抗不同,旋转矩阵 R 每一帧随着力矩改变 角速度质量 I ref 是所有顶点质量的总和 ri 转置矩阵乘 ri 是等于 ri 长度 1 为单位矩阵 # Impose 碰撞 Impose 方法致力于即时的反应,并且考虑了库伦定律的作用,因此计算摩擦相对容易。 Impose 方法认为刚体满足其最基本的定义:无法产生形变,因此 impose 方法严格按照碰撞方程进行。 假设发生碰撞,则...
782 字 1 分钟

# 格拉姆 - 施密特正交化 在线性代数中,如果内积空间上的一组向量能够组成一个子空间,那么这一组向量就称为这个子空间的一个基。Gram-Schmidt 正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。 这种正交化方法以约尔根・佩德森・格拉姆和艾哈德・施密特命名,然而比他们更早的拉普拉斯(Laplace)和柯西(Cauchy)已经发现了这一方法。在李群分解中,这种方法被推广为岩泽分解(Iwasawa decomposition)。 在数值计算中,Gram-Schmidt...
2.3k 字 2 分钟

# 双边滤波函数 既然高斯模糊没有良好地保留边界,我们就选取一个能够保边去噪的滤波器,高斯双边滤波算法就是这样的一个滤波器。高斯模糊仅仅考虑了像素的空间分布,权重从中间向周边降低。而双边滤波则进一步考虑了图像的像素值,从而保证边缘部分不会被过滤掉。根据维基百科...
442 字 1 分钟

# 矩阵 逆矩阵 = 伴随矩阵 * 1 / 矩阵的行列式值(绝对值) 伴随矩阵 = 余子式矩阵对角变换 https://www.shuxuele.com/algebra/matrix-inverse-minors-cofactors-adjugate.html # 矩阵的行列式值求法 |A | 代表矩阵 A 的行列式和绝对值的符号一样 矩阵的行列式 行列式的几何意义是面积体积,2x2 矩阵的行列式是平行四边形的面积,3x3 矩阵的行列式是正方体也就是六面体的体积,行列式也代表线性变化的缩放程度,大于 1 则放大...
263 字 1 分钟

# Ambient Cube ambient cube 是 valve 在 2004 年开发半条命 2 使用的一个提供间接光的技术。该方法的资料不多,核心思想是将一个 vpl 看作一个 cube。cube 有六个面,每个面中存放相对于的颜色。在 evaluation 阶段,通过法线去索引这六个面中的 3 个面,最后通过权重去做混合。 六个 float3 的参数,带宽占用在 2 阶球谐和 3 阶球谐之间。效果基本上和 2 阶球谐一样。优势在于 evaluation 阶段,alu 开销小于 2 阶球谐,在移动端中的性能要好一些。
7.3k 字 7 分钟

# 材质系统解析 UMaterial 是 material 的资源,就是我们在 constant 上的 material,material 真正被用于运算的好似 UMaterialInterface。UMaterialInterface 是材质的基类,UMaterial 和 UMaterialInstance 都派生自它 一个 UMaterial 里面会有很多 FMaterial,一个 FMaterial 会存储特定平台,特定质量等级的 Shader 和资源,因为一个 UMaterial 有很多平台,质量等级的储存需求,所以会存很多 FMaterial。 FMaterialResource 是...
4.9k 字 4 分钟

# BRDF 方程 小数字 0 为观察视觉,i 为入射角,Li 为 radiance 这里的 “kd” 是入射光线中被折射部分的能量所占的比率,而 “ks” 是被反射部分的比率。 法线分布函数 D 项 在现代引擎中流行和常用的 NDF 为 GGX (Trowbridge-Reitz) 法线分布函数。D (h) 来描述组成表面一点 的所有微表面的法线分布概率。则可以这样理解:向 NDF 输入一个朝向 h, 这个 h 向量为法线 dot 半向量(view direction 加 light direction),NDF 会返回朝向 是 h 的微表面数占微表面总数的比例,a 为...