C# 单对策中的HLSL问题

C# 单对策中的HLSL问题,c#,monogame,hlsl,C#,Monogame,Hlsl,好的,所以我试着在Monogame3.4中了解HLSL。问题的一部分是,我发现许多现有的示例无法正常工作,因此我无法找出我做错了什么,而我得到的错误也没有帮助 我正在尝试将纹理和调色板纹理传递给像素着色器,目前我正在使用SpriteBatch进行绘制,但最终我会将其应用于多边形(希望如此)。纹理通过SpriteBatch draw方法(我假设为S0)进入,而我需要使用参数传递PalletImages,但是当我尝试执行以下操作时,我在SetValue上得到一个NullException,因为它认为

好的,所以我试着在Monogame3.4中了解HLSL。问题的一部分是,我发现许多现有的示例无法正常工作,因此我无法找出我做错了什么,而我得到的错误也没有帮助

我正在尝试将纹理和调色板纹理传递给像素着色器,目前我正在使用SpriteBatch进行绘制,但最终我会将其应用于多边形(希望如此)。纹理通过SpriteBatch draw方法(我假设为S0)进入,而我需要使用参数传递PalletImages,但是当我尝试执行以下操作时,我在SetValue上得到一个NullException,因为它认为没有参数。有什么想法吗?或者更重要的是,有一个工作的例子,我可以看到很多现有的像素着色器的东西,我发现不工作的单游戏3.4

HLSL


异常发生在SetValue,据我所知,HLSL很好,但有点不对劲。。。我注意到,如果它不认为某个参数正在被使用,它就会抛出一个错误(例如,我尝试传递一种颜色,但直到我在HLSL代码中使用该颜色时,它才被接受……这是同一件事吗?

我实际上已经解决了它,如果我用palcolour值替换最后的颜色值,它就会工作!这几乎就好像整个事情取决于你是否以菊花链的方式充分利用价值观。疯了吗?

事实上我已经解决了它,如果我用palcolor值替换最后的颜色值,它就会工作!这几乎就好像整个事情取决于你是否以菊花链的方式充分利用价值观。Mad eh?

在尝试调用
SetValue
之前,您不能/不应该检查
效果。参数[“paletteImage”]
是否为空?(或者你甚至可以使用
?。
如果你使用的是C#6.0。)这是从你在另一个答案上所说的判断,你得到了一个
NullReferenceException
。我正在检查参数在调试中是否可用,这就是为什么我感到困惑的原因,因为据我所知HLSL是有效的。最后,它被删除了,因为它认为它没有被使用,直到我强制使用它,它才真正运行。我的观点是,不必修改着色器代码来“强制”使用变量,你可以使你的CPU端代码灵活,只提供所需的参数。我同意这种观点,问题是,它应该始终设置并用作着色器的一部分,否则图像将出错(灰度)。您不能/不应该在尝试调用
设置值之前检查
效果。参数[“paletteImage”]
是否为空?(或者你甚至可以使用
?。
如果你使用的是C#6.0。)这是从你在另一个答案上所说的判断,你得到了一个
NullReferenceException
。我正在检查参数在调试中是否可用,这就是为什么我感到困惑的原因,因为据我所知HLSL是有效的。最后,它被删除了,因为它认为它没有被使用,直到我强制使用它,它才真正运行。我的观点是,不必修改着色器代码来“强制”使用变量,你可以使你的CPU端代码灵活,只提供所需的参数。我同意这种观点,问题是,它应该始终设置并作为着色器的一部分使用,否则图像将出错(灰度)。
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();