Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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#_Colors_Xna_Textures_Gradient - Fatal编程技术网

C# 在XNA中在两种颜色之间创建渐变

C# 在XNA中在两种颜色之间创建渐变,c#,colors,xna,textures,gradient,C#,Colors,Xna,Textures,Gradient,我正在为Monogame/XNA制作一个GUI库,我决定不使用按钮的纹理,而是使用结构来保存渐变中的渐变和颜色信息。然后我可以将一个宽度和一个高度传递到结构中,它将根据存储在其中的两种颜色计算一个渐变,并返回一个具有正确尺寸和应用渐变的纹理 我想知道的是计算双色渐变(带透明度)的最有效方法。我已经看到了很多答案,包括着色器、HSL转换,以及将颜色应用于白色->黑色渐变。它们都不是非常详细,也没有提供代码示例。我假设最有效的方法是使用着色器绘制渲染目标,但我几乎没有使用着色器的经验。由于它是一个库

我正在为Monogame/XNA制作一个GUI库,我决定不使用按钮的纹理,而是使用结构来保存渐变中的渐变和颜色信息。然后我可以将一个宽度和一个高度传递到结构中,它将根据存储在其中的两种颜色计算一个渐变,并返回一个具有正确尺寸和应用渐变的纹理

我想知道的是计算双色渐变(带透明度)的最有效方法。我已经看到了很多答案,包括着色器、HSL转换,以及将颜色应用于白色->黑色渐变。它们都不是非常详细,也没有提供代码示例。我假设最有效的方法是使用着色器绘制渲染目标,但我几乎没有使用着色器的经验。由于它是一个库(.dll),我甚至不知道如何加载着色器之类的内容并使用它们进行绘制

这就是我想要的效果:

此外,我正试图使它更可定制,以允许不同方向的梯度,即

public enum GradientStyle
{
    NONE = 0,
            RADIAL,
            HORIZONTAL,
            VERTICAL,
            BLEND
};

这绝对不是必需的。我现在只想知道如何制作一个简单的渐变。

简单的线性渐变很容易:绘制一个四边形,其中两个顶点设置为一种颜色,两个顶点设置为第二种颜色。gouraud着色将在两种颜色之间插值以创建渐变

除此之外的任何事情都会变得更加复杂。XNA和DirectX是为处理纹理和多边形而构建的API。绘制高度可定制的渐变更适合于直接像素操作

这就是为什么您会听到使用着色器的建议。像素着色器允许您直接设置绘制的每个像素的颜色,使其成为创建渐变的理想选择。您不一定需要渲染目标;在渲染GUI原语和实时绘制渐变之前,可以通过
SpriteBatch
设置自定义着色器,从而避免分配额外的视频内存

如果您想学习如何在XNA中编写HLSL着色器,可以从GameDev堆栈交换中了解一下。Shawn Hargreaves还掌握了编写着色器的基本知识,这些着色器专门用于
SpriteBatch
。着色器文件只是XNA内容文件,包含在内容项目中;您可以使用
Content.load()
加载它们,就像加载任何其他内容文件一样

掌握了HLSL着色器的基本知识后,可以创建像素着色器,这些着色器实现用于绘制常见类型渐变的算法,然后根据正在绘制的GUI组件的设置,在
SpriteBatch.Begin()
中应用不同的着色器


注:以上适用于Microsoft XNA 4.0。我相信MonoGame有一种方法可以将HLSL着色器转换为GLSL着色器,以便在OpenGL平台上使用,但我没有这方面的经验。我建议您先学习MS XNA的基础知识,因为您在网上找到的大多数教程都假设您正在使用。

我喜欢使用四边形并将每个顶点设置为不同的颜色,然后使用gouraud着色生成渐变。问题是,我该如何让这个四元组以2D的形式出现在屏幕上,就像我用spritebatch绘制一样?从我的记忆中可以看出,四边形被锁定在3D空间中,因此不会在相机移动时就停留在屏幕上的相同位置;它只是在引擎盖下绘制3D多边形。这意味着您可以编写自己的代码,完全执行
SpriteBatch
正在执行的操作。确切地说,怎么做超出了这个答案的范围,但基本上你需要使用正交投影绘制多边形——互联网上有大量关于如何绘制多边形的信息。尽管如此,我还是怀疑这是否真的值得;您的自定义选项将非常有限,您可以使用简单的纹理获得非常相似的效果。请原谅,因为我对3D图形非常陌生,但您必须解释或指出不同投影类型之间的差异。我尝试查找正交投影,它们看起来可以用于将3D基本体渲染到2D屏幕,但我仍然对如何实现这些功能感到困惑。基本上,您需要使用
矩阵
类上的,然后将其设置为用于绘制基本体的任何
效果
上的投影矩阵。了解如何使用
basicefect
在三维空间中绘制基本图元,然后尝试从那里开始,替换视图和投影矩阵。啊,我发现,这确实很有帮助。我现在有我需要做的了。谢谢你的帮助。