Я очень новичок в обоих шейдерах и в 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();
текстура выглядит следующим образом:
Мой результат выглядит следующим образом:
Что происходит? Мой шейдер даже не касается цвета. Даже когда я удаляю переменную «Цвет» со входа и выхода, получается то же самое. Похоже, что это каким-то образом путает координаты одной переменной с цветовыми значениями. Я неправильно использую шейдер?
Благодарим за помощь.