PBR能量积分:环境光如何塑造像素

这篇文章阐述了PBR(基于物理的渲染)的核心原理。环境光从各个方向照射物体表面,每道光带有不同能量。通过BRDF函数描述材质对不同方向光线的反射比例,并考虑入射角度与表面法线的余弦影响。最终将所有方向的入射光能、材质反射率和夹角余弦三者的乘积进行积分(或离散求和),得到像素亮度。这个过程类似于将半球环境光分解为无数方向的光能贡献并累加,综合材质特性和光照角度,最终呈现逼真的光影效果。


1. 环境光的“采样与累计”

环境中的光线从四面八方(或称半球范围内)照射到物体表面。

每一道光线都带有自己的能量。


2. 材质反射函数(BRDF)

材质对不同方向光线的响应不一样,有的方向反射得多,有的反射得少。

BRDF(双向反射分布函数)描述了,不同入射角和出射角的能量反射比例。


3. 夹角影响(余弦项)

光线入射角度和表面法线夹角越大,能量分布得越稀,实际能作用在表面上的能量越小。

这个因素用余弦函数量化(即 (\cos \theta))。


4. 累积各方向贡献 = 能量积分

对每个方向:把入射的能量 × BRDF响应 × 夹角余弦,然后全部相加(积分)。

这样就把所有照向该点、被材质按不同方向反射到我们的眼睛的能量都统计了。

公式直观写法:
[
像素亮度 = \sum_{\text{每个方向}}~\text{入射光能} \times \text{材质反射} \times \text{夹角}
]
(实际是积分,但离散化可用求和)

案例类比

就像把整个半球分成无数小片,每个小片表示一个光来的方向,把它们的贡献累加起来。

比如窗外同时有阳光和环境散射光,阳光方向上能量很强,但其他方向上能量弱;材质也许只把某些方向上的光强烈反射到眼睛——你看到的像素亮度就取决于这些因素的综合。

结论

PBR的核心就是对整个环境的光能,在每个方向做“采样”,按材质和角度响应加总,就是你最终看到的像素高亮或阴影。

下面我详细展开,配合你前一句“半球分片,每片方向光照求和”的概念,让离散化具体细节更加清晰。


1. 离散化:把连续半球变成有限分片

理论上,入射光方向无限多,是一个连续的半球(甚至球体,如果要算次表面)。

在渲染时,我们无法对每个方向都计算,所以必须“离散化”——把半球分成有限数量的“小片区域”(方向片)。

比如分成100个、1000个等。

每片代表一个方向,一个立体角。


2. 每个小片(每个方向)怎么算光照?

每个小片,只对应一个方向的光照(可以理解为“朝x方向的一束光”)。

取这一片的中心方向,把沿这个方向来的环境光照拿出来用。

这个方向上的能量,可以是环境贴图采样,或者直接有光源就用光源参数。

对于每片,你都要算:
入射能量 × 材质对这方向的响应(BRDF) × 夹角(余弦项) × 分片的立体角大小。

公式示意:

该片贡献 = L(direction) × BRDF × cos(θ) × Δω
```
- L(direction):指这个方向上来的光照
- BRDF:表面材质对这个入射角、出射角的响应
- cos(θ):入射方向和表面法线的夹角余弦值
- Δω:这一个分片的立体角面积(分片越多面积越小)


3. 全部分片求和=积分逼近

对所有分片的贡献逐个求和,就逼近了理论上“积分”累加连续所有方向的效果。

总光贡献 = Σ(每片贡献)

分得越细,越接近真实物理;分得粗,反而只近似。


4. 实际实现(举个例子)

例如在环境贴图采样时,有的算法把整个环境贴图采样点分布在半球上,每个采样点对应一个方向,然后用上述加权法累加。

或者像Monte Carlo采样,随机挑许多方向,每个方向都做一次“该方向的光照贡献”计算,最后再求平均或累加。

总结直观解答:
**每个小片就是一个方向:**只对应一个方向的光照,算出贡献。
**所有分片的光照贡献都要加总,**累积起来,就是这一像素最终的光亮(明暗),即近似了能量积分。

你可以把这个方法想象为用一组“探测器”分别朝不同方向探光,然后把每个探测器测到的能量做材质和角度加权,再累加起来,就是像素亮度,这就是离散化处理能量积分的本质。

下面我用生动形象的案例来进一步介绍离散化采样和累计能量积分的具体流程。我们用一个“照相机和探头”+“切蛋糕分片”的有趣比喻来讲解。


案例故事:用小探头围着物体“分片”收集阳光

想象你有一个小球表面像素点,你想知道它有多亮(收到多少光)。你怎么测?

场景设定
这个像素点站在一个凹陷的小坑中心,头顶是半个透明穹顶(半球)。
环境里有点光(比如天光),头顶某处还有太阳直射。

Step 1. 把天空“切蛋糕分片”
你把上方的这个穹顶(半球)切成很多小扇形蛋糕片,比如你用一只圆规旋转,划出很多“扇形区域”。
每个分片代表一个“光的方向”。

Step 2. 每片安排小探头朝指定方向看光亮
在每个小蛋糕片的中心放一个小探头,让它朝自己那片的方向看,测有多少“能量”落下来。
有的探头空中正对太阳,很亮!
有的探头看到的是蓝天,亮度一般。
有的探头指向地面或者其他地方,可能收不到光。

Step 3. 每个探头要问材质“我这方向上反射多少?”(BRDF)
各个方向上的入射光,到了表面后,材质要决定能不能很容易“反射”到我们眼睛里。
假如是镜面材质,那只有某个方向反射最强烈,其他方向被大幅削弱。
如果是磨砂材质,那各方向都可以有一些反射。

Step 4. 还要考虑角度(太阳越斜,光“洒”得越稀)
导演喊:“你们要记得——光线贴着表面擦过来的时候,其实有效能量变小!”
每个探头都要乘以入射光和表面法线夹角的余弦值。

Step 5. 每个小探头算出自己“贡献”
比如A探头:收到0.8能量,反射系数0.6,角度因子0.5,还代表1/50的半球面积。
A探头最终贡献 = 0.8 × 0.6 × 0.5 × (1/50)
每个探头都这么算,代表自己的“扇形片区”。

Step 6. 把所有小探头的贡献累加
收集每个蛋糕片——哦不,是每个方向的“光照贡献”。
全部加起来,就是这个点/像素看到的最终亮度!

小结(更生动类比)
就像你参加一场阳光蛋糕派对,大家合力把一个蛋糕(半球天空)分成很多小块,
每个人只负责自己的一块光照进来有多少(并问材质大厨“要不要让我反射到相机里”),
最后你们把分到手里的蛋糕(能量贡献)拼起来,就是最终这一点的明暗——越努力分片,拿到的结果越接真实世界。
这样通过把复杂的光环境拆分成许多小方向分片,每片捡能量、打分反射、汇总加和,PBR模拟了真实环境下光和物体的相互作用,逐步构建出一幅又明又暗、细节丰富的画面!


版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/151050639

最新文章