【问题标题】:How to draw a moving ball that leaves a trail after it with glsl?如何用glsl绘制一个在它后面留下痕迹的移动球?
【发布时间】:2015-03-24 07:48:13
【问题描述】:

由于opengles中没有累积缓冲区,我要做什么来实现追踪?如果我用frame buffer来模拟,是不是为了让尾巴看起来顺滑,成本会不会太高?

【问题讨论】:

    标签: opengl-es libgdx glsl fragment-shader


    【解决方案1】:

    通常没有足够的数据来从单个状态创建跟踪。如果球改变运动方向,即使包括速度也会使它看起来很差。因此,之前的对象状态的某种信息是非常必要的。

    可以使用单独的通道来保存之前的状态,例如模板缓冲区,甚至可以创建衰减系统的 Alpha 通道。这意味着您将在每一帧的此通道上绘制球,但在绘制它之前,您会将整个通道减少一些值,以便“较旧”的部分慢慢淡出。这种单独的球绘制需要类似于径向渐变,这样您将获得相对平滑的轨迹,但远非完美,并且对于相对快速的移动,一些额外的后期处理将是强制性的,除非结果是偶然的预期效果。

    更合适的方法是在 CPU 上包含对象位置跟踪。只需继续在堆栈上推送当前位置并删除那些太旧的位置(例如保留 20 个最新位置)。然后使用这些位置创建一个代表球尾的形状。在这一点上,机会是无限的。例如,您可以将尾巴设计为图像,然后从位置创建一个类似矩形的形状,如果操作得当,会产生很棒的尾巴效果。

    【讨论】:

    • 感谢您的回复!我刚刚测试了一个类似于你的建议的方法。我保持以前的状态并用 glsl 在帧缓冲区中绘制它。然后将其模糊到屏幕上。但是出现了一个问题。球跑得太快,连尾巴都连不上怎么办。另外不适合限制速度。
    • 尾巴怎么连不上?是您的应用程序控制“尾部形状”的顶点。
    • 在第一种方法中,它们没有连接,因为您在每一帧上都创建了位置快照。对于第二种方法,它们应该是。
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多