Ошибка зажима пиксельного шейдера XNA - PullRequest
0 голосов
/ 31 июля 2011

Я хочу применить пиксельный шейдер к своему фоновому спрайту, чтобы создать какое-то освещение.Поэтому я рисую цель рендера со светом и хочу слить ее с фоном с помощью пиксельного шейдера.Это необходимый код:

  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 - это цель рендеринга с нарисованным простым спрайтом, а lightingMask - цель рендера с текстурой света в нем.Оба значения имеют ширину и высоту Backbuffer.

Так что, когда я пытаюсь запустить программу, происходит сбой: для профиля 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 голосов
/ 01 августа 2011

Если вы не можете использовать мощность двух текстур, вам нужно изменить вызов Spritebath.begin и указать SamplerState .Минимум для указания должен быть

public void Begin (
         SpriteSortMode sortMode,
         BlendState blendState,
         SamplerState samplerState,
         DepthStencilState depthStencilState,
         RasterizerState rasterizerState
)
0 голосов
/ 01 августа 2011

Ошибка относится к вашему режиму адресации текстуры (то есть: текстура оборачивается по краям или зажата по краям). Ничего общего с шейдером.

Используйте одну из перегрузок для SpriteBatch.Begin ( MSDN ), которая принимает SamplerState и передает SamplerState.LinearClamp ( MSDN ).

По умолчанию для SpriteBatch.Begin установлено значение SamplerState.LinearClamp, поэтому вы должны установить другое состояние (например, LinearWrap) на графическом устройстве где-то еще в вашем коде? Не делай этого.

(Альтернативно: измените профиль Reach на профиль HiDef в настройках вашего проекта.)

...