代码之家  ›  专栏  ›  技术社区  ›  bernadd

WebGL雾明暗器光标交互

  •  0
  • bernadd  · 技术社区  · 7 年前

    首先,我想道歉,但我是学习glsl和shaders的新手。没有一个地方可以让你学习所有关于阴影语言的知识,所以我研究了很多,并检查了人们创造的例子/实验,试图尽可能多地学习和理解。

    我找到了一个 Fog shader (实验,可以找到Github源代码 here )在网上,看起来很酷,我想了解的是,例如,我如何在这个材质球中实现鼠标,所以当我将鼠标移动到屏幕上时,它会推动/移动/分散光标周围的雾,然后在一秒或两秒后,它会回来。我真的不需要有人来创建完整的代码。我只需要一些指导、解释等…

    我是否将这些东西实现到顶点着色或片段着色中,因为据我所知(如果我错了请纠正我)片段着色只决定每个“像素/片段”的颜色,而顶点着色似乎是定义位置等的地方?

    所以在基本上,我想知道如何实现像鼠标这样的交互(我知道如何将鼠标作为均匀X-Y发送给着色程序,并将其规范化(转换为0/1),这样该部分就完全没有问题了。

    1 回复  |  直到 7 年前
        1
  •  0
  •   gman    7 年前

    很难给出一般性的建议。对于99%的应用程序,鼠标交互发生在GLSL之外。用三个JS术语来说,鼠标输入只会操纵各种场景节点的位置和旋转,可能还有材质设置。这相当于所有3D应用程序中99%的原生或网络。为了好玩,人们有时会直接将一些鼠标输入到材质球中。那就由你决定了。对于雾,计算从鼠标位置到顶点明暗器中顶点的距离。它越靠近鼠标,将位置向后、向前或远离鼠标。或者在片段明暗器中使用距离来变暗。

    问题是你要求雾只有一两秒钟后才会回来。这是更多的工作,而且在大多数应用程序中,更可能在明暗器之外做一些事情。

    如果你真的想在明暗器中做这件事,你可能会使用一种纹理,把圆圈画成与鼠标位置相对应的形状。每一帧都会模糊纹理,使其慢慢变黑。顶点明暗器会查看纹理,每个顶点都会找到对应的位移。

    换句话说,您现在至少需要3个着色器。一个画一个圆。它不必是圆形明暗器,它可以只是一个普通明暗器,用于绘制恰好传递圆形数据的三角形。您需要淡入/模糊绘制历史的明暗器。你需要雾遮影器。

    可能还有20种方法可以实现这一点。

    相关问答

    Creating a smudge/liquify effect on mouse move that continuously animates back to the original state using webgl

    就我个人而言,我觉得那些在材质球中尽可能多的尝试更多的是用极限挑战自己,而不是务实。这对学习很有好处,但很少是“最佳实践”