我对着色器和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();
纹理如下所示:
我的结果如下:
发生了什么事?我的着色器甚至没有触摸颜色。即使我删除了&#34; Color&#34;输入和输出的变量结果相同。看起来它以某种方式混淆了一个变量的坐标与颜色值。我使用着色器错了吗?
感谢您的帮助。
答案 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();