Благодаря bg2b я протестировал предварительное умножение альфа, и результат оказался ожидаемым. Я не знаю, есть ли предпочтительный способ сделать это, но в итоге я получил следующее:
vec4 color = texture2D(u_texture, v_tex_coord);
if(color.a == 1.)
{
color.rgb = vec3(1.,0.,0.);
}else if(color.a > .6)
{
color.rgb = vec3(0.,1.,0.);
}
else if(color.a == 0.)
{
color.rgb = vec3(0.,0.,1.);
}
color.a = .9;
gl_FragColor = vec4(color.rgb*color.a, color.a);
Следует отметить: когда я не умножал альфа-умножение, альфа все еще использовалась для смешивания различные объекты SpriteKit. Я добавил еще один SKSpriteNode под тот, которым я манипулирую, и эти 2 изображения смешались друг с другом, но цвета манипулируемого изображения были «полными».
Кроме того, в этом примере я не использовал SKDefaultShading();
, чтобы выбрать цвет пикселя. Когда я это делаю, в этом случае нет никакой разницы. Как бы то ни было, если мы изменим альфа-элемент SKSpriteNode непосредственно на объекте, ни один альфа-пиксель не сохранит там первоначальный цвет, а другой изменит цвет, используемый в шейдере ...