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

最終更新: 2025年5月15日

通过将正片叠底色和屏幕色应用于模型,可以实时更改色调。
通过使用Cubism 4.2或更高版本的Cubism Java Framework,无需任何追加编码即可应用Cubism Editor上设置的正片叠底色和屏幕色。
关于Cubism Editor上的正片叠底色和屏幕色的设置,请参考Editor手册中的“正片叠底色/屏幕色”。
另外,根据需要进行编码,可以从SDK中操作正片叠底色和屏幕色,也可以进行如下操作。

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

以下是该步骤的说明。

处理步骤

按照以下流程处理。

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

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

首先,将正片叠底色/屏幕色覆盖标志设置为true。默认为false。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
model.getModel().setOverrideFlagForModelMultiplyColors(true); // 正片叠底色覆盖标志
model.getModel().setOverrideFlagForModelScreenColors(true); // 屏幕色覆盖标志
model.getModel().setOverrideFlagForModelMultiplyColors(true); // 正片叠底色覆盖标志 model.getModel().setOverrideFlagForModelScreenColors(true); // 屏幕色覆盖标志
model.getModel().setOverrideFlagForModelMultiplyColors(true); // 正片叠底色覆盖标志
model.getModel().setOverrideFlagForModelScreenColors(true); // 屏幕色覆盖标志

public void setOverrideFlagForModelMultiplyColors(boolean value)和public void setOverrideFlagForModelScreenColors(boolean value)在Framework的CubismModel类中定义。
Cubism SDK for Java的范例项目定义了一个以CubismModel为基类的LAppModel类来操作模型,上述代码中的model是LAppModel类的一个副本。
它以getModel()为中介从LAppModel类调用CubismModel类的方法。

正片叠底色/屏幕色设置

定义正片叠底色和屏幕色,并在模型中设置它们。
在下面的代码中,它是对所有Drawable设置红色为正片叠底色,设置绿色为屏幕色时的设置值。
RGBA可用作设置颜色。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
for (int i = 0; i < model.getModel().getDrawableCount(); i++) {
CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色
multiplyColor.r = 1.0f;
multiplyColor.g = 0.5f;
multiplyColor.b = 0.5f;
multiplyColor.a = 1.0f;
CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色
screenColor.r = 0.0f;
screenColor.g = 0.5f;
screenColor.b = 0.0f;
screenColor.a = 1.0f;
model.getModel().setMultiplyColor(i, multiplyColor);
model.getModel().setScreenColor(i, screenColor);
}
for (int i = 0; i < model.getModel().getDrawableCount(); i++) { CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色 multiplyColor.r = 1.0f; multiplyColor.g = 0.5f; multiplyColor.b = 0.5f; multiplyColor.a = 1.0f; CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色 screenColor.r = 0.0f; screenColor.g = 0.5f; screenColor.b = 0.0f; screenColor.a = 1.0f; model.getModel().setMultiplyColor(i, multiplyColor); model.getModel().setScreenColor(i, screenColor); }
for (int i = 0; i < model.getModel().getDrawableCount(); i++) {
    CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色
    multiplyColor.r = 1.0f;
    multiplyColor.g = 0.5f;
    multiplyColor.b = 0.5f;
    multiplyColor.a = 1.0f;

    CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色
    screenColor.r = 0.0f;
    screenColor.g = 0.5f;
    screenColor.b = 0.0f;
    screenColor.a = 1.0f;

    model.getModel().setMultiplyColor(i, multiplyColor);
    model.getModel().setScreenColor(i, screenColor);
}

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

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

通过模型的DrawableCount进行循环处理,每帧为所有Drawable处理正片叠底色和屏幕色。

Tips

此次为所有Drawable设置了相同的正片叠底色和屏幕色,但也可以为各Drawable索引设置不同的正片叠底色和屏幕色。 参数i是Drawable索引。

要使Cubism Editor上设置的正片叠底色/屏幕色无效,请将正片叠底色设置为 0、将屏幕色设置为 1。如果设置,它将是每个的初始值。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色
multiplyColor.r = 1.0f;
multiplyColor.g = 1.0f;
multiplyColor.b = 1.0f;
multiplyColor.a = 1.0f;
CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色
screenColor.r = 0.0f;
screenColor.g = 0.0f;
screenColor.b = 0.0f;
screenColor.a = 1.0f;
CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色 multiplyColor.r = 1.0f; multiplyColor.g = 1.0f; multiplyColor.b = 1.0f; multiplyColor.a = 1.0f; CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色 screenColor.r = 0.0f; screenColor.g = 0.0f; screenColor.b = 0.0f; screenColor.a = 1.0f;
CubismRenderer.CubismTextureColor multiplyColor = new CubismRenderer.CubismTextureColor(); // 正片叠底色
multiplyColor.r = 1.0f;
multiplyColor.g = 1.0f;
multiplyColor.b = 1.0f;
multiplyColor.a = 1.0f;

CubismRenderer.CubismTextureColor screenColor = new CubismRenderer.CubismTextureColor(); // 屏幕色
screenColor.r = 0.0f;
screenColor.g = 0.0f;
screenColor.b = 0.0f;
screenColor.a = 1.0f;

模型绘制

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
model.draw(projection);
model.draw(projection);
model.draw(projection);

通过调用Cubism SDK for Java的范例项目中最初执行的模型的draw()函数,由Cubism JavaFramework内部的渲染处理绘制包含正片叠底色和屏幕色的模型。

其他相关函数

获取正片叠底色/屏幕色覆盖标志

