【问题标题】:Make a sprite white in XNA 4.0 w/ simple shader (alpha issues)在 XNA 4.0 中使用简单的着色器制作一个白色的精灵(alpha 问题)
【发布时间】:2012-03-07 09:32:10
【问题描述】:

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

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

我在自己的一个简单项目中进行了尝试,得到了相同的结果。如何确保只有纹理的可见部分被着色?

修改后的调用如下所示:

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

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

        spriteBatch.End();

【问题讨论】:

    标签: c# xna sprite shader xna-4.0


    【解决方案1】:

    首先,仔细检查以确保您的图像中有 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);
       }
    }
    

    【讨论】:

    • 谢谢,效果很好。我需要研究预乘 alpha 与非预乘(注意到 XNA 4.0 中有关此问题的其他问题)。如何更改着色器代码以假设使用预乘 alpha?
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多