XNA SpriteFont具有多种颜色?

XNA SpriteFont具有多种颜色?,xna,drawstring,Xna,Drawstring,有没有一种方法可以绘制具有多个彩色水平区域的文本? 作为一个例子,我想画文本“Hello”,下半部分用红色,上半部分用绿色。要使用的文本必须是动态的。 对于普通纹理,我只需使用“绘制”方法并传递一个子矩形来绘制不同颜色的纹理部分,但对于文本?最好的方法可能涉及自定义着色器。但是,你也可以用剪刀形的矩形来做 通常以上色(绿色)绘制文本 设置只允许在文本的下半部分绘制的 使用底色(红色)正常绘制文本。上半部分应该剪掉,这样绿色的文字应该保留在那里 为了澄清这一点,您的文本应该两次都在同一位置绘制。最

有没有一种方法可以绘制具有多个彩色水平区域的文本? 作为一个例子,我想画文本“Hello”,下半部分用红色,上半部分用绿色。要使用的文本必须是动态的。
对于普通纹理,我只需使用“绘制”方法并传递一个子矩形来绘制不同颜色的纹理部分,但对于文本?

最好的方法可能涉及自定义着色器。但是,你也可以用剪刀形的矩形来做

  • 通常以上色(绿色)绘制文本
  • 设置只允许在文本的下半部分绘制的
  • 使用底色(红色)正常绘制文本。上半部分应该剪掉,这样绿色的文字应该保留在那里

  • 为了澄清这一点,您的文本应该两次都在同一位置绘制。

    最好的方法可能包括自定义着色器。但是,你也可以用剪刀形的矩形来做

  • 通常以上色(绿色)绘制文本
  • 设置只允许在文本的下半部分绘制的
  • 使用底色(红色)正常绘制文本。上半部分应该剪掉,这样绿色的文字应该保留在那里

  • 为了澄清这一点,您的文本应该两次都在同一位置绘制。

    如果您想要更多的控制,您可以使用两种不同的spritefont纹理。使用位图字体生成器获取初始spritefont:。如果需要,修改你的纹理使其看起来很漂亮(阴影等)。复制字体纹理并用透明的洋红色覆盖文本的上半部分。然后绘制两次文本,第二次使用修改过的字体和不同的颜色。这种方法的优点是,你的上半部和下半部不需要用一条直线来描绘,也就是说,上半部可能是粘粘的,滴落在顶部等等。

    如果你想要更多的控制,你可以使用两种不同的spritefont纹理。使用位图字体生成器获取初始spritefont:。如果需要,修改你的纹理使其看起来很漂亮(阴影等)。复制字体纹理并用透明的洋红色覆盖文本的上半部分。然后绘制两次文本,第二次使用修改过的字体和不同的颜色。这种方法的优点是,你的上半部和下半部不需要用一条直线来描绘,也就是说,上半部可能是粘粘的,滴在顶部等等。

    我会用“蹩脚的编码家伙”建议的自定义效果来做这件事,它需要向效果发送一些数据,下面的代码是HLSL,您需要逐像素淡入Color1和Color2之间字符串的颜色。您可以通过从中减去.5,然后将用于lerp的值乘以10饱和,使其成为纯色变化

    float4x4 Projection;
    float4 Color1, Color2;
    float FontHeight;
    float2 Location;
    
    Texture2D FontTexture;
    sampler TextureSampler = sampler_state { texture = <FontTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = clamp; AddressV = clamp;};
    
    struct VertexShaderInput
    {
        float4 Position : POSITION0;
        float2 Texture : TEXCOORD0;
    };
    
    struct VertexShaderOutput
    {
        float4 Position : POSITION0;
        float2 Texture : TEXCOORD0;
        float2 OriginalPosition : TEXCOORD1;
    };
    
    VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
    {
        VertexShaderOutput output;
    
        output.OriginalPosition = input.Position;
        output.Texture = input.Texture;
        output.Position = mul(input.Position, Projection);
    
        return output;
    }
    
    float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
    {
        float4 fontColor = lerp (Color1, Color2,  (1.0 / FontHeight) * (input.OriginalPosition.y - Location.y));
        return tex2D(TextureSampler, input.Texture)*  fontColor;
    }
    
    technique Technique1
    {
        pass Pass1
        {
            VertexShader = compile vs_2_0 VertexShaderFunction();
            PixelShader = compile ps_2_0 PixelShaderFunction();
        }
    }
    

    编辑:你可能会注意到,我不得不将纹理从sprite字体中去掉,这是一个非常烦人的私有字段!如果有人知道更好的方法,请告诉我

    我会使用“蹩脚的编码家伙”建议的自定义效果来实现这一点,它需要发送一点数据到效果,下面的代码是HLSL,您需要逐像素淡入Color1和Color2之间的字符串颜色。您可以通过从中减去.5,然后将用于lerp的值乘以10饱和,使其成为纯色变化

    float4x4 Projection;
    float4 Color1, Color2;
    float FontHeight;
    float2 Location;
    
    Texture2D FontTexture;
    sampler TextureSampler = sampler_state { texture = <FontTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = clamp; AddressV = clamp;};
    
    struct VertexShaderInput
    {
        float4 Position : POSITION0;
        float2 Texture : TEXCOORD0;
    };
    
    struct VertexShaderOutput
    {
        float4 Position : POSITION0;
        float2 Texture : TEXCOORD0;
        float2 OriginalPosition : TEXCOORD1;
    };
    
    VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
    {
        VertexShaderOutput output;
    
        output.OriginalPosition = input.Position;
        output.Texture = input.Texture;
        output.Position = mul(input.Position, Projection);
    
        return output;
    }
    
    float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
    {
        float4 fontColor = lerp (Color1, Color2,  (1.0 / FontHeight) * (input.OriginalPosition.y - Location.y));
        return tex2D(TextureSampler, input.Texture)*  fontColor;
    }
    
    technique Technique1
    {
        pass Pass1
        {
            VertexShader = compile vs_2_0 VertexShaderFunction();
            PixelShader = compile ps_2_0 PixelShaderFunction();
        }
    }
    

    编辑:你可能会注意到,我不得不将纹理从sprite字体中去掉,这是一个非常烦人的私有字段!如果有人知道更好的方法,请告诉我

    我知道这是一个老问题,但这将允许您创建具有各种效果的自定义位图字体,如阴影、浮雕、辉光。它将为您生成字体纹理,然后您可以编辑和添加多种颜色或其他后期处理效果。在XNA中使用它只需添加到内容项目中,并将ContentProcessor设置为“Sprite字体纹理”。然后,你可以像加载普通精灵字体一样在游戏中加载它。

    我知道这是一个老问题,但这将允许你创建具有各种效果的自定义位图字体,如阴影、浮雕、辉光。它将为您生成字体纹理,然后您可以编辑和添加多种颜色或其他后期处理效果。在XNA中使用它只需添加到内容项目中,并将ContentProcessor设置为“Sprite字体纹理”。然后你可以在游戏中加载它,就像加载普通的精灵字体一样