Böyle bir şeye ne dersin?
Karo spritelarınızı renklendirerek aydınlatmanızı çizmeyin. Senin çizin sönük bir hale hedefe fayans sonra karonun alanı kapsayan bir gri tonlama dikdörtgen olarak her birini temsil eden ikinci bir hale hedefe kiremit ışıkları çizin. Son sahneyi oluşturmak için, iki render hedefini birleştirmek için bir gölgelendirici kullanın ve birincinin her pikselini ikincinin değerine göre koyulaştırın.
Bu tam olarak şimdi sahip olduklarınızı üretecektir. Bu size yardımcı olmuyor, bu yüzden biraz değiştirelim.
Işık haritası oluşturma hedefinizin boyutlarını, her döşemenin dikdörtgen bir alan yerine tek bir pikselle temsil edileceği şekilde değiştirin . Son sahneyi birleştirirken, doğrusal filtrelemeli bir örnekleyici durumu kullanın. Aksi takdirde her şeyi aynı bırakın.
Gölgelendiricinizi doğru yazdığınız varsayılarak, ışık haritasının birleştirme sırasında etkili bir şekilde "ölçeklendirilmesi" gerekir. Bu, grafik cihazının doku örnekleyicisi aracılığıyla ücretsiz olarak güzel bir gradyan efekti sağlayacaktır.
Ayrıca gölgelendiriciyi kesebilir ve bunu daha basit bir 'kararan' BlendState ile yapabilirsiniz, ancak size detayları vermeden önce denemek zorunda kalacağım.
GÜNCELLEME
Bugün bununla alay etmek için biraz zamanım vardı. Yukarıdaki cevap, gölgelendiricileri her şeye ilk cevabım olarak kullanma alışkanlığımı yansıtıyor, ancak bu durumda aslında gerekli değiller ve kullanımları bir şeyleri gereksiz yere karmaşıklaştırıyor.
Önerdiğim gibi, özel bir BlendState kullanarak tam olarak aynı efekti gerçekleştirebilirsiniz. Özellikle, bu özel BlendState:
BlendState Multiply = new BlendState()
{
AlphaSourceBlend = Blend.DestinationAlpha,
AlphaDestinationBlend = Blend.Zero,
AlphaBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.DestinationColor,
ColorDestinationBlend = Blend.Zero,
ColorBlendFunction = BlendFunction.Add
};
Karıştırma denklemi
result = (source * sourceBlendFactor) blendFunction (dest * destBlendFactor)
Böylece özel BlendState'imizle,
result = (lightmapColor * destinationColor) + (0)
Bu, saf beyazın (1, 1, 1, 1) kaynak renginin hedef rengi koruyacağı, saf siyahın (0, 0, 0, 1) kaynak renginin hedef rengi saf siyaha koyulaştıracağı anlamına gelir. aradaki gri tonu, hedef rengi orta düzeyde koyulaştırır.
Bunu uygulamaya koymak için önce ışık haritanızı oluşturmak için ne yapmanız gerekiyorsa yapın:
var lightmap = GetLightmapRenderTarget();
Ardından, ışıksız sahnenizi normalde yaptığınız gibi doğrudan backbuffer'a çizin :
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
/* draw the world here */
spriteBatch.End();
Ardından özel BlendState kullanarak ışık eşlemesini çizin:
var offsetX = 0; // you'll need to set these values to whatever offset is necessary
var offsetY = 0; // to align the lightmap with the map tiles currently being drawn
var width = lightmapWidthInTiles * tileWidth;
var height = lightmapHeightInTiles * tileHeight;
spriteBatch.Begin(SpriteSortMode.Immediate, Multiply);
spriteBatch.Draw(lightmap, new Rectangle(offsetX, offsetY, width, height), Color.White);
spriteBatch.End();
Bu, hedef rengi (ışıksız döşemeler) kaynak renkle (ışık haritası) çarpar, ışıksız döşemeleri uygun şekilde koyulaştırır ve ışık haritası dokusunun gerekli boyuta yükseltilmesinin bir sonucu olarak degrade efekti oluşturur.