我知道如何编程方向灯,点光源和聚光灯。但是有时候,人们的灯光形状像条形,甚至是圆环形。

从基于射线或光栅化的角度来看,这是如何工作的?

#1 楼

在环面光实现(Unity3D)中,我使用@JohnCalsbeek的答案中所述的实时方法。就像对待常规点/点光源并计算单个方向和距离一样对待它。

我使用Inigo Quilez网站上的圆环距离方程,这是我做的函数以获得指向圆环的方向

 float3 torusDirection(float3 p) {
float3 torusRel;
torusRel.xz = normalize(p.xz-_TorusLocation.xz);
torusRel.y = 0;

return -normalize(p-(TorusLocation+torusRel*TorusCenterRadius));
}
 


总体而言,我认为它工作得很好,减去了一些环视周围环面的区域。

高光提示也没有,但@JohnCalsbeek修改粗糙度的要点似乎应该解决了:)。

现在,使用灯光对我来说最困难的挑战是制作支持不同类型的区域灯和多灯的前向着色器。除了只为所有不同的光源提供一堆着色器属性外,我不知道该怎么做。目前,我将光作为延迟传递来应用,因此它仅适用于不透明的对象,但很快我将需要为透明对象制作一个正向版本。我认为这是真正的挑战,需要在前向着色器中获得多个区域照明。

这是我为测试矿井而制作的环形光的Shadertoy演示,它基于BeyondTheStatics形状的光演示。

评论


$ \ begingroup $
我已进行编辑以添加语法突出显示-如果有更合适的语言,请随时更改语言。
$ \ endgroup $
– trichoplax
15年8月13日在20:51

#2 楼

在路径跟踪器中,将光线跟踪到形状不是点的光时(通常是“区域光”),通常会在光的表面上选择一个随机点。采集足够的样本后,会导致柔和的镜面反射高光和阴影半影变得更柔和:光将从入射方向的随机分布中反射出表面,并且光线向有障碍物的区域光投射可能会或可能不会根据对光线的采样点,将障碍物与障碍物相交。

实时使用区域光的近似值。该虚幻引擎4白皮书描述了一些注意事项。一种可能性是“代表点”方法,该方法按像素选择光源体积中的一个点(最亮或最接近),并将其当作点光源使用。另一个选择是基于近似于区域光的圆锥体修改馈入镜面计算的粗糙度(在本文中称为“ Specular D Modification”)。