如何在glsl中移动像素?

时间:2014-08-01 00:43:28

标签: glsl translation pixel

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

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

1 个答案:

答案 0 :(得分:0)

请注意,我的答案包含一个可能在您的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;
            }
        }
    }
}

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

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