如何在WebGL中实现类似隧道的动画?
How to implement this tunnel like animation in WebGL?
Source: http://dvdp.tumblr.com/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
How to implement this tunnel like animation in WebGL?
Source: http://dvdp.tumblr.com/
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
嗯,这很有趣。 :)
此处提供了 WebGL 演示: http://boblycat.org/~knute/webgl/ tunnel/
(编辑:不再可用,但我创建了一个 ShaderToy 版本:https://www.shadertoy.com/view/XdKfRD)
主要算法在片段着色器中。基本思想是 for 循环从大到小迭代黑色环/圆圈,同时偏移中心以产生类似隧道的效果。
给定任何像素,我们可以检查该像素是否足够接近环以成为黑色像素的候选者。如果它在环之外,请打破环以避免通过较大的环看到较小的环。
当环靠近时,与前一个(外)圆的距离用于将图案“挤压”在一起,这有助于创建 3D 表面的错觉。
每个环的波浪图案当然是正弦曲线。像素的角度(与圆中心相比)与统一的时间参数相结合,为每个环的波浪图案设置动画。
最后,对不同的参数和转换函数(如 pow())进行了大量实验,以获得接近目标动画的结果。它并不完美,但非常接近。
片段着色器代码:
Well, this was fun. :)
A WebGL demo is available here: http://boblycat.org/~knute/webgl/tunnel/
(EDIT: no longer available, but I created a ShaderToy version: https://www.shadertoy.com/view/XdKfRD)
The main algorithm is in the fragment shader. The basic idea is a for loop iterating over the black rings/circles, from large to small, also offsetting the center to produce a tunnel-like effect.
Given any pixel, we can check if the pixel is close enough to the ring to be a candidate for a black pixel or not. If it is outside the ring, break the loop to avoid seeing smaller rings through the larger ones.
The distance from the previous (outer) circle is used to "squeeze" the pattern together when rings are close, this helps create the illusion of a 3D surface.
The wavy pattern of each ring is of course a sine curve. The angle of the pixel (compared to the circle center) is combined with a uniform time parameter to animate the wavy pattern for each ring.
And finally, there was lots of experimentation with different parameters and transformation functions like pow() to get the result close to the target animation. It's not perfect, but pretty close.
The fragment shader code: