【Blender】IESデータを使う、ついでにCubemap化してUnityのLightのCookieで使いたい
最近知ったんですが、Blender 2.8からIESファイルの読み込みに対応していたんですね。早く知りたかった。建築だと今も割と現役なIESデータですから、使わない手はないんです。
というのと最近、Unityでちゃかちゃかとまたビジュアライゼーションをやることになったこともあり、IESデータが欲しいんです。UnityだとIESファイル自体は使えなくて、Cookieと呼ばれていますが、配光データとしてモノクロのCubemapデータが必要となります。ちょっと面倒くさいんです。
ということで、まずはBlender 2.8でIESの適用方法を確認して、次にBlenderで画像を作成してUnityのCookieも作ってしまおうか。ということをしてみようと思います。
BlenderでIESファイルを使用する
1.Lightの設定
Point Lightを配置したら[Object Data Propaties]を開きます。
[use nodes]を選択。するとcolorとstrengthが出てきます。

[strength]の左側の[○]を選択しまして[IES Texture]を選択。パッと見みつからないように見えますが、選択肢の上の方にあります。

すると[source]というのが追加されます。
次に[External]を選択します。するとファイルを参照できるような表示に変わります。

フォルダアイコンを押して、IESファイルを選択して開きましょう。

これでPoint LightにIESデータが適用されます。光り方が変わったでしょう。

ちなみに単純なPoint Lightだけと、IESの2種類での光り方の比較をしてみました。全然変わりますね。
| 通常のPoint Light | IESを適用したPoint Light | ||||
![]() |
![]() |
| 前 | 後 | 左 | 右 | 上 | 下 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
キューブマップ生成ツールを使う
6枚の画像をCubeMapに結合するツールを作ってみました。よければ使ってみてください。
Githubにこちらにexeを用意していますので、どうぞ。
christinayan01/demo/Blender_Light_IES_to_Unity_Cookie – Github
ies2cookie.zip
ies2cookie.exeの使い方:Blenderで作成した6枚の画像とIESファイルを特定のフォルダに置きます。
起動引数に特定のフォルダを指定して起動します。
(例)
モジュールのパス:D:\ies2cookie\ies2cookie.exe
画像を置いたフォルダ:D:\ies
このときアプリは 「D:\ies2cookie\ies2cookie.exe D:\ies」 で起動します。
ルール:6枚のファイルのネーミングルールです。接尾語が必要です。
左:{filename}_l.png
右:{filename}_r.png
前:{filename}_f.png
後:{filename}_b.png
上:{filename}_u.png
下:{filename}_d.png
フォーマット:jpg、png、tif
2.Unity
出来上がったCookie用のCubeMapをUnity側にインポートします。

[Inspector]でCookieの設定をします。このとき次のように設定してください。
Texture Type: Cookie
Mapping: 6 Frames Layout
Light Type: Point
Alpha Source: From Gray Scale
Point Lightを置いて、Coooieにテクスチャをセットしてみてください。
完成
UnityでもIESと同じ配光になりました。
最初に言いましたが、光の向きと、光の相対的な強さがそれなりにIESから引き継げました。

スクリプト化
さていつものです。自動化しましょう。
IESファイルが5、6個だったら手作業でいいと思いますが、私は200個くらい変換したいので腱鞘炎必至です。ということでスクリプトで書きます。
BlenderのPythonスクリプトです。
・予めIESファイルをC:\Temp\IES\フォルダ以下に置いてください。
・「ここを設定してください」を自分の環境に合わせてください。
import glob
import os
import pathlib
import math
##ここを設定してください
RESOLUTION = 256
IES_DIR = 'D:/Temp/IES'
##
#カメラの向きをセットする
def set_camera(i):
arg_x = [90, 90, 90, 90, 180, 0]
arg_y = [0, 0, 0, 0, 0, 0]
arg_z = [0, 180, 90, -90, 0, 0]
# select camera
bpy.ops.object.select_all(action='DESELECT')
objectToSelect = bpy.data.objects["Camera"]
objectToSelect.select_set(True)
bpy.context.view_layer.objects.active = objectToSelect
# set camera rotation as euler
bpy.context.active_object.rotation_euler[0] = math.radians(arg_x[i])
bpy.context.active_object.rotation_euler[1] = math.radians(arg_y[i])
bpy.context.active_object.rotation_euler[2] = math.radians(arg_z[i])
#レンダリング解像度を設定
scene = bpy.data.scenes["Scene"]
scene.render.resolution_x = RESOLUTION
scene.render.resolution_y = RESOLUTION
#メイン処理
files = glob.glob(IES_DIR + '/**/*.ies', recursive=True)
for file in files:
#print(file)
#文字列生成
dir = os.path.dirname(file)
name = os.path.splitext(os.path.basename(file))[0]
dir_path = str( pathlib.Path(file) )
file_out = dir + '/' + name + '.png'
print(file_out)
#
#IESファイルを変更
#object = bpy.data.objects['Light']
#ノードエディタのIES Textureノードを得る
bpy.ops.object.select_all(action='DESELECT')
objectToSelect = bpy.data.objects["Light"]
objectToSelect.select_set(True)
bpy.context.view_layer.objects.active = objectToSelect
ies_node = bpy.data.lights['Light'].node_tree.nodes["IES Texture"]
ies_node.filepath = file
#前後左右上下の順序で6回レンダリング
for i in range(6):
#
#カメラの向きをセット
set_camera(i)
#
#レンダリングして保存
print('## Start rendering... ##')
bpy.ops.render.render()
postfix = ['_f', '_b', '_l', '_r', '_u', '_d']
file_out = dir + '/' + name + postfix[i] + '.png'
bpy.data.images['Render Result'].save_render(filepath=file_out)
print('finish exporting file: file_out')
参考サイト
・ShaderNodeTexIES(ShaderNode) – Blender Python API
・概要 – IES 標準ファイル形式 – AutoCADサポート
・Lightの明暗を調整するマスク処理 – Package「Light Cookies」 – 強火で進め














