【问题标题】:Making A Gradient Between 2 Colors in XNA在 XNA 中制作 2 种颜色之间的渐变
【发布时间】:2013-05-10 10:14:03
【问题描述】:

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

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

这是我想要的效果: Image

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

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

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

【问题讨论】:

    标签: c# colors xna textures gradient


    【解决方案1】:

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

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

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

    如果您想了解如何在 XNA 中编写 HLSL 着色器,您可以查看来自 GameDev Stack Exchange 的this question。 Shawn Hargreaves 还拥有a short article 专门为与SpriteBatch 一起使用的编写着色器的基础知识。着色器文件只是 XNA 内容文件,包含在您的内容项目中;您可以使用 Content.Load<T>() 加载它们,就像任何其他内容文件一样。

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

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

    【讨论】:

    • 我喜欢使用四边形并将每个顶点设置为不同颜色的想法,然后使用 gouraud 着色来制作渐变。问题是,我将如何让四边形以 2D 形式留在屏幕上,就像我用 spritebatch 绘制它一样?据我所知,四边形被锁定在 3D 空间中,因此一旦相机移动,它们就不会停留在屏幕上的相同位置。
    • 请记住,SpriteBatch 实际上并没有做任何特别的事情;它只是在引擎盖下绘制 3D 多边形。这意味着您可以编写自己的代码来完成SpriteBatch 正在做的事情。究竟如何做到这一点超出了这个答案的范围,但基本上你需要使用 正交投影 来绘制多边形——互联网上有很多关于如何做到这一点的信息。不过,我质疑这是否真的值得。您的自定义选项将非常有限,您可以使用简单的纹理获得非常相似的效果。
    • 请原谅我,因为我对 3D 图形非常陌生,但您必须解释或指出不同投影类型之间的差异。我尝试查找正交投影,它们看起来可以用于将 3D 图元渲染到 2D 屏幕,但我仍然对如何实现这些功能感到困惑。
    • 基本上,您需要使用 Matrix 类上的 static methods 之一创建一个正交投影矩阵,然后将其设置为您正在使用的任何 Effect 上的投影矩阵画出你的图元。了解如何使用 BasicEffect 在 3D 空间中绘制基本图元,然后尝试通过替换视图和投影矩阵来从那里开始。
    • 啊,我找到了this tutorial,真的很有帮助。我现在有我需要做的。感谢您的帮助。
    猜你喜欢
    • 2019-12-07
    • 2014-02-18
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多