我正在尝试以Monogame实现PixelShader。
着色器(现在)应该只使用纹理并将其恢复为未操作。
sampler MyTex : register(s0);
float4 PixelShaderFunction( float2 coords: TEXCOORD0 ) : COLOR0
{
float4 Color = tex2D(MyTex, coords);
return Color;
}
technique tech
{
pass Pass1
{
PixelShader = compile ps_4_0_level_9_1 PixelShaderFunction();
}
}
我的Monogame实现看起来像这样:
在LoadContent中:
spriteBatch = new SpriteBatch(GraphicsDevice);
texture = Content.Load<Texture2D>("surge");
GraphicsDevice.Textures[0] = texture;
effect = Content.Load<Effect>("sha");
并在绘制方法中:
GraphicsDevice.Clear(Color.Aquamarine);
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend,null, null, null, effect, null);
spriteBatch.Draw(texture, new Vector2(150, 150), Color.White);
spriteBatch.End();
但它没有显示任何内容。将BlendState更改为Opaque为我提供了一个纹理应该是黑色矩形。我也试过改变其他的Sortmodes和BlendStates但没有成功。我似乎无法找到问题。 任何有助于解决问题或正在减少我自己的仇恨的答案都非常感谢!
编辑:资源绑定(注册)在整个着色器模型版本中是否发生了变化? 有人请帮忙!
答案 0 :(得分:0)
嗨Steffen我已尝试使用此代码进行灰度效果
texture Texture;
sampler TextureSampler = sampler_state
{
Texture = <Texture>;
};
//此数据来自sprite批处理顶点着色器
struct VertexShaderOutput
{
float4 Position : TEXCOORD0;
float4 Color : COLOR0;
float2 TextureCordinate : TEXCOORD0;
};
//我们的像素着色器
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float4 color = tex2D(TextureSampler, input.TextureCordinate);
float value = 0.299*color.r + 0.587*color.g + 0.114*color.b;
color.r = value;
color.g = value;
color.b = value;
color.a = 1.0f;
return color;
}
//编译我们的着色器
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}