MRが楽しい

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

Blender2.8でベイクする際にサンプリング数を減らして高速化する

本日は Blender2.8 の小ネタ枠です。
Blender2.8でベイクする際にサンプリング数を減らして高速化する手順を記事にします。

ベイク時のサンプリング数

例えば以下のような単色のディフューズをテクスチャにベイクします。
f:id:bluebirdofoz:20200815214234j:plain

デフォルトの設定(CPU実行)でベイクを実行した場合、10秒ほど時間がかかりました。
f:id:bluebirdofoz:20200815214245j:plain

このようなノイズの少ないベイクの場合、デフォルト設定ではサンプリング数が多すぎて無駄な時間がかかってしまいます。
[レンダー]タブを開き、[サンプリング]パネルの[レンダー]の[サンプリング数]を 1 に変更します。
f:id:bluebirdofoz:20200815214256j:plain

すると、1秒もかからずベイクが完了しました。
ベイク結果も全く問題ありません。
f:id:bluebirdofoz:20200815214308j:plain

pythonスクリプト

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

# 現在選択中のオブジェクトからアクティブオブジェクトへカラー情報をベイクする
def bake_diffuse_coloronly():
    """現在選択中のオブジェクトからアクティブオブジェクトへカラー情報をベイクする
    """

    # レンダリングエンジンを CYCLES に切り替える
    bpy.context.scene.render.engine = 'CYCLES'

    # GPUの設定を行う
    bpy.data.scenes["Scene"].cycles.device = 'GPU'
    # CUDAを選択する
    bpy.context.preferences.addons['cycles'].preferences.compute_device_type = 'CUDA'
    # デバイスの一覧を取得する
    for devices in bpy.context.preferences.addons['cycles'].preferences.get_devices():
        for device in devices:
            # デバイスタイプがCUDAならば利用対象とする
            if device.type == 'CUDA':
                print("利用可能なGPUを検出しました:" + device.name)
                device.use = True

    # render.bake の設定項目を予め設定する
    bake_setting = bpy.context.scene.render.bake

    # ベイクの影響から直接照明を無効化する
    bake_setting.use_pass_direct = False

    # ベイクの影響から間接照明を無効化する
    bake_setting.use_pass_indirect = False

    # ベイクの影響からカラーを有効化する
    bake_setting.use_pass_color = True

    # [選択->アクティブ]のベイクを有効化する
    bake_setting.use_selected_to_active = True

    # レイの距離を 0.001 (近距離)に設定する
    bake_setting.cage_extrusion = 0.01

    # サンプリング数を減らす
    bpy.data.scenes["Scene"].cycles.samples = 1

    # サンプリング数を減らす(ビューポートの場合)
    bpy.data.scenes["Scene"].cycles.preview_samples = 1

    # ディフューズタイプのベイクを実行する
    # ベイクの種類
    # ('COMBINED', 'AO', 'SHADOW', 'NORMAL', 'UV', 'ROUGHNESS',
    # 'EMIT', 'ENVIRONMENT', 'DIFFUSE', 'GLOSSY', 'TRANSMISSION')
    # (render.bake 以外の設定は引数で指定する必要あり)
    bpy.ops.object.bake(type='DIFFUSE', margin=16)

    return