Monogame - 当我在 Draw 方法中添加 Vector2 时,着色器未正确渲染

问题描述 投票:0回答:1

我正在学习 Monogame 中的渲染和编码着色器或效果,并且借助我在网上找到的资源,了解了在着色器中添加颜色和整形功能的基础知识。

根据我到目前为止所学到的,我必须在 Spritebatch.Begin() 参数中输入“*effect: my_effect”,然后在程序的 Draw 方法中添加以下内容:

(代码运行良好)

_spriteBatch.Begin(effect:my_effect);
_spriteBatch.Draw(my_Texture2D, my_Rectangle, Color);
_spriteBatch.End();

 

上面的代码运行良好,非常棒。当我在 Draw 参数中添加 Vector2 时,问题就出现了,着色器突然无法正确渲染:

(无法正常工作的代码)

 _spriteBatch.Begin(effect:my_effect);
_spriteBatch.Draw(my_Texture2D, my_Rectangle, my_Vector2, Color);
_spriteBatch.End();

希望有人能帮忙,我将不胜感激。

这是下面的代码(用于上下文):

public class Game1 : Game
{
    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch;
    Rectangle boxus;
    Texture2D color;
    Effect first_effect;
    Vector2 magi;

    public Game1()
    {
        _graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        IsMouseVisible = true;
    }

    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        magi = new Vector2(0, 0);
        boxus = new Rectangle(0,0, 100, 100);
  
        color = new Texture2D(GraphicsDevice, 1, 1);
        
        first_effect = Content.Load<Effect>("Shader");
        color.SetData<Color>(new Color[] { Color.White});
        base.Initialize();
    }

    protected override void LoadContent()
    {
        _spriteBatch = new SpriteBatch(GraphicsDevice);

        // TODO: use this.Content to load your game content here
    }

    protected override void Update(GameTime gameTime)
    {
       

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here

        _spriteBatch.Begin(effect:first_effect);          
        _spriteBatch.Draw(color,magi,boxus, Color.White);
        _spriteBatch.End();
        base.Draw(gameTime);
    }
}

不太好:

太棒了:

编辑:下面是我的自定义着色器代码:

#if OPENGL
    #define SV_POSITION POSITION
    #define VS_SHADERMODEL vs_3_0
    #define PS_SHADERMODEL ps_3_0
#else
    #define VS_SHADERMODEL vs_4_0_level_9_1
    #define PS_SHADERMODEL ps_4_0_level_9_1
#endif

Texture2D SpriteTexture;

sampler2D SpriteTextureSampler = sampler_state
{
    Texture = <SpriteTexture>;
};

struct VertexShaderOutput
{
    float4 Position : SV_POSITION;
    float4 Color : COLOR0;
    float2 TextureCoordinates : TEXCOORD0;
};

float4 MainPS(VertexShaderOutput input) : COLOR
{
    
    float col = tex2D(SpriteTextureSampler, input.TextureCoordinates) * input.Color;
    float shape_function = step(input.TextureCoordinates.x, sqrt(input.TextureCoordinates.y));
    float3 colorzz = float3(0.9, 0.5, 0.2);
    
    
    //THE MIX FUNCITON
     colorzz = colorzz * (1 - step(0.5, input.TextureCoordinates.y)) + float3(0.0, 0.3, 0.9) * step(0.5, input.TextureCoordinates.y);
   
    

    
    float4 output = float4(colorzz * shape_function, 1.0);
    
    return col * output;
   
    
  
}

technique SpriteDrawing
{
    pass P0
    {
        PixelShader = compile PS_SHADERMODEL MainPS();
    }
};
shader game-development monogame
1个回答
0
投票

问题源于 SpriteBatch 的 2 个不同使用的 Draw(...) 方法。

第一个定义了目标矩形,这意味着您的纹理被“拉伸”到目标帧缓冲区中的给定矩形,因此在位置 0, 0 处有一个 100 x 100 的矩形。

public void Draw(Texture2D texture, Rectangle destinationRectangle, Color color) {...}

您使用的第二个 Draw 函数采用一个矩形来定义应绘制源纹理的哪一部分以及目标帧缓冲区中的哪个位置:

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color) {...}

因此,它假设源纹理中的大小为 100 x 100 矩形(大小 1 x 1 像素),导致 Sqrt 函数拉伸 100 倍。

我认为,对于你的情况,你可以使用这个:

public void Draw(Texture2D texture, Rectangle destinationRectangle, Rectangle? sourceRectangle, Color color) {...}

这里目标矩形的 x, y 将是目标帧缓冲区中的实际最终位置,而源矩形将是

new(0,0,1,1)

希望这有帮助,如果您需要更多信息,请告诉我。按住 Ctrl 键并单击 Draw 函数,您将进入 SpriteBatch 类,在其中您可以看到所有不同的 Draw 函数替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.