我有一个子弹的场景,雪碧节点看起来像一束短的激光束。但是当玩家射击时,子弹看起来很无聊,所以我决定给它添加一个着色器材料。我希望它看起来像一个静止的波,所以当它移动时,它看起来是渐进式的。我看了看这个问题:"How to make a wave warp effect in shader?“,但这不是我想要的,因为振荡不是垂直的。
发布于 2020-07-30 23:16:11
以下解决方案有其局限性。只有当子弹头精灵画布为振荡留出足够的空间(即子弹头不会占用整个画布)时,它才会起作用。
shader_type canvas_item;
uniform float amplitude;
uniform float inv_wavelength; // wavelength^(-1), where the wavelength is the width of the sprite
uniform float frequency;
const float TWO_PI = 6.2832;
vec2 sine_wave( vec2 p, float time ) {
float y = sin(p.x * inv_wavelength * TWO_PI) * amplitude * sin(frequency * TWO_PI * time);
return vec2(p.x, p.y + y);
}
void fragment() {
COLOR = texture(TEXTURE, sine_wave(UV, TIME));
}我让amplitude等于0.2,因为大于0.5的值不能完全显示振荡。inv_wavelength等于4.0意味着波长将是精灵宽度的1/4。我对它的数学运算没有信心。但我的理解是,第一个sin()负责原始y位移,这取决于与sprite p.x (UV.x)左边缘的水平距离。第二个sin()函数会随着时间的推移对其进行置换。frequency越高,振荡速度越快。在自定义函数中使用TIME返回错误,因此我将其作为参数传递。
另外,我观察到,如果将全局时间的倍数添加到第一个sin()中,该波可以变得渐进,乘数越大,波的移动速度就越快。
float y = sin(p.x * inv_wavelength * TWO_PI + 5.0 * time) * amplitude * sin(frequency * TWO_PI * time);https://stackoverflow.com/questions/63176244
复制相似问题