2015-05-20 5 views
0

Я очень новичок в обоих шейдерах и в Monogame, так что простите меня, если я упустил что-то очевидное.Простой вершинный шейдер не работает корректно в 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

Что происходит? Мой шейдер даже не касается цвета. Даже когда я удаляю переменную «Цвет» со входа и выхода, получается то же самое. Похоже, что это каким-то образом путает координаты одной переменной с цветовыми значениями. Я неправильно использую шейдер?

Благодарим за помощь.

ответ

1

Это основано на моем опыте работы с XNA, но я не могу себе представить, что есть что-то, что позволит вам пропустить сцену пиксельных шейдеров в моно (и заменить ее по умолчанию). Геометрический шейдер не является обязательным, пиксельный шейдер не является.

Проще говоря: вам нужен пиксельный шейдер, чтобы отобразить текстуру в геометрии с использованием UV-кодов, переданных из вершинного шейдера.

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();