首先,仔细检查以确保您的图像中有 Alpha。
该着色器假定您使用的是非预乘 alpha:
batch.Begin(0, BlendState.NonPremultiplied, null, null, null, whiteEffect);
着色器使用纹理的 alpha 值作为白化的基础;换句话说,alpha越稳固,美白效果就越稳固。如果您不想要任何“中间”(例如部分白色),那么如果您的纹理中没有“中间”alpha,它将起作用。
非预乘部分白色 Alpha(原始)版本
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
return float4(1.0f, 1.0f, 1.0f, color.a);
}
编辑:由于询问了预乘版本,我将添加该版本并进行解释。
来自this helpful article:
将非预乘颜色转换为预乘格式:
color.rgb *= color.a
所以让我们在着色器中做同样的事情:
预乘部分白色 Alpha 版本
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
return float4(color.a, color.a, color.a, color.a);
}
现在您可以继续使用默认的 alpha 混合状态:
batch.Begin(0, BlendState.AlphaBlend, null, null, null, whiteEffect);
我仍然不确定你是否想要硬的“白色或透明”......在这种情况下,是否进行预乘并不重要,因为你可以只做一个“布尔”样式返回纯白色 (1.0f, 1.0f, 1.0f, 1.0f) 或纯透明 (0.0f, 0.0f, 0.0f, 0.0f);无论混合状态如何,这些特定颜色都将显示相同:
硬白色或透明(忽略部分白色),预乘不可知
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
if (color.a > 0.0f)
{
return float4(1.0f, 1.0f, 1.0f, 1.0f);
}
else
{
return float4(0.0f, 0.0f, 0.0f, 0.0f);
}
}