【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; }