C# 在XNA 4.0中使用简单着色器使精灵变白(alpha问题)

C# 在XNA 4.0中使用简单着色器使精灵变白(alpha问题),c#,xna,sprite,shader,xna-4.0,C#,Xna,Sprite,Shader,Xna 4.0,使用处的简单着色器和处的样例代码,我已将着色器的.fx文件加载到样例项目中,并在一个Draw()调用中替换了一个样例效果,以使用白化效果 我得到的是一个与纹理本身尺寸相同的白色正方形。很明显,我只想让alpha不是0的纹理区域变成白色。着色器似乎正在工作,因为我将默认白色更改为其他测试用例,并且方形确实会更改颜色 我在自己的一个简单项目中尝试了这个方法,并得到了相同的结果。如何确保仅对纹理的可见部分进行着色 修改后的调用如下所示: spriteBatch.Begin(0, nul

使用处的简单着色器和处的样例代码,我已将着色器的.fx文件加载到样例项目中,并在一个Draw()调用中替换了一个样例效果,以使用白化效果

我得到的是一个与纹理本身尺寸相同的白色正方形。很明显,我只想让alpha不是0的纹理区域变成白色。着色器似乎正在工作,因为我将默认白色更改为其他测试用例,并且方形确实会更改颜色

我在自己的一个简单项目中尝试了这个方法,并得到了相同的结果。如何确保仅对纹理的可见部分进行着色

修改后的调用如下所示:

        spriteBatch.Begin(0, null, null, null, null, whiteEffect);

        spriteBatch.Draw(myTexture, CenterOnScreen(myTexture), Color.White);

        spriteBatch.End();

首先,仔细检查以确保图像中有alpha

该着色器假定您使用的是非预乘alpha:

batch.Begin(0, BlendState.NonPremultiplied, null, null, null, whiteEffect);
着色器使用纹理的alpha值作为白化的基础;换句话说,alpha越坚固,美白效果越坚固。如果您不想要任何“中间值”(例如部分白色),如果您的纹理中没有“中间值”alpha,它将起作用

非预乘部分白色Alpha(原始)版本 编辑:由于询问了预乘版本,我将添加该版本并给出解释

发件人:

要将非预乘颜色转换为预乘格式,请执行以下操作:

color.rgb*=color.a

让我们在着色器中执行相同的操作:

预乘部分白色Alpha版本 现在,您可以继续使用默认的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)的“布尔”样式返回;无论混合状态如何,这些特定颜色都将显示相同:

batch.Begin(0, BlendState.AlphaBlend, null, null, null, whiteEffect);
硬白色或透明(忽略部分白色),不可知论的预乘
首先,仔细检查以确保图像中有alpha

该着色器假定您使用的是非预乘alpha:

batch.Begin(0, BlendState.NonPremultiplied, null, null, null, whiteEffect);
着色器使用纹理的alpha值作为白化的基础;换句话说,alpha越坚固,美白效果越坚固。如果您不想要任何“中间值”(例如部分白色),如果您的纹理中没有“中间值”alpha,它将起作用

非预乘部分白色Alpha(原始)版本 编辑:由于询问了预乘版本,我将添加该版本并给出解释

发件人:

要将非预乘颜色转换为预乘格式,请执行以下操作:

color.rgb*=color.a

让我们在着色器中执行相同的操作:

预乘部分白色Alpha版本 现在,您可以继续使用默认的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)的“布尔”样式返回;无论混合状态如何,这些特定颜色都将显示相同:

batch.Begin(0, BlendState.AlphaBlend, null, null, null, whiteEffect);
硬白色或透明(忽略部分白色),不可知论的预乘
谢谢,这很有效。我需要研究预乘alpha和非预乘alpha(注意到XNA4.0中关于这个问题的其他问题)。如何将着色器代码更改为使用预乘alpha?谢谢,这很好地工作。我需要研究预乘alpha和非预乘alpha(注意到XNA4.0中关于这个问题的其他问题)。着色器代码将如何更改以假定使用预乘alpha?