XNA像素着色器夹紧错误

时间:2011-07-31 17:13:47

标签: xna shader

我想在我的背景精灵上应用像素着色器,以创建某种照明。 所以我用它上面的光绘制一个渲染目标,并希望通过Pixel着色器将它合并到背景上。 这是必不可少的代码:

  GraphicsDevice.Clear(Color.Black);

    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);

    lighting.Parameters["lightMask"].SetValue(lightingMask);
    lighting.CurrentTechnique.Passes[0].Apply();

    spriteBatch.Draw(hexBack, new Vector2(0, 0), Color.White);

    spriteBatch.End();

在这种情况下,hexBack是Rendertarget,其中绘制了一个简单的精灵,lightingMask是带有浅色纹理的rendertarget。 两者都是Backbuffer的宽度和高度。

因此,当我尝试运行该程序时,它会崩溃:  当使用不是2的幂的纹理大小时,XNA Framework Reach配置文件要求TextureAddressMode为Clamp。

所以我试图设置钳制,但我找不到让它工作的方法。

着色器代码:

texture lightMask;
sampler mainSampler : register(s0);
sampler lightSampler = sampler_state{Texture = lightMask;};

struct PixelShaderInput
{
    float4 TextureCoords: TEXCOORD0;

};

float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
{

    float2 texCoord = input.TextureCoords;

    float4 mainColor = tex2D(mainSampler, texCoord);
    float4 lightColor = tex2D(lightSampler, texCoord);

    return mainColor * lightColor;
}

technique Technique1
{
    pass Pass1
    {
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}

感谢您的帮助!

pcnx

2 个答案:

答案 0 :(得分:0)

错误指的是纹理寻址模式(即:纹理在边缘处缠绕,还是夹在边缘处)。与着色器无关。

使用带有SpriteBatch.Begin的{​​{1}}(MSDN)重叠之一,然后传递SamplerStateMSDN)。< /击>

SamplerState.LinearClamp的默认值为SpriteBatch.Begin,因此您必须在代码中的其他位置设置不同的状态(例如:SamplerState.LinearClamp)到图形设备上?不要那样做。

(或者:在项目设置中从Reach配置文件更改为HiDef配置文件。)

答案 1 :(得分:0)

如果您无法使用两种纹理,则必须更改Spritebath.begin调用和specify a SamplerState。指定的最小值应为

public void Begin (
         SpriteSortMode sortMode,
         BlendState blendState,
         SamplerState samplerState,
         DepthStencilState depthStencilState,
         RasterizerState rasterizerState
)