如何获得中途变色的光?


11

我想到创建光源和一些彩色窗口。现在,窗户是半透明的。我怎样才能做到,当光线(例如纯白色)射到玻璃上并继续穿过玻璃时,却将颜色更改为与通过的玻璃相同的颜色?

我知道这里描述的效果可以通过在窗口“彩色”侧使用区域灯来伪造,但是如果我只想拥有一个白点灯怎么办?


除了改变灯的颜色,您还可以改变玻璃另一侧的照明对象的底色吗?也许那可以解决问题?
HumanCatfood

透明窗口作为第二遍渲染,其着色器仅修改每个像素输出的颜色平衡。这行不通吗?
Patrick Hughes

在我看来,这类似于阴影问题。如果您有一个很好的算法来处理由半透明对象投射的阴影(我不知道这是否可行),那么您只需要针对三个并行颜色通道运行它即可。
凯文·里德

Answers:


14

有很多方法可以做到这一点。这些将需要使用着色器,并且我假设您已经在按像素进行照明。以下是一些建议,但是,找到适合您的技术可能需要更多的研究。

快速与肮脏

您可以指定定义内部区域的边界框。如果光源在盒子外面,但是几何体(不在阴影中)在盒子内部,则光线一定已经通过了一个窗口的影响(如果几何体在盒子外面并且光源也是如此)在里面)。唯一的问题是如何将盒子信息传递给着色器以及如何在灯光上说明效果。

另一种选择是将窗口指定为位于平面上的对象。首先进行测试,以查看几何形状和灯光是否在平面的相对侧,然后检查它们之间的距离是否与平面在窗口边界内的某个点相交。这将比第一种方法更为准确,并且使用不同颜色的玻璃将窗户插入相同的内部会更容易。

继续用窗口的几何表示更详细,您将获得更准确的结果,但计算量也将增加。

这些技术对于走廊射手来说相当有效,但对于动态或开放的世界来说效果不佳,因为可能需要进行大量调整才能使它看起来正确而没有太多的假象。而且,这些技术可能很快会变得有些激烈,因此建议您使用延迟的着色管道。

阴影贴图

另一种选择是执行类似于阴影映射的操作。

在阴影贴图中,您可以生成受灯光影响的世界的一些位图图像。每个像素虽然仍然是一种颜色,但实际上是最接近的非透明几何图形的距离(您将4个字节用于1个float而不是4种颜色)。如果您计算从光源到某个几何图形的距离,并且该距离比阴影贴图中的相应值还要远,则您的几何图形处于阴影中(通常使用几何图形和光源之间的光线对地图进行索引)。

如果您将这个想法应用到问题中,那么您要做的就是存储到最近的透明几何图形的光线的距离图,然后在通过该几何图形后再制作第二个光线的颜色图(如果光源是白色,则仅是几何的颜色)。

如果您的几何图形距离此地图中的距离较远,请使用地图颜色,如果不是,则使用原始的浅色。

用于计算地图中每个像素颜色的函数应大致为;lightColor-reverseWindowColor。因此,对于纯白光和纯红色窗口(不吸收任何红色光谱),我们得到了:(255,255,255)-(0,255,255)=(255,0,0)。因此,另一侧的光色是纯红色。对于更复杂的透明对象(例如彩色玻璃窗),您可能需要进行纹理查找以获取材料颜色。

如果您正在寻找类似的东西,请查看Reflective Shadow Maps

此技术提供了很高的保真度,如果您希望使用复杂的透明几何体(如彩色玻璃窗),可能是最好的。

尝试通用解决方案

近来,以体素表示编码照明信息已变得很流行(它们不仅用于几何图形)。最新的crytek引擎将这种策略用于高级照明(光传播量)。

这是一般的想法:

  • 创建一个均匀分布的立方体贴图,其中包含您的场景(请考虑使用z阶曲线)。
  • 找到一种存储每个体素的入射照明信息的方法(在这里,球形谐波表示很有用)。
  • 查找包含光的体素,并在体素中表示该光。
    • 通过相邻的体素(类似于我的世界水)向外传播光线
    • 计算每个体素中的几何形状如何影响通过它的光(吸收,反射,透射)
    • 重复直到光线消失

建立体素信息的方法有很多,但是上面的列表给出了一个总体思路。例如; 您可以先生成阴影贴图/体积,然后将该信息投影到体素贴图中,以便快速制作直接照明的贴图。然后,从体素沿着受影响区域的边缘开始传播。请记住,在这种情况下,生成阴影贴图/体积时,您将要忽略几何图形是否透明。

在延迟渲染器的最后一步中,计算几何点的照度时,您只需使用几何位置为体素贴图建立索引,以找出入射光在空间中的那个点是什么样。然后,您可以构建入射照明cpu侧的屏幕地图,或者可以使用cuda进行此操作。


感谢您冗长的帖子!我目前正在调查是针对当前正在研究的项目执行正向渲染还是延迟渲染。目前,它可能会推迟。窗户是彩色的(例如教堂的彩色玻璃),您将如何处理?
manabreak

@manabreak-我将使用阴影贴图扩展名,因为它将为这种情况提供最佳保真度。我将编辑帖子以对此进行解释。
OriginalDaemon

e,谢谢!这篇文章真的让我很开心,我可能从未见过任何一篇文章投入如此多的精力。
manabreak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.