2016-06-09 63 views
0

我正在嘗試在我的遊戲中爲水製作畸變着色器。我有屏幕的rendertarget和水面罩rendertarget,我試圖簡單地捕捉面具下的像素,但我無法得到它的工作。當我通過紋理時,就好像它們都是完全透明的。我可能做錯了什麼?Monogame像素着色器 - 紋理作爲完全透明傳遞

着色器:

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

最後,渲染渲染目標:

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

您可以加入與您創建渲染目標代碼(也許你選擇了一個沒有alpha通道的格式) –

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

玩得開心:)