我有一个相当简单的普通地图照明实现,用于webgl(GLSL着色器)中的2D精灵,我能够适应和从一个例子中优化。它只使用一个方向灯,可以很好地满足我的需要。精灵呈现平面(2D),只有光线方向和法线是3D矢量。顶点旋转仅发生在z轴周围,所以它非常容易。
我希望添加一个凹凸(高度)贴图来投射阴影。在线提供3D凹凸地图阴影投射示例和论文,但它们比我需要的更复杂,数学能够超越我的脑海。我还没有找到一个例子或解释如何做一个简单的2D案例。
我的第一个倾向如下:对于片段着色器中的当前像素,沿着光的方向追溯并检查相邻凹凸贴图像素的高度。如果它高于该点处的光方向矢量,则该像素处于阴影中。但是,由于凹凸贴图上的“高”像素可能会将阴影投射到> 1个像素距离,我必须在那个方向上逐个像素地进行测试,直到我发现一个高到足以投射阴影(或到达纹理的边缘,或达到某个任意限制。)
这听起来不是很理想,特别是对于较大的纹理。我已经读过,如果着色器中的语句不是那么快。有更快/更好的方法吗?
答案 0 :(得分:1)
您正在寻找的是视差(遮挡)映射。
这种技术完全符合您的描述,可以理解为切线空间中的凹凸贴图光线跟踪。
以下是一些文章:
优化搜索的方法与普通光线追踪类似,包括:球体追踪,锥形追踪,二分搜索等,而不是常数步进功能。
P上。 S.如果你知道一些渲染技术的名称,谷歌通常会在名称前加上“nVidia”,“crytek”或“gpu”,它会向你显示更多相关结果。
希望这有帮助。