优化像素交换着色器
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);
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);
我正在使用在纹理上交换 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);
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);