gpt4 book ai didi

c# - XNA 中的 ColorMatrix 等价物

转载 作者:行者123 更新时间:2023-11-30 21:21:38 26 4
gpt4 key购买 nike

在 XNA 中,如何实现与应用 System.Drawing.Imaging.ColorMatrix 相同的效果?下面的文章展示了我想如何渲染我的 Sprite ,但它使用了 GDI+:

http://www.c-sharpcorner.com/UploadFile/mahesh/Transformations0512192005050129AM/Transformations05.aspx

这在 XNA 中如何完成?有我可以使用的通用着色器吗?我们将不胜感激。

最佳答案

好的,根据你的代码 ( here ),它与 ​​ColorMatrix 不太一样(但这应该让你很好地了解如何添加你想要的完整矩阵功能),这是一个版本将在 XNA 上工作:

首先,下载 Sprite Effects sample .这将节省我进行设置的时间。我只是要替换 Desaturate 效果。

这是一个与您自己的几乎相同的像素着色器。将“desaturate.fx”的内容替换为:

sampler TextureSampler : register(s0);

float4 colorMultiply = float4(1, 1, 1, 1);
float4 colorAdd = float4(0, 0, 0, 0);

float4 PixelShader(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
// Look up the texture color.
float4 tex = tex2D(TextureSampler, texCoord);

// Perform scaling and addition and return
return color * tex * colorMultiply + colorAdd;
}

technique ColorMatrix { pass Pass1 { PixelShader = compile ps_2_0 PixelShader(); } }

现在将 DrawDesaturate 函数替换为:

(正如 Joel Martinez 在 XNA 4 this code becomes much neater 中提到的那样。)

void DrawDesaturate(GameTime gameTime)
{
Effect colorMulAddEffect = desaturateEffect; // reusing desaturateEffect to keep this short!
float pulsate = Pulsate(gameTime, 4, 0, 1);

spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None);

colorMulAddEffect.Parameters["colorMultiply"].SetValue(new Vector4(1.5f, 1f, pulsate, 1f));
colorMulAddEffect.Parameters["colorAdd"].SetValue(new Vector4(-0.5f, 1-pulsate, 0f, 0f));
colorMulAddEffect.Begin();
colorMulAddEffect.CurrentTechnique.Passes[0].Begin();

spriteBatch.Draw(glacierTexture, FullscreenRectangle(), Color.White);

spriteBatch.End();
colorMulAddEffect.CurrentTechnique.Passes[0].End();
colorMulAddEffect.End();
}

现在这段代码有一个主要附带条件 - 您不能批量处理具有不同 colorMultiply 和 colorAdd 值的 Sprite ! (实际上 colorMultiply 有点多余,因为您可以将 Sprite 颜色用作 colorMultiply,您可以更改每个 Sprite 。)

因此,如果每个 Sprite 都有不同的加法/乘法值,您将必须为每个 Sprite 执行整个 SpriteBatch.Begin、Effect.Begin、绘制东西、SpriteBatch.End、Effect.End。

原因是像素着色器及其参数每批处理只能设置一次 as explained in this blog post .

如果你有很多 Sprite ,每批处理一个 Sprite 会很慢!

这个问题的解决方案(如果您需要那种性能)是制作一个自定义 Sprite 批处理程序,其中包含一个可以将多种颜色传递给像素着色器的自定义顶点着色器。这是可能的,尽管并非微不足道。一个好的起点是 source code for the shaders used by SpriteBatch .

关于c# - XNA 中的 ColorMatrix 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615379/

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