AI导读
🤖 欢迎来到 Vanish 的技术花园
更新时间: 2026-01-12 19:34:24
质量概览: 收录文章 49 篇,平均分 69.8。本文由 AI (DeepSeek-V3) 自动生成。
🧭 博客概览
博客概览:
这位博主深耕实时渲染与图形学领域,尤其专注PBR(基于物理的渲染)、阴影算法(如PCF、MSM)、SDF技术和高级光照模型(如Anisotropy、Sheen)。技术栈涉及Unity引擎和C#/.NET生态,同时具备扎实的数学与底层原理功底(如Split Sum、JFA算法解析)。文章风格既包含硬核理论推导(“从理论到实践”系列),又兼顾工程落地(如Unity中的JFA实现),甚至用“一键入坑到入坟”这种幽默表达化解技术门槛——妥妥的图形学老司机,既能掰开公式讲透原理,又能带你在代码里快乐飙车!🚀
👨💻 关于作者
Vanish 是一位热衷于探索计算机底层奥秘的开发者。他的座右铭是 KeepLearning。从图形学渲染算法到 .NET 框架的源码分析,他总是试图透过现象看本质,用代码构建更真实的世界。
🏆 编辑精选 (Top 10)
🥇 ...
DDGI介绍
摘要:DDGI是NVIDIA提出的动态漫反射全局光照技术,通过光线追踪更新探针数据,实现动态场景下的实时全局光照,解决了传统辐射探针无法处理动态变化和光照泄露的问题。
前言
DDGI(Dynamic Diffuse Global Illumination,动态漫反射全局光照).是由Nvida于2019年推出的一种基于Probe,基于RayTracing(光线追踪)的动态漫反射全局光照技术,可以在动态的场景与光照中实时的生成漫反射的全局光照.
全局光照
在实时渲染领域中,实现全局光照意味着实现间接光照,即光线弹射两次或更多次后进入人眼的光照。
在DDGI技术出现的2019年之前,学界在解决全局光照问题时的方法就已经可谓是百花齐放,所以我们先简单回顾一些经典的全局光照的解决方案.
Baked Global Illumination
Baked Global Illumination(烘焙全局光照)或称Lightmap(光照贴图)是一种离线计算全局光照的方法,也是目前游戏中主流的解决方法.
这种方法的基本思路是将场景中的光照信息预先计算并保存为一张光照贴图,然后在渲染时直接读取光照 ...
DotNet响应式编程,一键入坑到入坟
前言
这是一份面向 .NET 工程师的 Rx.NET 学习与实践指南:从 IObservable/IObserver 基础,到 Subject 类型、冷/热源、多订阅控制,再到调度器与线程模型、时间类操作符、错误处理与测试,最后给出落地的最佳实践清单。适合希望系统性掌握响应式编程并在实际项目中安全使用 Rx 的读者。
你可以在Rxxxxxxx中找到一些代码示例
对于调度器一章节,为了更好理解,可以查看这个仓库:VaniRx
Part1 - Why Rx
.NET事件的问题
讽刺的是,如果没有event关键字,c#的对事件的处理会更好
.NET event关键字基本问题是: 它们在 .NET 类型系统中得到了特殊处理, 使得没法像对象一样操作事件,比如存储在字段中,作为参数传递,不能使用LINQ,不能拓展等等.
event唯一的优势在于: += & -=
IObservable
IEnumerable<T> vs. IObservable<T>
IEnumerable<T> 让代码(IEnumerator)可以主动获取值 ...
PBR--从理论到实际
摘要:本文介绍基于物理的渲染(PBR)核心技术,涵盖辐射度量学基础概念(辐射能量、通量、强度等)和关键光照计算模型(BRDF),阐释光线与材质交互的物理原理及实现方法。
状态: 更新中…
Intro
前置知识
辐射度量学
下面的所有概念,请记英文(因为中文翻译千奇百怪).
Radiant Energy(辐射能量)
单位: J(焦耳)
用于描述能量的大小.比如一颗原子弹能释放的总能量大约为10^10 J.
Radiant Flux(辐射通量)
单位: W(瓦特)
单位: lm(流明,照明度单位,lumen)
单位: J/s(焦耳每秒)
描述单位时间内通过某一面积的辐射能量.比如太阳mitted的辐射通量大约为3.828 x 10^26 W/m^2.
Radiant Intensity(辐射强度)
功率/立体角
单位: W/sr (瓦每立体角)
单位: cd(坎德拉,candela)
太阳照的坎德拉为3.828 x 10^10 cd/m^2.
地球在太阳的立体角为: 23.45 deg.
可求太阳对输出的功率为: 3.828 x 10^10 W/m^2 * 23.45 ...
从PCF到MSM
在实时渲染中, 有一个常常被使用的约等式:
问题在于,什么时候这个等式比较正确呢?
积分域比较小时
g(x)在积分域中变化不大时
在实时渲染中,对Rendering Equation有另一种解释:
多了一项V(p,wi),表示着色点到光源的Visibility.
那么我们就可以更改Rendering Equation为:
在RTR中,由于光源大部分是点光源或方向光,使得积分域小.而brdf是diffuse的时候变化也不大.这时近似就比较准确.
总结来说:
点光源,方向光
diffuse brdf/constant radiance area light
PCF(Percentage Closer Filtering)
PCF是用于解决shadowmap的锯齿问题的一种方法.
PCF的步骤如下:
对于每个着色像素
获取周围n*n个像素的深度值
用每个深度值与shadowmap的深度值进行比较得到一堆1和0
对所有1,0取平均值得到Visibility
效果如下:
注意:
不是对ShadowMap进行模糊
问题在于: 这开销肉眼的变大了不少,肯定会很慢.
人们发现 ...
Split Sum原理介绍
摘要:Split Sum通过将环境光照积分拆分为BRDF滤波和光照滤波两部分,利用预计算降维技术加速实时渲染。BRDF部分采用菲涅尔近似降维,光照部分使用多级mipmap快速查询,显著提升PBS的IBL计算效率。
基于图像的光照(Image based lighting, IBL)是一类光照技术的集合.其光源不是如点光源等直接光源,而是将周围环境整体视为一个大光源.
那么在shader中我们有了一张cubeMap(也可能是别的形式),如何用它来实现PBS(Physically Based Shading)呢?
或者说,我们如何用一张环境贴图来解渲染方程呢?
首先回顾渲染方程:
L(p,ωo)=∫H2f(p,ωi⋅ωo)Li(p,ωi)V(p,wi)cosθidwiL(p, \omega_o) = \int_{H^2} f(p, \omega_i \cdot \omega_o) L_i(p, \omega_i) V(p,wi) \cos \theta_i dw_i
L(p,ωo)=∫H2f(p,ωi⋅ωo)Li(p,ωi)V(p,wi)cosθidwi
在环境光照中 ...
Distance Field soft shadows
摘要:本文介绍基于距离场(SDF)的软阴影技术,通过RayMarching计算安全角度并转换为可见性,使用近似公式提升效率,具有实时性优势但需预计算距离场。
在介绍Distance Field soft shadows之前,我们首先得了解距离场.
距离场:对于每一个点,距离场的值表示该点最近的物体的距离.
距离场一大好处在于混合时的特性.
这样就可以非常方便地去做物体的Blending.
SDF被广泛使用在实时渲染的如RayMarching等的各种技术中.
如果我们能用SDF描述场景,比如这样:
可以发现一个关键点:
我们可以用SDF转换为"安全角度"–即有多少角度不会被遮挡,进而求Visibility.
即: SDF -> 安全角度 -> Visibility
而这正是Distance Field soft shadows的核心思想.
计算安全角度
对于我们的Shading point ,我们向光源做RayMarching.
然后在RayMarching过程中,每一步都可以计算出一个安全角度,取最小的角度.
计算角度很显然可以使用ar ...
Sheen从理论到实践
摘要:本文详解glTF光泽(Sheen)材质扩展的实现原理,涵盖光泽颜色/粗糙度的纹理映射与独立控制,重点解析基于Charlie分布的光泽BRDF模型及其微表面理论实现,适用于模拟天鹅绒类材质的背向散射效果。(79字)
本文为这篇文章的翻译与整理
光泽(Sheen)
属性
类型
描述
必需
sheenColorFactor
线性空间中的光泽颜色。
否,默认值:[0.0, 0.0, 0.0]
sheenColorTexture
光泽颜色纹理(RGB,sRGB传输函数)。
否
sheenRoughnessFactor
光泽粗糙度。
否,默认值:0.0
sheenRoughnessTexture
光泽粗糙度alpha纹理。
否
光泽计算
颜色和粗糙度
if (sheenColorTexture) {
sheenColor = sheenColorFactor * sampleLinear(sheenColorTexture).rgb;
sheenRoughness = sheenRoughnessFactor * ...
Anisotropy从理论到实践
摘要:本文介绍了各向异性(Anisotropy)渲染的核心实现,包括切线空间定义、纹理映射转换和各向异性GGX分布函数。重点讲解了anisotropyStrength参数对粗糙度的动态调整,并对比分析了UE4和glTF两种实现方案。
Anisotropy
前提:
必须定义切线空间
normalTex 和 anisotropyTex必须使用同一组uv
参数:
anisotropyStrength(float): [0,1] 表示沿指定方向增加粗糙度,默认方向是切线方向
anisotropyRoataion(float):
anisotropyTexture(Texture)
r & g : anisotropy Dir in [-1,1] tangent, bitangent
b : anisotropy strength
映射
rg: [0,1] -> [-1,1]
directonalAlphaRoughness = mix(materialAlphaRoughness, 1, anisotropyStrength^2)
其中:
material ...
在 Unity 中使用 JFA (Jump Flood Algorithm) 快速生成 SDF (Signed Distance Field)
摘要:本文介绍在Unity中使用Jump Flood Algorithm(JFA)高效生成Signed Distance Field(SDF)的方法,通过GPU并行处理种子图的迭代传播,最终通过像素坐标差计算SDF图,显著提升距离场生成效率。
What is JFA
这是一个用于构建 Voronoi 图和 SDF 图的算法.
其在GPU上效率很高
Algorithm
首先我们有一张 N∗NN*NN∗N 的种子图
比如下图:
其中有颜色的地方为种子, 没有的则是’未定义’
随着算法迭代, 最终整张图的想读都会被’定义’
伪代码如下:
对于每个步长 k∈{N2,N4,…,1}k \in \{ \frac{N}{2}, \frac{N}{4}, \dots, 1 \}k∈{2N,4N,…,1}, 执行一次 JFA
遍历$(x,y)$处的每一个像素$p$
对于每一个在$(x+i,y+j)$处的像素$q$ ( $i, j \in \{-k, 0, k\}$)
如果$p$未定义且$q$着色
将$p$的颜色更改为$q$的颜色
如果$p$着 ...
