我认为仅使用 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 值返回全白色。
If you want to use custom shaders with SpriteBatch, check out this sample:
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 的默认着色器换成您自己的。使用它会使 sprite 的绘制速度变慢一些,因为 sprite 不会在一次绘制调用中批量处理,但我认为您不会注意到其中的区别。
我附上了 MS 的文档页面,如果您按照所有步骤操作,您应该立即启动并运行它。
http://msdn.microsoft.com/en-us/library/bb203872(MSDN.9).aspx
总结一下 - 您需要创建和效果文件(结合上面的代码,这对于您的目的确实是正确的),将其添加到您的项目中,然后在源文件中加载它并在渲染期间按照说明使用它在链接中。
顺便说一句:我不太记得 SpriteBatch(因为我选择自己编写,所以限制太大),但我记得您可能需要在发送到渲染的材质中设置效果。无论如何 - 也许你会在这里找到它:
http://creators.xna.com/en-us/utilities/spritebatchshader
如果您想到达那里,还有一个高级代码:
http://creators.xna.com/en-us/sample/particle3d
玩得开心
我还没有编写自己的像素着色器,主要是从网上修改过的样本,你会做的是你会分别增加像素中 R、G、B 分量的值,只要它们低于 255,这将逐渐将精灵的颜色变为白色。嘿,押韵。