我想在我的背景精灵上应用像素着色器,以创建某种照明。 所以我用它上面的光绘制一个渲染目标,并希望通过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
答案 0 :(得分:0)
错误指的是纹理寻址模式(即:纹理在边缘处缠绕,还是夹在边缘处)。与着色器无关。
使用带有SpriteBatch.Begin
的{{1}}(MSDN)重叠之一,然后传递SamplerState
(MSDN)。< /击>
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
)