【问题标题】:Problems with HLSL in MonogameMonogame 中的 HLSL 问题
【发布时间】:2015-12-15 21:39:12
【问题描述】:

好的,所以我正在尝试了解 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 代码中使用该颜色后才被接受...这是同一件事吗?)

【问题讨论】:

    标签: c# monogame hlsl


    【解决方案1】:

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

    【讨论】:

    • 不能/不应该在尝试调用SetValue 之前检查effect.Parameters["paletteImage"] 是否为空? (或者,如果您使用的是 C# 6.0,您甚至可以使用 ?.。)从您在另一个答案中所说的话来看,您会得到一个 NullReferenceException
    • 我正在检查参数是否在调试中可用,这不是我感到困惑的原因,因为据我所知 HLSL 是有效的。最后事实证明它正在删除它,因为它认为它没有被使用,直到我强迫它使用它才真正运行。
    • 我的意思是,与其修改着色器代码来“强制”使用变量,不如让你的 CPU 端代码灵活,只根据需要提供参数。
    • 我同意这种观点,事情是它应该始终被设置并用作着色器的一部分,否则图像将是错误的(灰度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多