简单顶点着色器在Monogame

时间:2015-05-20 08:25:39

标签: c# xna shader monogame vertex-shader

我对着色器和Monogame都很陌生,所以如果我遗漏了一些明显的东西,请原谅我。

我非常松散地关注本教程:http://www.david-gouveia.com/portfolio/scrolling-textures-with-zoom-and-rotation/

我想要与我自己的游戏中的教程完全相同的效果:基于相机旋转/缩放/位置绘制的纹理。

这是我的着色器代码:

sampler TextureSampler : register(s0);

struct VertexShaderInput
{
    float4 Color: COLOR0;
    float2 TexCoord : TEXCOORD0;
    float4 Position : SV_Position0;
};

struct VertexShaderOutput
{
    float4 Color: COLOR0;
    float2 TexCoord : TEXCOORD0;
    float4 Position : SV_Position0;
};

float2   ViewportSize;
float4x4 ScrollMatrix;

VertexShaderOutput SpriteVertexShader(VertexShaderInput input)
{
    VertexShaderOutput output;
    float4 position = input.Position;

    // Half pixel offset for correct texel centering.
    position.xy -= 0.5;

    // Viewport adjustment.
    position.xy = position.xy / ViewportSize;
    position.xy *= float2(2, -2);
    position.xy -= float2(1, -1);

    // Transform our texture coordinates to account for camera
    output.TexCoord = mul(float4(input.TexCoord.xy, 0, 1), ScrollMatrix).xy;
    output.Position = position;
    output.Color = input.Color;

    return output;
}

technique SpriteBatch
{
    pass
    {
        VertexShader = compile vs_4_0_level_9_1  SpriteVertexShader();
    }
}

我将它加载到monogame:

Effect effect = content.Load<Effect>("SpriteEffects\\infinite");
effect.Parameters["ViewportSize"].SetValue(new Vector2(viewport.Width,viewport.Height));

在绘图时获得效果的功能:

public Effect getScrollEffect()
        {
            //This should use a matrix based on the camera, but I'm using an Identity matrix for testing
            effect.Parameters["ScrollMatrix"].SetValue(Matrix.Identity);
            return effect;
        }

然后画出来:

spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.LinearWrap, null, null, getScrollEffect());
spriteBatch.Draw(texture, viewport.Bounds, viewport.Bounds, Color.White);
spriteBatch.End();

纹理如下所示:

enter image description here

我的结果如下:

enter image description here

发生了什么事?我的着色器甚至没有触摸颜色。即使我删除了&#34; Color&#34;输入和输出的变量结果相同。看起来它以某种方式混淆了一个变量的坐标与颜色值。我使用着色器错了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是基于我对XNA的经验,但我无法想象有什么能让你跳过单声道的整个像素着色器阶段(并用默认值替换它)。几何着色器是可选的,像素着色器不是。

简单地说:您需要像素着色器使用从顶点着色器传递的UVcoords在几何体上映射纹理。

float4 PixelShader(VertexShaderOutput input) : COLOR0
{
   float4 Diffuse =  tex2D(DiffuseSampler, input.TexCoord);
   return Diffuse * input.Color;
} 

input.Color是顶点颜色,spritebatch将其设置为顶点,在你的情况下为Color.White,用作色调。

别忘了

PixelShader = compile ps_4_0_level_9_1  PixelShader();