2016-06-09 16 views
0

Ich versuche, einen Distortion-Shader für Wasser in meinem Spiel zu machen. Ich habe das Renderziel des Bildschirms, und die Wassermaske rendertarget, und ich versuche, die Pixel unter der Maske einfach zu erfassen, aber ich kann es nicht zur Arbeit bringen. Wenn ich die Texturen passiere, ist es so, als wären sie beide komplett transparent. Was könnte ich falsch machen?Monogame Pixel Shader - Texture Passing als komplett transparent

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(); 
    } 
} 

Render Ziel:

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(); 

Schließlich machen die rendertarget: using monogame während meiner Entwicklung

sprites.Draw(renderTargetDistortion, renderTargetPosition, Color.White); 
+0

Können Sie den Code hinzufügen, mit denen Sie die Renderziele erstellen (vielleicht hast du auch ein Format gewählt, das keinen Alpha-Kanal hat) –

+0

Hast du schon versucht, etwas einfacheres zu tun, wie zum Beispiel Rendern eines einzelnen Sprites auf ein Renderziel und dann Anzeigen dieses Renderziels auf dem Bildschirm, um zu prüfen, ob das zumindest funktioniert? –

Antwort

0

ich genau das gleiche "Problem" hatte.

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

wie diese in einen anderen Modus: Das Problem ist hier leicht fixiert ist, dies ändern

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

Viel Spaß :)

Verwandte Themen