若返回值为true,则SDK中设置的颜色信息优先;如果为false,则模型的颜色信息优先。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public boolean getOverrideFlagForModelMultiplyColors(){...} // 获取模型全体的正片叠底色覆盖标志
public boolean getOverrideFlagForScreenColors(){...} // 获取模型整体的屏幕色覆盖标志
public boolean getOverrideFlagForModelMultiplyColors(){...} // 获取模型全体的正片叠底色覆盖标志 public boolean getOverrideFlagForScreenColors(){...} // 获取模型整体的屏幕色覆盖标志
public boolean getOverrideFlagForModelMultiplyColors(){...}   // 获取模型全体的正片叠底色覆盖标志
public boolean getOverrideFlagForScreenColors(){...}   // 获取模型整体的屏幕色覆盖标志

您还可以为每个Drawable获取单独的覆盖标志。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public boolean getOverrideFlagForDrawableMultiplyColors(int drawableIndex){...} // 获取指定索引的Drawable的正片叠底色覆盖标志
public boolean getOverrideFlagForDrawableScreenColors(int drawableIndex){...} // 获取指定索引的Drawable的屏幕色覆盖标志
public boolean getOverrideFlagForDrawableMultiplyColors(int drawableIndex){...} // 获取指定索引的Drawable的正片叠底色覆盖标志 public boolean getOverrideFlagForDrawableScreenColors(int drawableIndex){...} // 获取指定索引的Drawable的屏幕色覆盖标志
public boolean getOverrideFlagForDrawableMultiplyColors(int drawableIndex){...}   // 获取指定索引的Drawable的正片叠底色覆盖标志
public boolean getOverrideFlagForDrawableScreenColors(int drawableIndex){...}   // 获取指定索引的Drawable的屏幕色覆盖标志

正片叠底色/屏幕色设置

上面描述了以CubismRenderer.CubismTextureColor作为参数的设置方法,但也有可以直接设置RGBA的方法。(输入值 0.0~1.0)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public void setMultiplyColor(int drawableIndex, float r, float g, float b, float a){...} // 正片叠底色设置
public void setScreenColor(int drawableIndex, float r, float g, float b, float a){...} // 屏幕色设置
public void setMultiplyColor(int drawableIndex, float r, float g, float b, float a){...} // 正片叠底色设置 public void setScreenColor(int drawableIndex, float r, float g, float b, float a){...} // 屏幕色设置
public void setMultiplyColor(int drawableIndex, float r, float g, float b, float a){...}   // 正片叠底色设置
public void setScreenColor(int drawableIndex, float r, float g, float b, float a){...}   // 屏幕色设置

正片叠底色和屏幕色的获取

使用CubismTextureColor类型获取各Drawable的正片叠底色和屏幕色。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CubismRenderer.CubismTextureColor getMultiplyColor(int drawableIndex){...}
CubismRenderer.CubismTextureColor getScreenColor(int drawableIndex){...}
CubismRenderer.CubismTextureColor getMultiplyColor(int drawableIndex){...} CubismRenderer.CubismTextureColor getScreenColor(int drawableIndex){...}
CubismRenderer.CubismTextureColor getMultiplyColor(int drawableIndex){...}
CubismRenderer.CubismTextureColor getScreenColor(int drawableIndex){...}

参数是Drawable索引。

Cubism Java Framework的内部处理

用于表达正片叠底色和屏幕色的Framework的内部处理。
按照以下流程处理。

  1. 从Cubism Core Java获取模型正片叠底色/屏幕色
  2. 使用覆盖标志判断获取的正片叠底色/屏幕色
  3. 在着色器程序中设置获取的正片叠底色/屏幕色
  4. 使用标志着色器计算纹理颜色时添加正片叠底色和屏幕色
Tips

模型的正片叠底色和屏幕色是通过RGBA从Cubism Core Java中获取的,但在Cubism Editor中没有设置A(透明度)。
因此,它不用于正片叠底色和屏幕色的计算。

从Cubism Core Java获取模型正片叠底色/屏幕色

使用Cubism Core Java中CubismModel类的API,从模型中获取包含正片叠底色和屏幕色的所有Drawable的数组。
它访问数组的指定索引并返回值。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public float[] getDrawableMultiplyColor(int drawableIndex) {
return model.getDrawableViews()[drawableIndex].getMultiplyColors();
}
public float[] getDrawableScreenColor(int drawableIndex) {
return model.getDrawableViews()[drawableIndex].getScreenColors();
}
public float[] getDrawableMultiplyColor(int drawableIndex) { return model.getDrawableViews()[drawableIndex].getMultiplyColors(); } public float[] getDrawableScreenColor(int drawableIndex) { return model.getDrawableViews()[drawableIndex].getScreenColors(); }
public float[] getDrawableMultiplyColor(int drawableIndex) {
    return model.getDrawableViews()[drawableIndex].getMultiplyColors();
}

public float[] getDrawableScreenColor(int drawableIndex) {
    return model.getDrawableViews()[drawableIndex].getScreenColors();
}

在Core Java中,所有Drawable信息都是在读取MOC3文件时获取的,并存储在成员数组中。
在SDK端设置正片叠底色和屏幕色,在setOverrideFlagForModelMultiplyColors()和setOverrideFlagForModelScreenColors()中设置为true,然后用setMultiplyColor()和setScreenColor()覆盖成员数组。
要为特定的Drawable设置正片叠底色/屏幕色时,请将setOverrideFlagForDrawableMultiplyColors()和setOverrideFlagForDrawableScreenColors()设置为true并执行相同的操作。

Tips

进行上述处理时,之后的Drawable的所有颜色都设置在覆盖颜色信息中。
如果您想再次使用模型的原始设置颜色,您需要追加一个单独的处理。

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