Я пытаюсь сделать искажающий шейдер для воды в моей игре. У меня есть rendertarget экрана и водяная маска rendertarget, и я пытаюсь просто захватить пиксели под маской, но я не могу заставить ее работать. Когда я передаю текстуры, это как будто они оба полностью прозрачны. Что я могу делать неправильно?Monogame pixel shader - Текстура, проходящая как полностью прозрачная
Shader:
texture Screen;
texture Mask;
float2 Offset;
sampler ScreenSampler = sampler_state
{
Texture = <Screen>;
};
sampler MaskSampler = sampler_state
{
Texture = <Mask>;
};
float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR
{
float4 mask = tex2D(MaskSampler, texCoord);
float4 color = tex2D(ScreenSampler, texCoord + Offset);
if (mask.a > 0)
{
return color;
}
return mask;
}
technique Technique0
{
pass Pass0
{
PixelShader = compile ps_4_0 PixelShaderFunction();
}
}
Рендер цель:
Doldrums.Game.Graphics.GraphicsDevice.SetRenderTarget(renderTargetDistortion);
Doldrums.Game.Graphics.GraphicsDevice.Clear(Color.Transparent);
waterEffect.Parameters["Screen"].SetValue(Doldrums.RenderTarget);
waterEffect.Parameters["Mask"].SetValue(renderTargetWater);
waterEffect.Parameters["Offset"].SetValue(Doldrums.Camera.ToScreen(renderTargetPosition));
sprites.Begin(SpriteSortMode.Deferred, null, null, null, null, waterEffect);
sprites.Draw(renderTargetWater, Vector2.Zero, Color.White);
sprites.End();
Наконец, делая RenderTarget:
sprites.Draw(renderTargetDistortion, renderTargetPosition, Color.White);
Не могли бы вы добавить код, который вы создаете Render Targets (возможно, вы выбираете формат, который не имеет альфа-канала) –
Также вы уже пытались сделать что-то более простое, например, рендеринг одного спрайта в цель рендеринга, показывая эту цель рендеринга на экране, чтобы проверить, по крайней мере это сработало? –