2024-06-10 13:01:09    39    0    0

1 1 前言

DDGI(Dynamic Diffuse Global Illumination,动态漫反射全局光照)[1]是由Nvidia于2019年推出的基于光线追踪(Ray Tracing)的一种动态漫反射全局光照方案。

该方案基于Nvidia的RTX(Ray Tracing X)[2]标准和微软的DXR(DirectX Raytracing) API,本文所讲的是此方案在ue中的实现。

我们接下来将会一边介绍一些RTX光线追踪的概念和细节,一边对DDGI的实现进行逐行拆解。从而让读者在读完本文之后,不仅可以对RTX的诸多细节了如指掌,同时也可以完全了解一个朴素的GI方案在UE里是如何实现的。

并且会因为二者相互印证而产生迭代加深的理解,从而在记忆深处形成不可磨灭的印象。

本文将会分两次介绍光线追踪部分,第一次会介绍一下实现DDGI最基础流程所必须的一些概念和实现。第二次会在我们十分熟悉DDGI之后再进一步了解一下光追管线是如何与材质、着色等结合在一起,并最终得到一个相对完整的渲染流程拼图的过程。


2 2 啥是光线追踪

对于传统的光栅化流程来说,我们所看到的显示器屏幕上每个像素呈现的颜色,是由各个模型顶点经过光栅化之后得到每个像素的数据,然后进行着色计算得出的,然而这里的着色过程一般只有部分光源与当前着色点的信息,并不会充分考虑整个场景的物体分布和光线的传输方式,所以得到的结果与物理世界的真实情况一般会有比较大的差距。

而光线追踪则与光栅化完全不同的流程得到像素颜色的,它一般是从相机出发,对于每个像素点,都向场景投射一定数量的光线,直到光线与场景中物体表面相交,然后才在交点处根据物体材质和光照模型等进行着色。这个过程中也会在交点处根据材质决定光线发生反射或折射,继续进一步多次投射反射光线和折射光线,直到光线与下一个表面相交,直到光线到达光源或逸出场景。

所以整个着色过程充分考虑了场景的物体分布以及光线的传输方式,与物理世界的实际情况比较类似。

title

从一个更宏观的角度来说,光线追踪并不只是追求完成某个像素的计算流程这一单一的需求。它更多地代表着一种能力,即场景与光线求交的能力。这种能力可以解决对前面各种GI方案

2024-05-04 15:52:17    23    0    0

1 abstract

  • Linear Transformed Spherical Distribution(LTSD, 线性变换球面分布)。
  • Linear Transformed Cosines(LTC,线性余弦变换)。
    • M矩阵(逆矩阵/归一化/bake lut)。描述bsdf形状
    • roughness / anisotropy / skewness。
    • Nelder–Mead method(downhill simplex method),下降单纯形法。
  • Shading -- 多边形边积分(非面积积分)。
    • Stoke’s theorem。
  • 水平面裁剪。
    • if-else check。
    • proxy sphere to lut by vector form factor(vector irradiance)。
  • Fresnel修正(bake lut2)。描述bsdf大小
    • like split sum dfg lut。

2 LTSD

对于一个球面分布,可以使用一个3x3的矩阵对它的方向向量(即该分布的自变量参数)进行线性变换,从而将其转为另一个球面分布。

title

  • ω0。原分布的方向向量(输入)。
  • M。线性变换矩阵。
  • ω。变换后的方向向量。

则有

ω=Mω0||Mω0||ω0=M1ω||M1ω||
2023-12-24 03:50:48    102    0    0

1 This is a test

1.1 这是一个测试文件

DGGX=(1+tan2θm(cos2θmαt2+sin2θmαb2+sin2θmαb2))2


2 标题2

2.1 标题2.1

2.2 标题2.2

2.2.1 标题2.2.1

2.2.1.1 标题2.2.1.1

2.2.1.2 标题2.2.1.2

2.2.1.3 标题2.2.1.3

2.2.2 标题2.2.2

2.2.2.1 标题2.2.2.1


3 标题3

4 标题4

5 标题5

6 标题6

7 标题7

8 标题8


  1. cout << "hello, world" << endl;
  2. cout << "hello, world" << endl;
  3. cout << "hello, world" << endl;
  4. cout << "hello, world" << endl;
  5. cout << "hello, world" << endl;















fweqrwerwqrwqe

fweqrwerwqrwqe

fweqrwerwqrwqe

fweqrwerwqrwqe

fweqrwerwqrwqe
fweqrwerwqrwqe