0

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

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

这就是我想要的效果: 图片

另外,我正在尝试使其更具可定制性,以允许渐变的不同方向,即

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

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

4

1 回答 1

2

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

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

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

如果您想了解如何在 XNA 中编写 HLSL 着色器,您可以查看来自 GameDev Stack Exchange的这个问题。Shawn Hargreaves 也有一篇关于编写着色器基础知识的短文,专门用于SpriteBatch. 着色器文件只是 XNA 内容文件,包含在您的内容项目中;您使用 加载它们Content.Load<T>(),就像任何其他内容文件一样。

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

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

于 2013-05-15T19:17:50.993 回答