DDGI介绍
前言DDGI(Dynamic Diffuse Global Illumination,动态漫反射全局光照).是由Nvida于2019年推出的一种基于Probe,基于RayTracing(光线追踪)的动态漫反射全局光照技术,可以在动态的场景与光照中实时的生成漫反射的全局光照.
全局光照在实时渲染领域中,实现全局光照意味着实现间接光照,即光线弹射两次或更多次后进入人眼的光照。
在DDGI技术出现的2019年之前,学界在解决全局光照问题时的方法就已经可谓是百花齐放,所以我们先简单回顾一些经典的全局光照的解决方案.
Baked Global IlluminationBaked Global Illumination(烘焙全局光照)或称Lightmap(光照贴图)是一种离线计算全局光照的方法,也是目前游戏中主流的解决方法.
这种方法的基本思路是将场景中的光照信息预先计算并保存为一张光照贴图,然后在渲染时直接读取光照贴图进行渲染.而在计算光照信息时,常常会用到光子映射的技术.
它们的优点是结果细腻,但是缺点是无法处理动态场景或动态光源.
这不由得让我想起了小时玩黑魂3时判断宝箱怪的技巧:没有影子的 ...
.Net响应式编程,一键入坑到入坟
前言这是一份面向 .NET 工程师的 Rx.NET 学习与实践指南:从 IObservable/IObserver 基础,到 Subject 类型、冷/热源、多订阅控制,再到调度器与线程模型、时间类操作符、错误处理与测试,最后给出落地的最佳实践清单。适合希望系统性掌握响应式编程并在实际项目中安全使用 Rx 的读者。
你可以在Rxxxxxxx中找到一些代码示例
对于调度器一章节,为了更好理解,可以查看这个仓库:VaniRx
Part1 - Why Rx.NET事件的问题
讽刺的是,如果没有event关键字,c#的对事件的处理会更好
.NET event关键字基本问题是: 它们在 .NET 类型系统中得到了特殊处理, 使得没法像对象一样操作事件,比如存储在字段中,作为参数传递,不能使用LINQ,不能拓展等等.
event唯一的优势在于: += & -=
IObservableIEnumerable<T> vs. IObservable<T>
IEnumerable<T> 让代码(IEnumerator)可以主动获取 ...
PBR--从理论到实际
状态: 更新中…
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 deg = 1.05 x 10^11 W/sr.
再比如这个灯泡:
Irradiance
功率/面积
单位 ...
NeRF介绍
NeRF介绍
前言NeRF(Nerual Radiance Field):神经辐射场,是在2020年被提出的一种三维重建技术。由于其对比传统三维重建技术来说有简单快速且效果好的优势,尤其是解决了传统三维重建难以处理的反射表面和烟雾等半透明物体,以至于迅速爆火甚至“出圈”。
三维重建我们经常会听到“渲染”一词,这是一个将计算机中存储的各种数据(Mesh,材质,光照等)通过一定的流程从而得到一张图片。而三维重建可以认为是这一过程的逆过程,即通过已有的图片,来还原一个三维的场景。
传统的三维重建技术一般有四个步骤:1. SfM(运动恢复结构)该步骤接受图像和摄像机内外参数作为输入,输出一个三维的稀疏点云2. MVS(多视立体视觉)该步骤将前一步的稀疏点云进行稠密化,进而输出稠密的三维点云3. 表面重建根据三维点云计算出三角网格4. 纹理重建通过输入图像为mesh计算出纹理
传统的三维重建很常常会出现模型有空洞和不正确的问题,并且需要很多的数据量,而且其中的算法颇为复杂。
NeRF OverViewNeRF对于传统三维重建技术最大的不同点在于,通过构建一个神经辐射场来隐式地表达了场景,而跳过了 ...
静态批处理 & 动态批处理 & GPU Instancing
Intro我们知道,在传统的渲染管线中,为了渲染一个物体,CPU需要向GPU发送一个DrawCall命令.比如下面这段代码:
glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);
而在下达DarwCall命令之前,CPU还需要设置好渲染状态,绑定顶点数据,绑定纹理,设置材质等等.比如这样:
glBindVertexArray(VAO); // 设置VAOmaterial->Use(); // 设置材质status->Set() // 设置物体各种状态//...glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);//DrawCall
值得注意的是,设置各种参数的操作费用不低,DrawCall也是一个非常费的操作(虽然现代图形API已经做了很多相应的优化).
这就出现了一个问题,看下面这个场景:
在这个场景中,各种各样的物体十分之多,如果每个物体都需要发送一次DrawCall命令的话,那么帧数将十分 ...
Sheen从理论到实践
本文为这篇文章的翻译与整理
光泽(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 * sample(sheenRoughnessTexture).a;} else { sheenColor = sheenColorFactor; sheenRoughness = sheenRoughnessFacto ...
Irridescence从理论到实践
本文为这篇文章的翻译与整理
彩虹色(Iridescence)彩虹色描述了一种色调随观察角和光照角变化的效果。
半透明层的薄膜产生相互反射,由于薄膜干涉,某些波长被吸收或放大。
例子包括肥皂泡、油膜和昆虫翅膀。
此扩展允许指定薄膜的厚度和折射率(IOR),实现彩虹色材质。
属性
类型
描述
必需
iridescenceFactor
彩虹色强度因子。
否,默认值:0.0
iridescenceTexture
彩虹色强度纹理。
否
iridescenceIor
薄膜层的折射率。
否,默认值:1.3
iridescenceThicknessMinimum
最小薄膜厚度(纳米)。
否,默认值:100.0
iridescenceThicknessMaximum
最大薄膜厚度(纳米)。
否,默认值:400.0
iridescenceThicknessTexture
厚度纹理。
否
强度计算:
iridescence = iridescenceFactor * iridescenceTexture.r
如果未设置纹理,假设值为1.0。
如果irid ...
ClearCoat从理论到实践
本文为这篇文章的翻译与整理
清漆层(Clearcoat)
类型
描述
必需
clearcoatFactor
清漆层强度。
否,默认值:0.0
clearcoatTexture
清漆层强度纹理。
否
clearcoatRoughnessFactor
清漆层粗糙度。
否,默认值:0.0
clearcoatRoughnessTexture
清漆层粗糙度纹理。
否
clearcoatNormalTexture
清漆层法线贴图纹理。
否
如果clearcoatFactor为零,整个清漆层将被禁用。
值计算清漆层强度和粗糙度可以使用因子、纹理或两者来定义。
如果未提供clearcoatTexture或clearcoatRoughnessTexture,则假设其纹理分量的值为1.0。
所有清漆层纹理在线性空间中包含RGB分量。
如果同时存在因子和纹理,因子作为线性乘数:
clearcoat = clearcoatFactor * clearcoatTexture.rclearcoatRoughness = clearcoatRoughnessFactor * ...
Anisotropy从理论到实践
本文为这篇文章的翻译与整理
各向异性(Anisotropy)引入了两个新的材质属性:强度参数和镜面反射相对于表面切线延伸的方向。
强度参数是范围在[0, 1]内的无量纲数字,它增加了沿选定方向的粗糙度。
默认方向与网格的切线对齐,如glTF 2.0规范中的网格部分所述。
切线空间要求使用各向异性材质的网格基元必须具有定义的切线空间:
它必须具有NORMAL和TANGENT属性,或者
其基础材质必须具有法线纹理。
如果网格基元没有NORMAL或TANGENT向量,它们将按照glTF 2.0规范的定义进行计算。
由于glTF 2.0不强制要求任何特定的切线空间推导算法,网格基元应该始终提供它们的NORMAL和TANGENT向量。
当材质同时具有normalTexture和anisotropyTexture时,这些纹理应该使用相同的纹理坐标,因为它们在同一切线空间中操作,且它们的纹素值通常相关。
各向异性纹理当提供时,各向异性纹理编码:
红色和绿色通道: 切线空间中各向异性方向向量的XY分量。
蓝色通道: 各向异性强度。
所有值都使用线性传输函数存储。
反量化
红色 [0, ...
函数式编程原则
函数式编程原则原则
优先使用表达式而不是语句
使用高阶函数
实现函数组合
Dos & Don’ts
Dos
尽力编写纯函数
隔离副作用
促进数据不可变性
使用 [Pure]
Don’ts
修改输入参数
忽视 [Pure]
忽略上下文: 盲目避免副作用,但实际上副作用是无可避免的
