我想到创建光源和一些彩色窗口。现在,窗户是半透明的。我怎样才能做到,当光线(例如纯白色)射到玻璃上并继续穿过玻璃时,却将颜色更改为与通过的玻璃相同的颜色?
我知道这里描述的效果可以通过在窗口“彩色”侧使用区域灯来伪造,但是如果我只想拥有一个白点灯怎么办?
我想到创建光源和一些彩色窗口。现在,窗户是半透明的。我怎样才能做到,当光线(例如纯白色)射到玻璃上并继续穿过玻璃时,却将颜色更改为与通过的玻璃相同的颜色?
我知道这里描述的效果可以通过在窗口“彩色”侧使用区域灯来伪造,但是如果我只想拥有一个白点灯怎么办?
Answers:
有很多方法可以做到这一点。这些将需要使用着色器,并且我假设您已经在按像素进行照明。以下是一些建议,但是,找到适合您的技术可能需要更多的研究。
您可以指定定义内部区域的边界框。如果光源在盒子外面,但是几何体(不在阴影中)在盒子内部,则光线一定已经通过了一个窗口的影响(如果几何体在盒子外面并且光源也是如此)在里面)。唯一的问题是如何将盒子信息传递给着色器以及如何在灯光上说明效果。
另一种选择是将窗口指定为位于平面上的对象。首先进行测试,以查看几何形状和灯光是否在平面的相对侧,然后检查它们之间的距离是否与平面在窗口边界内的某个点相交。这将比第一种方法更为准确,并且使用不同颜色的玻璃将窗户插入相同的内部会更容易。
继续用窗口的几何表示更详细,您将获得更准确的结果,但计算量也将增加。
这些技术对于走廊射手来说相当有效,但对于动态或开放的世界来说效果不佳,因为可能需要进行大量调整才能使它看起来正确而没有太多的假象。而且,这些技术可能很快会变得有些激烈,因此建议您使用延迟的着色管道。
另一种选择是执行类似于阴影映射的操作。
在阴影贴图中,您可以生成受灯光影响的世界的一些位图图像。每个像素虽然仍然是一种颜色,但实际上是最接近的非透明几何图形的距离(您将4个字节用于1个float而不是4种颜色)。如果您计算从光源到某个几何图形的距离,并且该距离比阴影贴图中的相应值还要远,则您的几何图形处于阴影中(通常使用几何图形和光源之间的光线对地图进行索引)。
如果您将这个想法应用到问题中,那么您要做的就是存储到最近的透明几何图形的光线的距离图,然后在通过该几何图形后再制作第二个光线的颜色图(如果光源是白色,则仅是几何的颜色)。
如果您的几何图形距离此地图中的距离较远,请使用地图颜色,如果不是,则使用原始的浅色。
用于计算地图中每个像素颜色的函数应大致为;lightColor-reverseWindowColor。因此,对于纯白光和纯红色窗口(不吸收任何红色光谱),我们得到了:(255,255,255)-(0,255,255)=(255,0,0)。因此,另一侧的光色是纯红色。对于更复杂的透明对象(例如彩色玻璃窗),您可能需要进行纹理查找以获取材料颜色。
如果您正在寻找类似的东西,请查看Reflective Shadow Maps。
此技术提供了很高的保真度,如果您希望使用复杂的透明几何体(如彩色玻璃窗),可能是最好的。
近来,以体素表示编码照明信息已变得很流行(它们不仅用于几何图形)。最新的crytek引擎将这种策略用于高级照明(光传播量)。
这是一般的想法:
建立体素信息的方法有很多,但是上面的列表给出了一个总体思路。例如; 您可以先生成阴影贴图/体积,然后将该信息投影到体素贴图中,以便快速制作直接照明的贴图。然后,从体素沿着受影响区域的边缘开始传播。请记住,在这种情况下,生成阴影贴图/体积时,您将要忽略几何图形是否透明。
在延迟渲染器的最后一步中,计算几何点的照度时,您只需使用几何位置为体素贴图建立索引,以找出入射光在空间中的那个点是什么样。然后,您可以构建入射照明cpu侧的屏幕地图,或者可以使用cuda进行此操作。