2016-06-09 2 views
0

Я пытаюсь сделать искажающий шейдер для воды в моей игре. У меня есть 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); 
+0

Не могли бы вы добавить код, который вы создаете Render Targets (возможно, вы выбираете формат, который не имеет альфа-канала) –

+0

Также вы уже пытались сделать что-то более простое, например, рендеринг одного спрайта в цель рендеринга, показывая эту цель рендеринга на экране, чтобы проверить, по крайней мере это сработало? –

ответ

0

Я был точно такой же "вопрос" с помощью monogame во время моего развития. Проблема здесь легко исправить, изменить:

sprites.Begin(**SpriteSortMode.Deferred**, null, null, null, null, waterEffect); 
sprites.Draw(renderTargetWater, Vector2.Zero, Color.White); 
sprites.End(); 

В другом режиме, как это:

sprites.Begin(**SpriteSortMode.Immediate**, null, null, null, null, waterEffect); 
sprites.Draw(renderTargetWater, Vector2.Zero, Color.White); 
sprites.End(); 

Удачи :)

Смежные вопросы