Ekrandaki müzikçalara, müzikçalarda halihazırda görünür olmayan bir yere sis atmaya çalışıyorum. Bunu oyunun içeriğini bir RenderTarget
ve savaşın sisini bir diğerine dönüştürerek yapıyorum ve sonra onları oyunun rengi RenderTarget
ve alfa savaşı hedefin hedefi olan alfadan alan bir efekt dosyasıyla birleştiriyorum. FOW RenderTarget
, FOW'un göründüğü yerde siyah ve olmadığı yerde beyazdır.Sis Sisli için Efekt Kullanma
Bu işe yarıyor, ancak amaçlanan renkteki siyahın yerine beyazın (ortaya çıkarılmamış konumlar) beyazını renklendiriyor.
Efekt uygulamadan önce, cihazın arka tarafını beyaza doğru siliyorum. Siyahı temizlemeye çalıştığımda, savaşın hiç bir sisini göremiyorum, ki bu siyahla alfa harmanlamanın bir ürünüdür. Bununla birlikte, diğer tüm renkler için çalışır, sonuçta ortaya çıkan ekrana bu rengin bir tonu verilir.
İki render hedefi arasında hala alfa harmanlamayı yaparken siyah bir sisteği nasıl arşivlerim?
Fow uygulamak için render kodu:
private RenderTarget2D mainTarget;
private RenderTarget2D lightTarget;
private void CombineRenderTargetsAndDraw()
{
batch.GraphicsDevice.SetRenderTarget(null);
batch.GraphicsDevice.Clear(Color.White);
fogOfWar.Parameters["LightsTexture"].SetValue(lightTarget);
batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
fogOfWar.CurrentTechnique.Passes[0].Apply();
batch.Draw(
mainTarget,
new Rectangle(0, 0, batch.GraphicsDevice.PresentationParameters.BackBufferWidth, batch.GraphicsDevice.PresentationParameters.BackBufferHeight),
Color.White
);
batch.End();
}
Ben Fow uygulamak için kullanıyorum etkisi dosyası: Eğer duruma çalışan gibi
texture LightsTexture;
sampler ColorSampler : register(s0);
sampler LightsSampler = sampler_state{
Texture = <LightsTexture>;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float2 TexCoord : TEXCOORD0;
};
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float2 tex = input.TexCoord;
float4 color = tex2D(ColorSampler, tex);
float4 alpha = tex2D(LightsSampler, tex);
return float4(color.r, color.g, color.b, alpha.r);
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
Çok faydalı yanıt. Alfa ve harman kavramlarını karıştırdım. LightTarget RT'm artık görünür alanlarda şeffaftır ve her yerde tamamen opaktır. Bu, fow çizmek için gölgelendiricinizin değiştirilmiş bir sürümünü kullanmamı sağlar. Color.r * yerine (1-fow.a) fow.r kullanıyorum * (1-fow.a). –