2

在我的基于 2D 瓷砖的游戏中,玩家可以绘制瓷砖来改变那里的颜色。简单的方法(以及我已经做过的)是tint使用SpriteBatch.Draw.

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

在此处输入图像描述

但是说,我想把木头漆成白色。如果您曾经弄乱过色调,您就会知道使用 tint 参数是不可能的。Color.White会将精灵着色为默认颜色,而不是白色。这不是一个大问题,但我想有些用户可能想要它。

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

http://gyazo.com/eaa8d54d82a15ce05b006b084e71803f.png

一个明显的方法是在 GIMP 中使用这个函数,然后只导出每种颜色的精灵。问题在于,这对我所有的精灵都需要很长时间才能完成,而且每个精灵都有多种变化,这意味着你可以为一种块类型总共拥有 100 多个组合。

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

4

2 回答 2

4

GIMP 中的“colorify”功能只是进行去饱和(转换为灰度),然后进行颜色相乘。非常简单。这应该是等效的 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着色器进行乘法来实现相同的效果。如果您不想修改源艺术,可以在自定义内容处理器中进行。


虽然,如果你想使用自定义着色器,你可以做一些更复杂的事情。您可以实现完整的色调旋转(有点复杂)。但也许您可以考虑类似“叠加”混合模式(非常简单) - 它可以让您对灰色进行着色,同时保留高光和低光(而不是乘法,这也会使高光着色)。

于 2013-09-02T15:44:07.753 回答
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](半透明且偏红)

于 2013-09-03T06:42:13.643 回答