不要着色,而是“着色”精灵

时间:2013-09-01 17:06:58

标签: c# colors xna shader tint

在我基于2D平铺的游戏中,玩家可以绘制瓷砖以改变颜色。简单的方法(以及我已经完成的工作)是使用tint中的SpriteBatch.Draw参数。

这看起来不错,这是一个例子:

enter image description here

但是说,我想画木白。如果你曾经搞过色调,你就知道使用tint参数是不可能的。 Color.White会将精灵色调为默认颜色,而不是白色。这不是一个主要问题,但我想有些用户可能会想要它。

我的问题是,有没有一种方法可以根据色调/饱和度而不是色调来对精灵进行着色。与GIMP中的“colorify”功能类似。

http://gyazo.com/eaa8d54d82a15ce05b006b084e71803f.png

一种明显的方法是在GIMP中使用此功能,并为每种颜色导出精灵。麻烦在于,这将永远为我的所有精灵做,并且每个精灵都有多种变化,这意味着你可以为一种块类型提供总共100多个组合。

这可能吗?我想一个着色器可能会完成工作。

2 个答案:

答案 0 :(得分:4)

GIMP中的“colourify”功能只是进行去饱和(转换为灰度),然后进行颜色倍增。非常简单。这应该是等效的HLSL(未经测试):

float4 original = tex2d(...);
float q = (original.r + original.g + original.b) / 3;
q /= original.a; // optional - undo alpha premultiplication
return float4(tint.rgb * q, tint.a * original.a);

但是你可以通过简单地存储所有去饱和的纹理并使用默认的SpriteBatch着色器进行乘法来实现相同的效果。如果您不想修改源图片,可以在自定义内容处理器中执行此操作。


虽然,如果你想使用自定义着色器,你可以做一些更复杂的事情。你可以实现一个完整的色调 - 旋转(有点复杂)。但也许你可以考虑类似"Overlay" blend mode(非常简单)的东西 - 它可以让你对灰色进行着色,同时保留高光和低光(而不是乘法,也会使高光变色)。

答案 1 :(得分:1)

继续使用SPriteBatch.Draw中的色调。只需使您的“可绘制”纹理灰度。因此,白色木材将是您的默认设置,但您可以使用带有木材颜色的色调绘制它。

我经常使用它来制作UI和团队着色:)

如果有趣的话,色调的作用就是将纹理中的每个像素乘以你选择的颜色。

例如:
纹理像素是(rgba)[1.0,0.5,0.5,1.0]
色调是[1.0,0.5,0.5,0.5]
结果是[1.0,0.25,0.25,0.5](半透明,红色更多)

相关问题