MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8でレンダー色空間で画像ファイルを出力すると色が薄暗くなる問題の対処

本日は Blender2.8 の小ネタ枠です。
Blender2.8でレンダー色空間で画像ファイルを出力すると色が薄暗くなる問題の対処について記事にします。

レンダー色空間で画像ファイルを出力する

例えばベイクで作成したテクスチャを画像ファイルで出力するとき、[レンダー色空間で出力する]のオプションが利用できます。
f:id:bluebirdofoz:20200812215111j:plain

本オプションを利用すると、シーンのレンダリング情報を利用して画像ファイルを出力します。
特に python スクリプトでフォーマットを指定した画像ファイルを出力する場合 save_render() のAPIを利用する事があります。

# シーンのレンダリング設定からイメージフォーマット設定の参照を取得する
scene_imagesettings = bpy.context.scene.render.image_settings

# カラーフォーマットを設定する
scene_imagesettings.color_mode = arg_colormode

# 色深度を設定する
scene_imagesettings.color_depth = arg_colordepth

# 圧縮率を設定する
scene_imagesettings.compression = arg_compression

# シーンのレンダリング設定を利用して画像を保存する
arg_image.save_render(filepath=savepath, scene=render_scene)

色が薄暗くなる問題

以下はデフォルトのシーン設定のまま、[レンダー色空間で出力する]のオプションを利用した場合です。
画像ファイルが灰色掛った色合いになって出力されることがあります。
f:id:bluebirdofoz:20200812215122j:plain

これは「レンダー色空間で出力する」が画像のフォーマット設定だけでなく、その他のレンダリングの設定も参照するためです。
[レンダー]プロパティを開き、[カラーマネジメント]パネルの[色変換]を[標準]に変更する事で問題が改善することがあります。
f:id:bluebirdofoz:20200812215133j:plain

再び[レンダー色空間で出力する]を利用すると、以下の通り、元の発色で出力されました。
f:id:bluebirdofoz:20200812215143j:plain

pythonスクリプト

本処理を python スクリプトで記述した例を以下に示します。

# 指定ディレクトリにテクスチャをPNG形式で保存する
def save_image_targetdir(arg_image:bpy.types.Image, arg_directory:str,
  arg_colormode:str='RGBA', arg_colordepth:str='8', arg_compression:int=15) -> bool:
    """指定ディレクトリにテクスチャをPNG形式で保存する

    Args:
        arg_image (bpy.types.Image): 保存テクスチャ
        arg_directory (str): 指定ディレクトリ
        arg_colormode (str, optional): カラーモード指定. Defaults to 'RGBA'.
        arg_colordepth (str, optional): 色深度指定. Defaults to '8'.
        arg_compression (int, optional): 圧縮率指定. Defaults to 15.

    Returns:
        bool: 実行正否
    """

    # 保存ファイルパスを作成する
    savepath = arg_directory + "\\" + arg_image.name + ".png"

    # 保存ファイルパスを指定する
    arg_image.filepath_raw = savepath

    # ファイルフォーマットをPNGに設定する
    arg_image.file_format = 'PNG'

    # 参照パスを保持するため、一度通常の保存を行う
    arg_image.save()

    # レンダー色空間で保存するためのシーンを取得する
    # (https://docs.blender.org/api/current/bpy.types.Scene.html)
    render_scene = bpy.context.scene

    # 現在のカラーマネジメントのビュー変換を取得する
    current_view_transform = render_scene.view_settings.view_transform

    # カラーマネジメントのビュー変換を[標準]に設定する(Filmicだと灰色に出力されるため)
    # (https://docs.blender.org/api/current/bpy.types.ColorManagedViewSettings.html)
    render_scene.view_settings.view_transform = 'Standard'

    # シーンのレンダリング設定からイメージフォーマット設定の参照を取得する
    scene_imagesettings = render_scene.render.image_settings

    # カラーフォーマットを設定する
    scene_imagesettings.color_mode = arg_colormode

    # 色深度を設定する
    scene_imagesettings.color_depth = arg_colordepth

    # 圧縮率を設定する
    scene_imagesettings.compression = arg_compression

    # シーンのレンダリング設定を利用して画像を保存する
    arg_image.save_render(filepath=savepath, scene=render_scene)

    # 変更したビュー変換を元に戻す
    render_scene.view_settings.view_transform = current_view_transform

    return True