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