正片叠底色/屏幕色(UE)

最終更新: 2024年9月5日

此页面包含有关Alpha版的描述。

概述

通过将正片叠底色和屏幕色应用于模型,可以实时更改色调。

通过使用Cubism SDK for Unreal Engine,无需任何追加编码即可应用在Cubism Editor上设置的正片叠底色和屏幕色。
关于Cubism Editor上的正片叠底色和屏幕色的设置,请参考Editor手册中的“正片叠底色/屏幕色”。

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

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

以下是该步骤的说明。

正片叠底色/屏幕色的操作步骤

您可以按模型、部件、图形网格三种单位操作正片叠底色和屏幕色。
为每个层提供了正片叠底色和屏幕色属性。

与要操作的对象对应的属性如下。

  • 按模型单位操作时:CubismModelComponent的属性
  • 按部件单位操作时:CubismPartComponent的属性
  • 按图形网格单位操作时:CubismDrawableComponent的属性

下面展示了CubismModelComponent中的相关属性。

UCLASS(Blueprintable)
class LIVE2DCUBISM_API UCubismModelComponent : public USceneComponent
{
	GENERATED_BODY()

public:

...

	UPROPERTY(EditAnywhere, Category = "Live2D Cubism")
	bool OverwriteFlagForModelMultiplyColors;

	UPROPERTY(EditAnywhere, Category = "Live2D Cubism")
	FLinearColor MultiplyColor = FLinearColor::White;

	UPROPERTY(EditAnywhere, Category = "Live2D Cubism")
	bool OverwriteFlagForModelScreenColors;

	UPROPERTY(EditAnywhere, Category = "Live2D Cubism")
	FLinearColor ScreenColor = FLinearColor::Black;

...

}
TIPS

默认情况下,正片叠底色设置为白色,屏幕色设置为黑色。

选中覆盖标志

为了通过SDK操作正片叠底色和屏幕色,为各模型、部件和图形网格提供的正片叠底色和屏幕色覆盖标志必须设置为true。
请注意,默认设置为false。

与每个层级对应的覆盖标志如下。

  • 模型(CubismModelComponent)
    • OverwriteFlagForModelMultiplyColors
    • OverwriteFlagForModelScreenColors
  • 部件(CubismPartComponent)
    • OverwriteFlagForPartMultiplyColors
    • OverwriteFlagForPartScreenColors
  • 图形网格(CubismDrawableComponent)
    • OverwriteFlagForDrawableMultiplyColors
    • OverwriteFlagForDrawableScreenColors

可以在Editor和代码中作为相同的属性进行访问。

操作值

如果选中覆盖标志,则可以通过变更为各模型、部件和图形网格提供的MultiplyColorScreenColor值来操作各单元中的正片叠底色和屏幕色。
如果要禁用正片叠底色,请将MultiplyColor设置为白色,如果要禁用屏幕色,请将ScreenColor设置为黑色。

变更后的值将通过CubismRendererComponent的内部处理以如下形式应用在绘制中。

MultiplyColorScreenColor仅参考RGB值,Alpha值不用于绘制。

for (auto Drawable : Drawables)
{
	UMaterialInstanceDynamic* MaterialInstance = static_cast<UMaterialInstanceDynamic*>(Drawable->GetMaterial(0));

	UTexture2D*  MainTexture   = Drawable->TextureIndex < Model->Textures.Num()? Model->Textures[Drawable->TextureIndex] : nullptr;
	FLinearColor BaseColor     = Drawable->BaseColor;
	FLinearColor MultiplyColor = Drawable->MultiplyColor;
	FLinearColor ScreenColor   = Drawable->ScreenColor;

	{
		if (Model->OverwriteFlagForModelMultiplyColors)
		{
			MultiplyColor = Model->MultiplyColor;
		}

		if (Model->OverwriteFlagForModelScreenColors)
		{
			ScreenColor = Model->ScreenColor;
		}
	}

	if (UCubismPartComponent* ParentPart = Model->GetPart(Drawable->ParentPartIndex))
	{
		if (ParentPart->OverwriteFlagForPartMultiplyColors)
		{
			MultiplyColor = ParentPart->MultiplyColor;
		}
		
		if (ParentPart->OverwriteFlagForPartScreenColors)
		{
			ScreenColor = ParentPart->ScreenColor;
		}
	}

	BaseColor.A *= Model->Opacity * Drawable->Opacity;

	MaterialInstance->SetTextureParameterValue("MainTexture", MainTexture);
	MaterialInstance->SetVectorParameterValue("BaseColor", BaseColor);
	MaterialInstance->SetVectorParameterValue("MultiplyColor", MultiplyColor);
	MaterialInstance->SetVectorParameterValue("ScreenColor", ScreenColor);
}

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。