如何在XNA中将精灵着色为白色?
我认为仅使用SpriteBatch中的颜色设置是不可能的,因此我正在尝试制定一个简单的着色器,该着色器将每个像素设置为白色,同时尊重像素的alpha值。
乔尔·马丁内斯(Joel Martinez)给出的答案看起来很正确,但是当我用SpriteBatch绘制精灵时,该如何合并呢?
解决方案
回答
我还没有编写自己的像素着色器,大部分都是从网上修改的样本,我们要做的就是只要像素中的R,G,B分量分别小于255,就可以增加它们的值,逐渐将精灵的颜色移向白色。嘿,押韵。
回答
我认为这就是我们要寻找的
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值返回全白色。
回答
我附上了MS的文档页面,如果按照所有步骤进行操作,则应立即启动并运行它。
http://msdn.microsoft.com/zh-cn/library/bb203872(MSDN.9).aspx
总结起来,我们需要创建并影响文件(结合上面的代码对于目的确实是正确的),将其添加到项目中,然后在源文件中加载它并在渲染期间使用它,如下所述。链接。
顺便说一句:我不太记得SpriteBatch(因为我选择编写自己的SpriteBatch,所以限制太多),但是正如我记得的那样,我们可能需要在发送到渲染的材质中设置效果。
无论如何,也许我们会在这里找到它:
http://creators.xna.com/en-us/utilities/spritebatchshader
还有一个高级代码,如果我们想到达那里:
http://creators.xna.com/en-us/sample/particle3d
玩得开心
回答
如果要在SpriteBatch中使用自定义着色器,请查看以下示例:
http://creators.xna.com/en-us/sample/spriteeffects
回答
乔尔·马丁内斯(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不会在单个绘制调用中进行批处理,但是我认为我们不会注意到其中的区别。