このようなものはどうですか?
タイルスプライトを着色して照明を描画しないでください。点灯していないタイルをレンダーターゲットに描画し、タイルライトを2番目のレンダーターゲットに描画します。各タイルターゲットは、タイルの領域を覆うグレースケールの四角形として表されます。最終シーンをレンダーするには、シェーダーを使用して2つのレンダーターゲットを組み合わせ、2番目の値に応じて最初のピクセルを暗くします。
これはあなたが今持っているものを正確に生成します。それは役に立たないので、少し変更しましょう。
ライトマップレンダーターゲットの寸法を変更して、各タイルが単一の長方形の領域ではなくピクセルで。最終シーンを合成するときは、線形フィルタリングでサンプラーステートを使用します。それ以外の場合は、他のすべてを同じままにします。
シェーダーを正しく記述したと仮定すると、合成中にライトマップは効果的に「スケールアップ」されるはずです。これにより、グラフィックデバイスのテクスチャサンプラーを介して素敵なグラデーション効果が無料で得られます。
また、シェーダーを切り取って、「暗くする」BlendStateでより簡単にこれを行うこともできますが、詳細を説明する前に、実験する必要があります。
更新
今日は実際にこれをモックする時間がありました。上記の答えは、すべてに対する最初の答えとしてシェーダーを使用する私の習慣を反映していますが、この場合、それらは実際には必要ではなく、それらの使用は不必要に物事を複雑にします。
私が提案したように、カスタムBlendStateを使用してまったく同じ効果を達成できます。具体的には、このカスタムBlendState:
BlendState Multiply = new BlendState()
{
AlphaSourceBlend = Blend.DestinationAlpha,
AlphaDestinationBlend = Blend.Zero,
AlphaBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.DestinationColor,
ColorDestinationBlend = Blend.Zero,
ColorBlendFunction = BlendFunction.Add
};
ブレンド方程式は
result = (source * sourceBlendFactor) blendFunction (dest * destBlendFactor)
カスタムBlendStateを使用すると、
result = (lightmapColor * destinationColor) + (0)
つまり、純粋な白(1、1、1、1)のソースカラーは目的色を保持し、純粋な黒(0、0、0、1)のソースカラーは目的色を純粋な黒に暗くし、中間のグレーのシェードは、中間の量だけ目的の色を暗くします。
これを実行するには、まず、ライトマップを作成するために必要なことをすべて実行します。
var lightmap = GetLightmapRenderTarget();
次に、通常どおりバックライトに照明のないシーンを直接描画します。
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
/* draw the world here */
spriteBatch.End();
次に、カスタムBlendStateを使用してライトマップを描画します。
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();
これにより、デスティネーションの色(点灯していないタイル)にソースの色(ライトマップ)が掛けられ、点灯していないタイルが適切に暗くなり、ライトマップテクスチャが必要なサイズに拡大された結果としてグラデーション効果が作成されます。