我正在为Monogame / XNA制作一个GUI库,我决定不使用纹理作为按钮,而是使用结构来保存渐变中渐变和颜色的信息。然后我可以将宽度和高度传递到结构中,它将根据存储在其中的两种颜色计算渐变,并传回具有正确尺寸和应用渐变的纹理。
我想知道的是计算双色渐变(透明度)的最有效方法。我已经看到了很多答案,包括着色器,HSL转换以及将颜色应用于白色>黑色渐变。它们都不是非常详细或提供代码示例。我认为最有效的方法是使用着色器绘制渲染目标,但我几乎没有着色器的经验。由于它是一个库(.dll),我甚至不知道如何加载像着色器这样的内容并用它们绘制。
这是我想要的效果: Image
另外,我试图让它更加可定制,以便为渐变提供不同的方向,即
public enum GradientStyle
{
NONE = 0,
RADIAL,
HORIZONTAL,
VERTICAL,
BLEND
};
这绝不是必需的。我现在只想知道如何制作一个简单的渐变。
答案 0 :(得分: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着色器的基础知识,就可以创建像素着色器来实现绘制常见渐变类型的算法,然后在SpriteBatch.Begin()
中应用不同的着色器,具体取决于GUI组件的设置正在被吸引。
注意:以上内容适用于Microsoft XNA 4.0。我相信MonoGame有一种将HLSL着色器转换为GLSL着色器以便在OpenGL平台上使用的方法,但我没有使用它的经验。我建议首先学习MS XNA的基础知识,因为这就是你在网上找到的大部分教程都会假设你正在使用它。