我认为仅使用SpriteBatch中的颜色设置不可能实现这一点,因此我正在尝试设计一个简单的着色器,可以将每个像素变为白色,同时保留像素的alpha值。
Joel Martinez提供的答案看起来是正确的,但我该如何在使用SpriteBatch绘制精灵时加入它呢?
sampler2D baseMap;
struct PS_INPUT
{
float2 Texcoord : TEXCOORD0;
};
float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 color = tex2D( baseMap, Input.Texcoord );
return float4(1.0f, 1.0f, 1.0f, color.w);
}
这很简单,它只是从纹理中采样颜色,然后使用纹理的 alpha 值返回全白色。
Joel Martinez说得没错,你可以这样使用它,使用SpriteBatch,并将效果加载到tintWhiteEffect中:
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
tintWhiteEffect.Begin();
tintWhiteEffect.CurrentTechnique.Passes[0].Begin();
// DRAW SPRITES HERE USING SPRITEBATCH
tintWhiteEffect.CurrentTechnique.Passes[0].End();
tintWhiteEffect.End();
spriteBatch.End();
这里的诀窍是SpriteSortMode.Immediate,它允许您交换SpriteBatch的默认着色器为自己的着色器。使用它会使精灵绘制变慢一些,因为精灵不会在单个绘制调用中批处理,但我认为您不会注意到这种差异。
我附上了微软的文档页面,如果你按照所有步骤操作,很快就可以让它运行起来。
http://msdn.microsoft.com/en-us/library/bb203872(MSDN.9).aspx
总的来说,您需要创建并效果文件(包含上面的代码,这确实对您的目的是正确的),将其添加到您的项目中,然后在源文件中加载它,并在渲染期间按照链接中所述使用它。http://creators.xna.com/en-us/utilities/spritebatchshader
如果你想达到更高级的代码水平:
http://creators.xna.com/en-us/sample/particle3d
玩得开心
如果你想要在SpriteBatch中使用自定义着色器,请查看这个示例:
我还没有编写过自己的像素着色器,大多数都是修改来自网络的示例。你要做的是分别增加像素中R、G、B组件的值,只要它们小于255,这将逐渐将精灵的颜色向白色转变。嘿,这押韵了。