1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

透明度を考慮して Texture2D 画像を合成する【Unity】

Posted at

概要

2つの画像を透明度を考慮して加算合成します。

使用例

SynthesisTexture2D.png

コード

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における画像合成って何か良いライブラリとかあるのでしょうか?
知っていれば情報ください!

参考記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?