允许玩家“染色”图像而不损失色彩质量的最佳方法?


41

我正在创建一个2.5D等距(2D图像)游戏。

我希望玩家能够“染色”他们的盔甲,衣服和其他东西。我发现对所有事物进行灰度缩放会导致某些“更自然”的着色丢失。例如,制作具有红色/黄色灰度的龙,然后应用覆盖颜色,将导致纯红色龙,而所有辅助颜色都将丢失。同时,染上相同的红色/黄色龙蓝色,使其看起来很不错。

我游戏中的角色没有各种各样的设备。游戏更接近《英雄联盟》如何处理角色和图形。角色可能只有一种类型(例如,英雄),但角色可以有多种服装作为选择。我希望玩家能够在有限数量的“服装”和角色中进行尽可能多的自定义。

因此,我希望玩家能够选择角色,选择几种武器之一,在少数服装选择之间交替(分层放置在角色上),然后将大部分东西都染上颜色(为武器选择特定的金属色,选择任何颜色根本没有服装)。

如果我能够使用灰度而不丢失某些颜色,那我会。

这是关于我在说什么的示例:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

不管我在Photoshop的“颜色叠加”选项中使用什么,都不可能“染色” Dragon。显然,如果可以使用灰度更好地为其着色,那我做错了。对于绿色或黄色或较浅的紫色,可以正常工作。对于任何其他颜色,它都破坏了艺术品。

但是,如果我不对其进行灰度处理,则看起来要好得多,而只需对原始(红色/黄色)图像应用“色调”颜色即可。

红色调 在此处输入图片说明

紫色色调 在此处输入图片说明

现在,玩家可以将Dragon ANY染成彩色,并且看起来仍然很棒!(黄色变成白色,而红色变成彩虹的任何颜色。)

这是否意味着WHITE或BLACK是最好的辅助色?然后使用某种方法或着色器将白色(辅助)颜色更改为其他颜色?

是否有任何文章介绍这种拍摄单个图像的复杂方法,并根据着色方法对不同像素进行染色?

对于龙来说,它最适合作为白色/黑色高对比度龙吗?红色/黄色是最佳颜色设置吗?事实证明,图像比我尝试过的其他几种颜色要好得多。灰度仍然优越吗?

Photoshop的“混合选项”是否不包括为视频游戏适当地“染色”图像的方法?是否有复杂的着色器/方法可以使我获得更大的成功?

注意:如果GrayScale允许我减少图像的RAM消耗,或防止有损压缩过程中的质量损失,那是我会认真考虑的事情。


5
这是很有趣的。我会投票支持,希望它能引起更多关注。颜色理论是一个伟大的话题。
2013年

色相旋转是可能的,尽管是2D的-我不知道它是否可以在3D中使用。
ashes999

谢谢你埃文。我也同意这是非常有趣的,并且是我自己研究的最佳主题之一。我想这种类型的工作很少完成,因为它将需要一位艺术家-但不仅是任何一位艺术家-从事色彩理论,视频游戏着色器甚至是艺术家编码的艺术家。我只能想象找到一个在艺术和编程方面都出色的人是很少的。谷歌上几乎没有关于此主题的研究。特别是对于不知道要研究哪些关键术语的人。我当然不是艺术家。
Carter81 2013年

Answers:


19

色相偏移是一种可能使您获得多种颜色而又不会丢失颜色细节的可能性。基本思想是将每个像素从RGB转换为HSV空间,然后将色相偏移用户定义的量,然后转换回RGB。实际上,可以通过将旋转矩阵应用于RGB值来更有效地完成此操作:创建一个矩阵,该矩阵绕(1、1、1、1)轴旋转用户定义的色相角。然后,您可以简单地将此矩阵应用于像素着色器中的每个RGB值。

这将使红黄龙转变为黄绿,绿青,青蓝,蓝洋红或洋红红龙。这有点限制,因为无法使用此方法单独更改两种颜色。它们将保持原始图像中的相对色相。还有一些您无法访问的颜色,例如,您不能以这种方式制作黑白龙。不过,这可能足以满足您的目的。

另一种可能性是,如果您的模型具有两个或三个“关键色”(此处为红色和黄色),则可以为每个关键色使用单独的颜色通道创作原始图像。在这种情况下,您将创作红色和绿色的龙,而不是红色和黄色的龙,如果您有第三种颜色,则可以将其创作为蓝色。然后,您可以让用户选择这三种关键色,并使用图像中的红色,绿色和蓝色值作为这些用户定义的颜色进行混合。因此,像素着色器看起来像

finalColor = image.r * userColor1 + image.g * userColor2 + image.b * userColor3;

这将使用户可以选择他们想要的任何颜色组合,包括黑白或紫色和金色。


1
+1不仅是一个很好的答案,而且是一个稀有主题(色彩理论)的答案。我不知道为什么我以前没有想到这一点。RGB。红色绿色蓝色。H!由于能够操纵各个通道,因此最好使用的颜色可能是确切的三种颜色。
Carter81 2013年

