优化像素交换着色器

Optimizing pixel-swapping shader

我正在使用在纹理上交换 colors/palettes 的着色器。着色器检查像素的透明度,如果不透明则设置像素。有没有一种有效的方法可以忽略潜在分支以外的 0 alpha 像素?在这种情况下,我设置 pixel = newPixel:

uniform bool alternate;
uniform sampler2D texture;

void main()
{
    vec4 pixel = texture2D(bitmap, openfl_TextureCoordv);

    if(alternate)
    {
        vec4 newPixel = texture2D(texture, vec2(pixel.r, pixel.b));

        if(newPixel.a != 0.0)
            pixel = newPixel;
    }

    gl_FragColor = pixel;

}

我会研究 step 函数。您可以将 if 语句表示为两个条件的乘积。

例如:

if (a >= 0) {
  b = c;
}

相当于

b = (step(a, 0)*c) + (1.0 - step(a, 0)*b);

您可以使用 mix and step:

void main()
{
    vec4 pixel = texture2D(bitmap, openfl_TextureCoordv);
    vec4 newPixel = texture2D(texture, vec2(pixel.r, pixel.b));
    gl_FragColor = mix(pixel, newPixel, 
                       float(alternate) * (1.0 - step(newPixel.a, 0.0)));
}

您可能希望根据 Alpha 通道进行平滑过渡。在这种情况下,您只需要 mix:

gl_FragColor = mix(pixel, newPixel, float(alternate) * newPixel.a);