【Unity】正片叠底色/屏幕色

最終更新: 2020年5月19日

通过将正片叠底色和屏幕色应用于模型,可以实时更改色调。
通过使用Cubism 4.2或更高版本的SDK for Unity,无需任何追加编码即可应用Cubism Editor上设置的正片叠底色和屏幕色。
关于Cubism Editor上的正片叠底色和屏幕色的设置,请参考Editor手册中的“正片叠底色/屏幕色”。

另外,根据需要进行编码,可以从SDK中操作正片叠底色和屏幕色,也可以进行如下操作。

  • 交互式应用正片叠底色/屏幕色
  • 应用未在Cubism Editor上设置的正片叠底色/屏幕色
  • 禁用Cubism Editor上设置的正片叠底色/屏幕色

以下是该步骤的说明。

处理步骤

按照以下流程处理。

  • 模型置入
  • 正片叠底色/屏幕色覆盖标志设置
  • 正片叠底色/屏幕色设置

模型置入

将要设置正片叠底色和屏幕色的模型置入任意场景中。

正片叠底色/屏幕色覆盖标志设置

将正片叠底色/屏幕色覆盖标志设置为true。
默认为false,它使用模型中的颜色信息。

覆盖标志有2种类型:[CubismRenderController]的全体模型的标志和[CubismRenderer]的各Drawable物体的标志。

示例代码如下所示。
假设脚本作为组件附加到模型的根物体。

// Get CubismRenderController Component
CubismRenderController renderController = GetComponent<CubismRenderController>();

// Manipulate flags across the entire model.
renderController.OverwriteFlagForModelMultiplyColors = true;
renderController.OverwriteFlagForModelScreenColors = true;

// Manipulation of individual Drawable flags.
renderController.Renderers[0].OverwriteFlagForMultiplyColors = true;
renderController.Renderers[0].OverwriteFlagForScreenColors = true;

启用应用于全体模型的覆盖标志时,即使应用于个别Drawable的覆盖标志无效,也可以从SDK操作正片叠底色和屏幕色。

[CubismRenderController]作为组件追加到模型的根物体中,可以通过GetComponent获取。
[CubismRenderController]还在一个数组中保留了模型中各Drawable物体的[CubismRenderer],并且可以从[CubismRenderController]中参考各[CubismRenderer]。

正片叠底色/屏幕色设置

定义正片叠底色和屏幕色,并在模型中设置它们。
在下面的代码中,它是对所有Drawable设置红色为正片叠底色,设置绿色为屏幕色时的设置值。
各设置颜色作为UnityEngine.Color类型存储在[CubismRenderer]中。
在下面的例子中,设置了RGBA,但A不用于计算正片叠底色和屏幕色。

var multiplyColor = new Color(1.0f, 0.5f, 0.5f, 1.0f);
var screenColor = new Color(0.0f, 0.5f, 0.0f, 1.0f);

for (var i = 0; i < RenderController.Renderers.Length; i++)
{
    // MultiplyColor
    renderController.Renderers[i].MultiplyColor = multiplyColor;
    // ScreenColor
    renderController.Renderers[i].ScreenColor = screenColor; 
 }


正片叠底色/屏幕色应用之前

应用红色作为正片叠底色、绿色作为屏幕色后

当颜色信息发生变更时,模型正片叠底色/屏幕色处理将在所有Drawable中更新。

Tips

此次为所有Drawable设置了相同的正片叠底色和屏幕色,但也可以为各Drawable设置不同的正片叠底色和屏幕色。
禁用正片叠底色/屏幕色时,需设置为

正片叠底色(1.0、1.0、1.0、1.0)
屏幕色(0.0、0.0、0.0、1.0)。

其他相关函数/处理

从模型端接收正片叠底色/屏幕色更新的通知

如果模型参数与正片叠底色/屏幕色变更相关联,则可以在模型动画等时从模型端变更正片叠底色/屏幕色,而不是从SDK端操作。

[CubismDynamicDrawableData]中实装了IsBlendColorDirty,这个属性可以接收此时正片叠底色和屏幕色的变更。

该属性是在模型侧变更正片叠底色或屏幕色时设置的标志,它不判断变更正片叠底色、还是屏幕色。

为了处理[CubismDynamicDrawableData]的数据,需要使用[CubismModel]的Event——OnDynamicDrawableData。

函数注册

// Model
CubismModel model;

// Register listener.
model.OnDynamicDrawableData += OnDynamicDrawableData;


注册函数示例

private void OnDynamicDrawableData(CubismModel sender, CubismDynamicDrawableData[] data)
{
    for (int i = 0; i < data.Length; i++)
    {
        if (data[i].IsBlendColorDirty)
        {
            Debug.Log(i + ": Did Changed.");
        }
    }
}

正片叠底色/屏幕色在着色器中的应用

如果您想通过自定义着色器使用正片叠底色/屏幕色,您需要追加一些实装。
在使用[CubismRenderer]和[CubismRenderController]时,可以通过在着色器中追加如下属性和处理来轻松实装。

[PerRendererData] cubism_MultiplyColor("Multiply Color", Color) = (1.0, 1.0, 1.0, 1.0)
[PerRendererData] cubism_ScreenColor("Screen Color", Color) = (0.0, 0.0, 0.0, 1.0)
sampler2D _MainTex;
fixed4 cubism_MultiplyColor;
fixed4 cubism_ScreenColor;

CUBISM_SHADER_VARIABLES
fixed4 frag (v2f IN) : SV_Target
{
  fixed4 textureColor = tex2D(_MainTex, IN.texcoord);

  // Multiply
  textureColor.rgb *= cubism_MultiplyColor.rgb;

  // Screen
  textureColor.rgb = (textureColor.rgb + cubism_ScreenColor.rgb) - (textureColor.rgb * cubism_ScreenColor.rgb);

  fixed4 OUT = textureColor * IN.color;

  // Apply Cubism alpha to color.
  CUBISM_APPLY_ALPHA(IN, OUT);

  return OUT;
}
关于本报道,敬请提出您的意见及要求。