我想根据本教程实现基于物理的渲染

我能够找到按流明排序的光源列表,但是我不知道如何在计算中使用它。

float attenuation = 1.0 / (distance * distance);
vec3 radiance = lightColor * attenuation;


如果光源是60W灯泡(780 lm),而在我的场景中一个单位是1厘米,那么lightColor应该是什么?

如何如果我有定向光(例如太阳),应该定义radiance吗?

评论

60w光源的颜色可以是任何颜色,具体取决于其波长。对于白色光源,“它不能仅由眼睛对形成图像的视觉感光器最敏感的绿色光组成,而必须包括红色和蓝色波长的大量混合光,而它们对它们的灵敏度要低得多。” br />

#1 楼


如果我有定向光(例如太阳),应该如何定义radiance


不同书籍中物理学的辐射有不同的定义。我将在此处使用具有辐照度和辐射通量的定义。

想象光子具有一些能量$ Q $。您的辐射通量$ \ Phi $是单位时间$ t $的能量$ Q $(因此是光子的数量)。要获取瞬时(无限短时间内)的能量,您可以使用$ \ lim_ {t \ rightarrow0} $随时间变化的能量变化($ \ Delta $),即

$$ \ Phi = \ lim_ {t \ rightarrow0} \ frac {\ Delta Q} {\ Delta t} = \ frac {dQ} {dt} $$

能量以焦耳和时间来度量以秒为单位,因此辐射通量以$ \ frac {J} {s} $为单位进行测量。因此,将辐照度$ E $定义为每个区域$ A $的辐射通量(请注意,辐照度通常是指到达某个区域的能量,而辐射度是指离开该区域,但定义完全相同)。由于以后可以使用无限小的区域补丁进行某些集成,因此我们再次走这条路线,但是我不会一直重写石灰。 Phi} {dA} $$

请注意,假设光子的传播方向垂直于表面。因此,辐照度以$ \ frac {J } {sm ^ 2} $。

要了解辐射,您需要了解立体角。我只是假设您这样做,否则请继续阅读,这对于基于物理的照明确实是一个重要的概念。

辐照度的问题是,您不能考虑光的任何方向性。方向性可以通过立体角$ \ omega $来表示,其中无限小的立体角$ d \ omega $可以看作是矢量。一张纸,一个发射光和一个接收光,大小均相等。您可以用辐照度表达所有您需要的东西。现在,让发光的纸张转变为灯泡,以灯泡的发光纸张为中心。突然之间,如果您测量接收纸张的角部或中心处的光线,就会有所不同。 $作为光的每个立体角的辐照度。 $ \ omega $是一个立体角,我们想再次使用无穷小的小角度,因此$ d \ omega $。
$$ L = \ frac {dE} {d \ omega} $$
因此,您的辐射度以$ \ frac {J} {sm ^ 2sr} $来度量,其中sr是立体角单位球面度,实际上是尺寸。

看看瓦特的定义,它是$ W = \ frac {J} {s} $,因此辐射度测量可以看作是$ \ frac {W} {m ^ 2sr} $。

编辑2017年8月4日:
最终的辐射度正是您计算为像素颜色的结果,即所见即所得。在现实世界中,它是波长依赖性,但在计算机图形学中,它当然是RGB颜色向量。因此,您无需定义辐射就可以计算。


如果光源是60W的灯泡(780 lm),并且在我的场景中一个单位是q,则lightColor应该是什么一厘米?


光通常使用不同的波长λ来确定光的颜色。例如,假设有一个红色光子,即$ \ lambda = 700nm $,那么它的能量为$ \ frac {hc} {\ lambda} $,其中$ h $是普朗克常数,$ c $是速度光,导致产生约$ 2.838 \ times10 ^ {-19} J $的红色光子。

如果您的灯泡“仅使用”一个单一波长,并且是$ 60W = 60 \ frac { J} {s} $灯泡,那么您可以计算出能量,辐射通量,辐照度和最终辐射率...如果您知道确切的光谱发射,也可以计算得出。
但是那可能不是

编辑于2017年8月4日:
因此,您(或更确切地说是教程代码)用于计算辐射率的方法过于简化了对光源建模的方式。它不直接考虑光源的功率,它只是由颜色矢量建模。


本教程要求您执行的操作是考虑您所使用的颜色想要您的灯光,并写下它的RGB值。如果您的光线只是白色,请使用(1,1,1)的RGB值,在场景中尝试使用它,然后如果您觉得它太亮,请降低该值直到满意为止(如果不满意,请增加该值)足够明亮)。

编辑于2017年8月4日:
如果您想使用基于物理的灯泡,则需要考虑更多因素,我真的建议您请继续阅读。
一本不错的书是《基于物理的渲染》(由Matt Pharr等人撰写)。
由于价格昂贵且需要花费很长时间才能阅读,因此您也可以尝试与Selfshadow博客上的前几年基于物理的着色课程材料相处。特别是对于塞巴斯蒂安·拉加德(Sebastien Lagarde)的“冻伤到基于物理的渲染”有一些解释

附带说明一下,通常将太阳建模为离光接收器太远,以至于您无需考虑衰减。因此,您只需乘以浅色(或将衰减设置为1)即可。

评论


$ \ begingroup $
感谢您的详尽解释。 “在您的场景中尝试一下,如果您觉得它太亮,请降低值直到满意为止”:PBR的整个目的不仅是要看起来不错,而且还要遵循物理定律来获得结果。我正在寻找(线性)RGB值和强度,可用于显示日光或灯的场景。但是目前我无法在该场景中放置灯光,因为我不知道在辐射度= lightColor *强度*衰减方程中哪种颜色和强度值是现实的
$ \ endgroup $
–Iter Ator
17年8月4日在21:42

$ \ begingroup $
@IterAtor,对不起,我以为您正在寻找的是渲染方法,而不是将现实世界转换为模拟(或尽可能接近)的方法。据我所知,颜色(在PBR中)通常取决于发光强度和温度。冻伤笔记中的第4章对此进行了解释。请注意,这是基于感知的。获得颜色的另一种方法是CIE颜色匹配和光的光谱发射。我真的建议您仔细阅读《冻伤》笔记,我想我不能给您比他们已经提供的更好的解释。
$ \ endgroup $
–皮重
17年8月6日在8:45

#2 楼

您需要将渲染方程式的光通量(流明,$ lm $)转换为亮度($ \ frac {lm} {m ^ 2sr} $)。为此,您需要了解光源的物理属性。例如,辐射半径为$ r $的球形光源的亮度$ L $辐射超过$ 4 \ pi $的立体角和光通量$ \ phi $的亮度为: pi ^ 2r ^ 2} $$
我认为最好使用亮度而不是光通量来直接定义光,尽管您可以使用光点仪简单地测量亮度,而不必使用笨拙的专用设备,或者受制造商提供的值限制

关于距离衰减,PBR中的所有光源都应为面光源,并且没有明确的光源衰减公式,因为距离衰减从渲染方程中自然得出。

在进行RGB渲染(而不是光谱/单色渲染)时,也最好使用光度单位而不是辐射度单位。以光度为单位,地外太阳亮度约为〜1.9B cd / m ^ 2(不过,请勿尝试使用点测光计测量太阳!)。如果要使用辐射度单位,则需要获取太阳的光谱功率分布,并将其与CIE颜色匹配功能集成在一起,以获得任何合理的值渲染。