前回までのあらすじ
これを書いたときはBlenderが3.xだったが、4.xになってから動かなくなったし、昨日の更新もしたいなと思ったので振り返りながらつらつら書いていきます。
変更点
- Alpha値をベイクできるようにする
- BumpテクスチャはBumpテクスチャのままノーマルに変換しない。
4.xで何が変わったか
こんなエラーが出るようになった。
Error: Python: Traceback (most recent call last):
File "C:\Users\vtvsn\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\bake_addon.py", line 203, in execute
bake_material_textures(self.material_name,self.object_name,self.size)
File "C:\Users\vtvsn\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\bake_addon.py", line 124, in bake_material_textures
bake_texture_to("Emission",new_material,material_list,emission_node)
File "C:\Users\vtvsn\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\bake_addon.py", line 32, in bake_texture_to
color_value_node = connect_to_emit(name,materials,float_value,normal)
File "C:\Users\vtvsn\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\bake_addon.py", line 20, in connect_to_emit
link = principled_node.inputs[name].links
KeyError: 'bpy_prop_collection[key]: key "Emission" not found'
なんかShaderNodePrincipledBSDF
のInputソケットEmission
の名前がかわったっぽい?
当てずっぽうでEmission Color
にしてみたら行けました。ドキュメントとか知らない子。
bumpに対応
オブジェクトで使われているマテリアルがすべてBumpノードのみで構成される場合に、BumpをBumpとしてベイクするように変更しました。
こんな感じでBumpだけかどうかを判別してみた。
all_bump = True
for material in materials:
principled_node = material.node_tree.nodes["Principled BSDF"]
links = material.node_tree.links
link = principled_node.inputs[name].links
bump = link[0].from_node.bl_idname == "ShaderNodeBump"
if(not bump):
all_bump = False
break
色々言いたいことがあるのはわかるがいいのだ。そもそも1ファイルでアドオンを完成させようとしてる時点で間違ってるからね。
GLTFはBumpテクスチャ対応してない?!
なんと、ここまで実装してから気づいたんだが、GLTFファイルはBumpテクスチャ非対応である。
Babylon.jsでPOMしようと思って始めた改修だったが、どうしようか。
- 末尾にBUMPとでもつけて
これはBumpテクスチャですよ
と印をつけておき、babylon.js側で移し替えることにします。
あとは、BumpならShaderNodeBump
、NormalMapならShaderNodeNormalMap
をnewしてlinkするだけである。
if(bump):
bump_node = new_material.node_tree.nodes.new("ShaderNodeBump")
links.new(normal_node.outputs['Color'], bump_node.inputs['Height'])
links.new(bump_node.outputs["Normal"], principled_node.inputs['Normal'])
normal_texture.name += "BUMP"
else:
normal_map = new_material.node_tree.nodes.new('ShaderNodeNormalMap')
links.new(normal_node.outputs['Color'], normal_map.inputs['Color'])
links.new(normal_map.outputs['Normal'], principled_node.inputs['Normal'])
完成
なんやかんやあってバージョン4.0になってしまった。Blenderの対応バージョンも4.0.1だし、ちょうどいいといえばそう。