概要
2つの画像を透明度を考慮して加算合成します。
使用例
コード
SynthesisTexture2D.cs
// 2つのTexture2Dを合成して、1枚のTexture2Dを返す関数
private async UniTask<Texture2D> GetSynthesisTexture2D(Texture2D baseTexture, Texture2D blendTexture)
{
// 出力用Texture2D
Texture2D synthesisTexture = new Texture2D(baseTexture.width, baseTexture.height, TextureFormat.ARGB32, false);
// RenderTextureを作成して書き込む
var renderTextureA = RenderTexture.GetTemporary(synthesisTexture.width, synthesisTexture.height);
Graphics.Blit(baseTexture, renderTextureA);
var renderTextureB = RenderTexture.GetTemporary(synthesisTexture.width, synthesisTexture.height);
Graphics.Blit(blendTexture, renderTextureB);
// Texture2Dを作成してRenderTextureから書き込む
//現在のRenderTextureをキャッシュする
var preRT = RenderTexture.active;
RenderTexture.active = renderTextureA;
var TextureA = new Texture2D(synthesisTexture.width, synthesisTexture.height);
TextureA.ReadPixels(new Rect(0, 0, synthesisTexture.width, synthesisTexture.height), 0, 0);
TextureA.Apply();
RenderTexture.active = renderTextureB;
var TextureB = new Texture2D(synthesisTexture.width, synthesisTexture.height);
TextureB.ReadPixels(new Rect(0, 0, synthesisTexture.width, synthesisTexture.height), 0, 0);
TextureB.Apply();
// キャッシュしたRenderTextureを元に戻す
RenderTexture.active = preRT;
// RenderTextureの解除
RenderTexture.ReleaseTemporary(renderTextureA);
RenderTexture.ReleaseTemporary(renderTextureB);
// 2枚の画像を合成する
var pixels = TextureA.GetPixels();
var blendPixels = TextureB.GetPixels();
for (int i = 0; i < pixels.Length; i++)
{
var basePixel = pixels[i];
var blendPixel = blendPixels[i];
var baseAlpha = basePixel.a - blendPixel.a;
var blendAlpha = blendPixel.a;
var r = basePixel.r * baseAlpha + blendPixel.r * blendAlpha;
var g = basePixel.g * baseAlpha + blendPixel.g * blendAlpha;
var b = basePixel.b * baseAlpha + blendPixel.b * blendAlpha;
// alpha値 加算合成
var a = MathF.Min(1.0f, baseAlpha + blendAlpha);
// どちらも透明度が0の時は、alpha値に0を指定する
if (basePixel.a == 0 && blendPixel.a == 0) a = 0.0f;
// 合成後のピクセルの設定
pixels[i] = new Color(r, g, b, a);
}
synthesisTexture.SetPixels(pixels);
synthesisTexture.Apply();
return synthesisTexture;
}
備考
自分の場合は、ノベルゲームを制作する過程でデータ容量削減のため、キャラクターの顔の表情パーツを体の下地と合成する処理を記述する必要がありました。
Unityにおける画像合成って何か良いライブラリとかあるのでしょうか?
知っていれば情報ください!
参考記事