Answers:
到目前为止,最简单的方法(最好是最好的方法,除非您真的为性能而苦恼)是拥有两个Sprite。
使用“胖”版本绘制整个对象,然后在顶部绘制常规版本。
通过将“胖”版本设为白色,可以使用SpriteBatch的内置颜色着色来动态更改选择颜色。
为了生成您的“胖子”版本,我建议编写一个内容管道扩展程序,该扩展程序可以自动获取原始精灵,读取其Alpha通道,通过对原始图像中的最大Alpha通道进行采样(每个像素周围X个像素)来创建新的Alpha通道,并设置RGB =(1,1,1)。
您必须确保所有精灵都具有足够的透明边框以添加轮廓(您可以在内容处理器中进行检查-必要时甚至腾出空间)。
如果只有几个精灵,则可以使用一个好的图像编辑器(GIMP,Photoshop)并手动完成:将Alpha通道选区,扩展选区,将选区设置为Alpha,将颜色通道填充为白色。
根据要求,可能仅对子画面按需创建轮廓也可能有效。我假设您的精灵具有透明性,并且形状不规则,而不仅仅是矩形(虽然这样做会很好,但轮廓矩形应该是平凡的)。
when selected:
outline = new sprite canvas of appropriate size
for sprite in object:
# use larger numbers for thicker outlines
for x in (-1, 0, 1) and y in (-1, 0, 1):
render sprite mask into canvas at x,y with desired color
请注意,您不需要每次绘制都执行此操作(尽管我想可以这样做),而只是在切换精灵时创建新的轮廓精灵。
最简单的暴力方法是为每个精灵创建两个副本,一个是普通副本,另一个是突出显示的副本。然后在突出显示时交换它们。
如果您有足够的存储空间,则无需变得更加复杂。加上突出显示的艺术家,您可以完全控制外观,因此您可以绘制轮廓或其他任何想要的东西。
每个精灵还有另一个精灵,它是基本精灵的轮廓。绘制轮廓对象时,请绘制基本精灵,然后对组合渲染进行遮罩,然后绘制不包括遮罩的轮廓精灵。
几种具有不同权衡取舍的解决方案。
最简单:使用平面颜色多次渲染对象并抖动位置(向左,向上,向下,向右等偏移),这将为您在其上渲染的任何内容创建轮廓版本,但会降低性能,并且不会允许边框很胖,而没有很多额外的渲染。一个或两个像素边框可以使用4倍分辨率。
最快:对纹理进行预处理,并具有已经加边框的副本,或者仅仅是边框,或者是可以在着色器中着色的纯灰度8位蒙版。这可能会很快而以内存为代价。
最佳:我认为,但是生成对象的符号距离场(SDF)表示可能是最佳解决方案。这些纹理可以比源纹理小得多,并且仍可以捕获有用的数据。本质上,每个像素都将其编码成与用于生成它的对象有多远。有了这些数据,您可以编写从发光到轮廓的各种效果。边框可能会改变大小和颜色等,并且仍然是一个相对便宜的着色器,并且只能绘制一次。缺点是工具和预处理。
我不确定效率,但我能看到的最简单的方法是以您要首先选择的颜色绘制较大版本的精灵。在其上绘制精灵。您只会看到第一个精灵的边缘,从而产生选择效果。
编辑:但是,正如您从评论中看到的那样,这不是一个好主意。
我同意扩大精灵的规模。到目前为止,这是最简单的方法,您可以将其应用于选择任何sprite,而不必为此专门创建其他sprite。
用轮廓颜色替换原始精灵的颜色(或者根据需要着色)。以1个像素的偏移量四次渲染此平面着色或着色的精灵:x,y =(-1,-1),然后(+ 1,-1),然后(-1,+ 1)然后(+1) ,+ 1)。对组成对象的所有子画面重复上述步骤。
之后,以适当的顺序在(0,0)的顶部渲染原始精灵。