現在2Dゲームに取り組んでおり、現在の仕事は選択したオブジェクトの輪郭を描くことです。
基本的にぼかしシェーダーを使用して完全に実行します。最初に垂直ガウスぼかしシェーダーを使用してスプライトを描画し、次に水平ガウスぼかしシェーダーを使用してスプライトを描画してから、通常どおりスプライトを描画します。
これが私のぼかしシェーダーです:sampler TextureSampler:register(s0);
#define SAMPLE_COUNT 15
float2 SampleOffsets[SAMPLE_COUNT];
float SampleWeights[SAMPLE_COUNT];
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c = 0;
// Combine a number of weighted image filter taps.
for (int i = 0; i < SAMPLE_COUNT; i++)
{
c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
}
return c;
}
SampleOffetsは、丸めピクセルをテストできるオフセットです。SampleWeightsは、ガウス関数(http://en.wikipedia.org/wiki/Gaussian_blur)で計算された重みです。
結果は次のとおりです。
それはそれほど悪くはなく、非常に滑らかですが、ゲームでは十分に見えません...しかし、厚さを制御して(大きくして)、アルファでフェードする前に(不透明にするために)最初の不透明なアウトラインを追加したいと思います。それはもっと見えます)。そして、ガウスぼかしは私の仕事について思ったほど良くないかもしれません:)
もう1つのアイデアは、.pngから自動的に生成することです(フォトショップスクリプトを使用して自動化します)。アウトラインピクセルをカスタムカラーで塗りつぶし、たとえばアルファ値を赤コンポーネントに格納し、他のすべてのコンポーネントを0に設定するだけです。次に、透明なピクセルを目的の色に置き換えるシェーダーを適用するだけです。
float4 PixelShaderFunction2(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 color = tex2D(TextureSampler, texCoord);
float4 newColor = 0;
if (color.a == 0 && color.r != 0)
{
color.a = color.r;
// Blue outline
color.b = 1;
}
}
問題は、スプライトにDXT5圧縮を使用しているため、シェーダーで取得する色が、書いたものとまったく同じになるかどうか確信が持てないことです。だから私も試さなかったのですが…。
どんなアドバイスでも大歓迎です:)