为什么我的xna像素着色器不会将此纹理变为蓝色?

时间:2011-11-15 00:56:21

标签: xna-4.0 hlsl

我有一个非常简单的像素着色器:

float4 PixelShaderFunction(float2 uv : TEXCOORD0) : COLOR0
{
    return float4(0, 1, 0, 1);
}

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

我有一个纹理:

        Vector4[] textureData = new Vector4[width * height];
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                textureData[y * width + x] = new Vector4(1, 0, 0, 1);
            }
        }
        myTexture = new Texture2D(GraphicsDevice, width, height, false, SurfaceFormat.Vector4);
        myTexture.SetData(textureData);

我用这段代码绘制它:

        spriteBatch.Begin(SpriteSortMode.Texture,
                          BlendState.Additive,
                          SamplerState.PointWrap,
                          DepthStencilState.DepthRead,
                          RasterizerState.CullNone);

        myEffect.CurrentTechnique.Passes[0].Apply();
        spriteBatch.Draw(myTexture, new Rectangle(0, 0, width, height), Color.White);

        spriteBatch.End();

我想通过在像素着色器上调用.Apply(),后续的spriteBatch.Draw()调用将通过我的像素着色器发送myTexure。由于像素着色器函数总是返回float4(0,1,0,1),我希望结果是绿色方块,而是呈现红色方块,就好像像素着色器没有触及它一样。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

您实际上从未在着色器上调用Begin(),因此它仍将使用默认着色器。

此外,现在有更简洁的方法。您可以将效果作为参数传递给SpriteBatch首发电话as detailed here

答案 1 :(得分:0)

看起来我只需要将SpriteSortMode更改为Immediate并将像素着色器版本从3更改为2