好的,所以我试图在Monogame 3.4中了解HLSL。问题的一部分是我发现的许多现有例子都不能正常工作,所以我无法弄清楚我做错了什么,我得到的错误没有帮助!
我正在尝试将纹理和调色板纹理传递给像素着色器,此时我正在使用SpriteBatch进行绘制,但最终我将它应用于多边形(希望如此)。纹理通过SpriteBatch绘制方法进入(我假设是S0),而我需要通过使用参数传递palleteImage,但是当我尝试使用以下内容时,我在SetValue上得到一个NullException,因为它认为没有一个参数。有任何想法吗?或者更重要的是,我可以看到一个工作示例,因为我发现许多现有的像素着色器在MonoGame 3.4上无效!
HLSL
sampler TextureSampler : register(s0);
texture paletteImage;
sampler2D PaletteSampler = sampler_state {
Texture = <paletteImage>;
};
float4 PixelShaderFunction(float4 position : SV_Position, float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
float4 tex = tex2D(TextureSampler, texCoord);
float2 coords = float2(0.5f, 0.5f);
float4 palColour = tex2D(PaletteSampler, coords);
return tex * color;
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_4_0 PixelShaderFunction();
}
}
绘制代码
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
effect.CurrentTechnique.Passes[0].Apply();
effect.Parameters["paletteImage"].SetValue(paletteImage);
// draw here
spriteBatch.Draw(texture, new Rectangle(10, 10, texture.Width * 3, texture.Height * 3), Color.White)
spriteBatch.End();
异常发生在SetValue,据我所知HLSL没问题,但是有些不对......我注意到如果它不认为某个参数被使用它就会抛出错误(例如,我试过传递一种颜色,但直到我在HLSL代码中使用了那种被接受的颜色......这是同样的事情吗?)
答案 0 :(得分:0)
我实际上解决了它,如果我用它的palcolour值替换最后的颜色值,结果证明了!这几乎就好像整个事情取决于你是否以菊花链的方式充分利用这些价值观。疯了吗?