Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA中的色矩阵等价_C#_Xna - Fatal编程技术网

C# XNA中的色矩阵等价

C# XNA中的色矩阵等价,c#,xna,C#,Xna,在XNA中,如何实现应用System.Drawing.Imaging.ColorMatrix的相同效果?下面的文章显示了我希望如何渲染我的精灵,但它使用GDI+: 在XNA中如何做到这一点?是否有一个通用着色器可以使用?欢迎提供任何帮助。您可以使用自定义像素着色器非常轻松地执行此类颜色操作。例如,以如下所示的像素着色器为例: sampler2D sampler; float4 PixShader( float2 tex : TEXCOORD0 ) : COLOR0 { float4

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


在XNA中如何做到这一点?是否有一个通用着色器可以使用?欢迎提供任何帮助。

您可以使用自定义像素着色器非常轻松地执行此类颜色操作。例如,以如下所示的像素着色器为例:

sampler2D sampler;

float4 PixShader( float2 tex : TEXCOORD0 ) : COLOR0
{
    float4 color;
    color = tex2D( sampler, tex);

    //do anything you want to the colors
    color.r = color.r * 2; // intensify the red component
    color.g = color.g * 0.5; // cut all green values in half
    // etc.

    return color;
}
在XNA 4.0中,将自定义着色器与SpriteBatch类一起使用非常简单:

肖恩·哈格里夫斯(Shawn Hargreaves)

这里有一个与Silverlight和WPF一起使用的解决方案:

sampler2D input : register(s0);

/// <defaultValue>1.0</defaultValue>
float RMul : register(C0);
/// <defaultValue>1.0</defaultValue>
float GMul : register(C1);
/// <defaultValue>1.0</defaultValue>
float BMul : register(C2);
/// <defaultValue>1.0</defaultValue>
float AMul : register(C3);

/// <defaultValue>0</defaultValue>
float RAdd : register(C4);
/// <defaultValue>0</defaultValue>
float GAdd : register(C5);
/// <defaultValue>0</defaultValue>
float BAdd : register(C6);
/// <defaultValue>0</defaultValue>
float AAdd : register(C7);

float4 main(float2 uv : TEXCOORD) : COLOR 
{
   float4 color = tex2D(input, uv);
   color = color.rgba * float4(RMul, GMul, BMul, AMul) + float4(RAdd, GAdd, BAdd, AAdd);
   return color;
}
2d输入:寄存器(s0);
/// 1.0
浮动RMul:寄存器(C0);
/// 1.0
浮点GMul:寄存器(C1);
/// 1.0
浮点BMul:寄存器(C2);
/// 1.0
浮动阿穆尔:寄存器(C3);
/// 0
浮点RAdd:寄存器(C4);
/// 0
浮动GAdd:寄存器(C5);
/// 0
浮动添加:寄存器(C6);
/// 0
浮动AAdd:寄存器(C7);
浮动4主(浮动2 uv:TEXCOORD):颜色
{
float4 color=tex2D(输入,uv);
color=color.rgba*float4(RMul、GMul、BMul、AMul)+float4(RAdd、GAdd、BAdd、AAdd);
返回颜色;
}
我将向第一个在XNA上对其进行调整的人给出答案。

好的,根据您的代码(),它与ColorMatrix不完全相同(但这会让您很好地了解如何根据需要添加完整的矩阵功能),下面是一个在XNA上工作的版本:

首先,下载。这将节省我进行设置的时间。我只是想替换去饱和效应

这是一个像素着色器,几乎与您自己的相同。将“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
函数替换为:

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(); } }
(正如乔尔·马丁内斯在书中提到的。)

现在这段代码中有一个major但书-您不能使用不同的colorMultiply和colorAdd值批处理精灵!(实际上,colorMultiply有点多余,因为您可以将精灵颜色用作colorMultiply,每个精灵可以更改该颜色。)

因此,如果每个精灵都有不同的加法/乘法值,那么您必须为每个精灵执行整个SpriteBatch.Begin,Effect.Begin,draw stuff,SpriteBatch.End,Effect.End操作

原因是,像素着色器及其参数每批只能设置一次

如果你有很多雪碧,每批做一个雪碧会很慢

解决这个问题的方法(如果您需要这种性能)是制作一个自定义的sprite批处理程序,带有一个自定义的顶点着色器,可以将多种颜色传递给像素着色器。这是可能的,尽管并非微不足道。一个很好的起点是