我目前正在开发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)
结果如下:
并没有那么糟糕,还算平滑,但是在游戏中还没有足够的可见性……但是我希望能够控制厚度(使其变大),并在将其渐变为alpha之前添加第一个不透明的轮廓(以使它更明显)。而且我觉得高斯模糊可能不如我想的那样好:)
另一个想法是从.png自动生成它(使用photoshop脚本使其自动生成)。我只需要用自定义颜色填充轮廓像素,例如将alpha值存储在Red组件中,然后将所有其他组件设置为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压缩,因此我无法确定要在着色器中获得的颜色是否与我编写的颜色完全相同。这就是为什么我什至没有尝试...有什么想法吗?
任何的建议都受欢迎 :)