gif 中的球体、穹顶和墙壁。每个壳是球体网格或平面网格上的一个着色器,没有纹理。 我保留最后 8 个击中记录在一个 vec4 数组中(xyz 是局部击中点,w 是击中时间),每帧上传并在片段着色器中循环。 p 是局部位置: float age = hits[i].w; float d = distance(p, hits[i].xyz); float k = (d - age * ripple_speed) / max(ripple_width, 0.01); ripple += exp(-k * k) * exp(-age * 1.6) * hit_strength[i]; 每个环都是在半径 age * speed 处的高斯突起,随着时间的推移逐渐消失。它对六边形边缘的权重很大,所以它主要照亮线条。第 9 个击中记录会替换最旧的击中记录,击中记录会在 2.5 秒后消失,而这很便宜,因为它只需要每个像素 8 次循环。 在平坦的墙壁上,距离是精确的。在球体上,距离是通过壳的弦长,因此环会在绕球体时稍微加速。如果你在着色器中实现了球体上的真正表面距离,我很想知道你是如何做到的。
8次击中,一个vec4每次:我的Hex盾牌上波纹是如何在Godot 4着色器中工作的
评论 (0)