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?

【新Ver】Blenderであらゆるノードで構成されたマテリアルをテクスチャにベイクするアドオンを作った。

Posted at

前回までのあらすじ

これを書いたときは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だし、ちょうどいいといえばそう。

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?