1
色彩偏移是一个非常困难的话题,因为大多数图像信息是通过亮度传达的,而简单的色调偏移并不能保持亮度。不同的色调具有不同的固有亮度值。您需要更复杂的算法。
API-Beast

10

您面临的问题是您不能简单地“着色”整个图像,所看到的外观不仅仅是基色。对于一种,您可以从一种材料到另一种材料具有精细的渐变,但更重要的是,您还具有不受基色影响的反射,高光和阴影。(这些基本上是在其顶部添加的。)

因此,您需要将图像分解为其组件。

一个例子

解构图像 有色例子

在这种情况下,我们分为3层:

  • 背景-包含不应上色的元素。
  • 应该上色的部分-这乘以颜色。(如果您指定的颜色不是白色,则OpenGL默认会相乘。)
  • 高光-在整个图像上绘制高光。模仿色调变化,不是白色而是黄色。物体不仅是单一的颜色,色调还会随着亮度而变化。

+1。但是“您不能简单地“着色”整个图像”有点误导。这完全取决于他的比赛的OP选择。例如《暗黑破坏神II》就是这样做的。因此,我对“您不能/您需要”部分不那么严格。这只是选项之一,外观更好,但消耗的内存更多。
Kromster说支持Monica

1
@KromStern Point是,如果您这样做总是看起来很糟糕。
API-Beast

好答案。但是,通过自动化是否有可能?如果一个角色有成千上万的动画图像,则手动选择每一层或一次分解图像是不可行的。不过,如果使用遮罩从3D进行渲染,我仍然可以看到一些解决方法来帮助实现自动化,但是无论如何,这仍然是一个很好的答案。
Carter81

通过找到主要颜色并提取它们(通过使用反向的“颜色转换为alpha”算法),有可能实现自动化。但这并不是我曾经实现过这样的事情。
API-Beast

要提取高光,您可以使用以前提取的蒙版并对其进行过滤,以便仅剩下最亮的组件。
API-Beast

3

我个人建议使用蒙版纹理来实现所需的效果。这将确保您的主要RGB24纹理将保持其原始颜色质量,而不会牺牲任何精度。它还将为您提供大量的艺术自由,可将您的主要纹理与颜色蒙版融合在一起。

可以将每个蒙版视为灰度纹理,它将以自定义颜色线性插值基础纹理的颜色。假设您要让用户自定义两种颜色,像素着色器将如下所示:

输入:MainTexture(RGB),Mask1Texture(A),Mask2Texture(A),Colour1(float),Colour2(float)

输出:(Mask1Texture + Mask2Texture)-MainTexture + Colour1 * Mask1Texture + Colour2 * Mask2Texture

这表明遮罩对一个像素的取值越大,则主纹理对该像素的输出颜色的影响就越小。例如,您可以将龙的纹理转换为灰度,并擦除除翅膀以外的所有物体,以使车身颜色自定义,无论车身颜色如何。

我已经将此技术用于手机游戏,并且不会影响您的整体性能。每个纹理可能会使您的RAM增加33%,但是在质量上进行权衡可能是值得的。

Ps如果只考虑使用一种自定义颜色,则可以简单地使用RGBA32主纹理的Alpha通道作为蒙版。


2

您可以使用调色板,并让播放器编辑调色板。如果使用着色器,则可以将1D纹理用作调色板,将原始灰度值用作索引。

要将真彩色图像转换为255种颜色的图像,可以使用k均值算法将所有像素颜色值并在3d颜色空间中将它们分组为255个群集。或使用通用图像转换工具。然后重要的是要提到,灰度值纹理的插值将是颜色纹理中索引的插值。这会导致结果,在原始图像的两个纹理像素之间有几种颜色。这可以通过禁用插值(我想您不想这样做)或以一种有用的方式对调色板进行排序来解决。


这基本上也是我的想法。您可能需要将答案扩展到更完整的内容。基本上,您让用户选择两种颜色(或多或少,但为了论证2而已),使一维纹理从两种颜色中淡出。在几何图形上使用灰度纹理作为一维纹理的参考。用户仍然可以设置难看的颜色,但是他们至少可以选择做出漂亮的对比颜色选择。
wrosecrans 2014年

是的,您还可以从较少的用户颜色中得出完整的255个调色板,但是在这里,我只能建议您尝试一下。我知道很多旧游戏都使用调色板中的更改来改变怪物。我认为暗黑破坏神做到了。
Arne 2014年

1

您可以将图像转换为灰色图像,但仍使用rgba通道保存它。在Alpha通道中存储一个权重值,然后使用该值来确定要应用于像素的染料数量。可以根据颜色与白色的接近程度来计算此权重。像素越接近白色,应施加的染料越少或重量越轻。这将使大多数高光保留其原始亮度,但会对其应用一些染料。然后可以通过计算每个通道Ro +(Rd * Ao)来找到最终的像素颜色,其中Ro是原始红色,Rd是染料颜色中的红色,Ao是原始颜色的Alpha。因此所有白色像素都不会获得新颜色,所有黑色像素都将呈现染料颜色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.