gpt4 book ai didi

c# - 在带有简单着色器的 XNA 4.0 中使 Sprite 变白(alpha 问题)

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:36 27 4
gpt4 key购买 nike

Tint Sprite White 使用简单着色器示例代码位于 Sprite Effects Sample ,我已将着色器的 .fx 文件加载到示例项目中,并替换了其中一个 Draw() 调用中的示例效果之一以使用美白效果。

我得到的是一个白色的大方 block ,其尺寸与纹理本身相同。我显然只想将 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(原始)版本

   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 :

To convert a non premultiplied color into premultiplied format:

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);

我仍然不太确定你是否想要硬的“白色或透明”......在那种情况下,你是否进行预乘并不重要,因为你可以只做一个“ bool ”风格返回纯白色(1.0f、1.0f、1.0f、1.0f)或纯透明(0.0f、0.0f、0.0f、0.0f);无论混合状态如何,这些特定颜色都将显示相同:

Hard White-or-Transparent(忽略部分白色),Premultiplied-Agnostic

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);
}
}

关于c# - 在带有简单着色器的 XNA 4.0 中使 Sprite 变白(alpha 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9598832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com