Почему мой пиксельный шейдер xna не делает эту текстуру синей? - PullRequest
0 голосов
/ 15 ноября 2011

У меня очень простой пиксельный шейдер:

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 голосов
/ 15 ноября 2011

Похоже, мне просто нужно было изменить SpriteSortMode на Immediate и изменить версию пиксельного шейдера с 3 на 2

0 голосов
/ 15 ноября 2011

На самом деле вы никогда не вызываете Begin() в своем шейдере, поэтому он все равно будет использовать шейдер по умолчанию.

Кроме того, теперь есть более чистый способ сделать это.Вы можете передать свой эффект в качестве параметра начальному вызову SpriteBatch, , как подробно описано здесь .

...