【问题标题】:How to move a pixel in glsl?如何在 glsl 中移动一个像素?
【发布时间】:2014-08-01 00:43:27
【问题描述】:

好的,假设我有一个乒乓着色器设置。图像中的一个像素的颜色不是 0。颜色的红色和蓝色分量定义了像素应该移动的位置。 (v*r*2-0.5 = dx ... v 是一个常数)

现在我将如何将这个像素移动到颜色值中编码的给定数量?我无法绘制到另一个片段,然后是正在处理的片段,我似乎无法“转发”信息。有什么解决办法吗?

【问题讨论】:

    标签: glsl translation pixel


    【解决方案1】:

    请注意,我的答案包含一个在您的 GPU 上可能非常困难的链接。这是一款在单个着色器中运行的突围式游戏。

    http://glsl.heroku.com/e#456.15

    您询问了有关“向前”传输信息的问题,在此示例中,它是通过将前一个动画帧的纹理贴图提供给着色器来完成的。当前帧需要知道球和砖块在前一帧中的位置。

    移动的球确实将其当前方向编码为一种颜色,如下所示:

    vec3 Ball(bool x, bool y)
    {
        // Draw ball with indicated direction
        return vec3(1.0, x ? 0.9 : 1.0, y ? 0.9 : 1.0);
    }
    

    但是,我们不能期望用户看到一个单像素球。因此,一个“假球”在真正的单像素球之后被创建为一个更大的白点。

    纹理采样用于检查前一个动画帧中当前像素周围的 5x5 区域,以查看当前像素现在是否处于真实球行进方向的“尾随”中。

    // Draw fake ball and bonus pixels around actuals from last frame
    for (float x = -2.0; x <= 2.0; x += 1.0)
    {
        for (float y = -2.0; y <= 2.0; y += 1.0)
        {
            if (IsBonus(texture2D(backbuffer, position + vec2(x, y) * pixel).rgb))
            {
                me.rgb = fakebonus;
            }
            if ((abs(x) < 2.0) || (abs(y) < 2.0))
            {
                if (IsAnyBall(texture2D(backbuffer,
                    position + vec2(x, y) * pixel).rgb))
                {
                    me.rgb = fakeball;
                }
            }
        }
    }
    

    此示例中的其他代码检查球是否与桨或砖接触,并采取适当的步骤。

    在您最初的问题中,您还提到您希望颜色来控制球的速度,不幸的是,这要困难得多。控制速度意味着您必须对大量的周围像素进行采样,以查看它们中的任何一个是否具有正确的速度以降落在正在渲染的像素上。我怀疑您需要主机应用程序的帮助来处理速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多