首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Godot中的固定和逐行波着色器,使子弹看起来像电磁波

Godot中的固定和逐行波着色器,使子弹看起来像电磁波
EN

Stack Overflow用户
提问于 2020-07-30 23:16:11
回答 1查看 140关注 0票数 0

我有一个子弹的场景,雪碧节点看起来像一束短的激光束。但是当玩家射击时,子弹看起来很无聊,所以我决定给它添加一个着色器材料。我希望它看起来像一个静止的波,所以当它移动时,它看起来是渐进式的。我看了看这个问题:"How to make a wave warp effect in shader?“,但这不是我想要的,因为振荡不是垂直的。

EN

回答 1

Stack Overflow用户

发布于 2020-07-30 23:16:11

以下解决方案有其局限性。只有当子弹头精灵画布为振荡留出足够的空间(即子弹头不会占用整个画布)时,它才会起作用。

代码语言:javascript
复制
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()中,该波可以变得渐进,乘数越大,波的移动速度就越快。

代码语言:javascript
复制
float y = sin(p.x * inv_wavelength * TWO_PI + 5.0 * time) * amplitude * sin(frequency * TWO_PI * time);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63176244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档