(一)Blender軟件操作
1. 導入模型(這里省略)
2. 材質設置
模型使用的所有材質都需要刪除Surface Shader,沒有其他多余的計算,可以大量縮短烘焙時間。刪除之后的只留下一個材質輸出節點,如圖所示:?
3. 導出Textures設置
在ShaderEditor中按照如圖所示步驟,創建Image Texture節點:?
在如圖所示位置點擊New創建Image:?
將Image的寬和高設置設置為2048像素,Color的亮度為0.73作為空白位置的填充顏色,如圖所示
節點的插值計算設置為Smart,邊界外插值設置為Extend,色彩空間設置為Raw,可以使最終烘焙出的AO對比更強烈,連接到材質的Surface,如圖所示:?
復制Image節點,鏈接到模型的其他材質上,否則其他材質所對應的部位不會參與烘焙。
4. 渲染器設置
將渲染器設置為Cycles,并選擇GPU作為計算設備,顯卡配置高的電腦烘焙時間會縮短很多:?
采樣方式選擇Branched Path Tracing,如此便可以對每一部分材質屬性設置采樣值了:
?
將整體采樣設置為最低,只提高AO的采樣值,這樣可以縮短計算其他材質屬性所浪費的時間:
5. 烘焙設置
烘焙類型設置為Ambient Occlusion:?
輸出設置中把邊緣擴展設置8像素,然后關閉Clear Image,否則渲染器會把ImageTexture中設置的Color清除
(二)Python代碼實現
參考上面軟件操作流程語句,記錄blender代碼和補充的處理
1. 材質設置
刪除材質關聯的信息,加快烘焙速度,對于沒有材質的,需要創建至少一個材質
# 刪除材質關聯的信息
for mat in bpy.data.materials:nodes = mat.node_tree.nodesfor node in nodes:if node.type != 'OUTPUT_MATERIAL':nodes.remove(node)
# 若模型沒有材質,需要創建材質,并關聯到對應的mesh
unique_material = None
if len(bpy.data.materials) == 0:bpy.ops.object.material_slot_add()bpy.ops.material.new()unique_material = bpy.data.materials[-1]
for object in bpy.data.objects:if object.type == 'MESH':if unique_material is not None:object.active_material = unique_material
2.?創建AO貼圖和texture節點
# 創建AO貼圖
AOMAP_NAME = 'AO.png'
bpy.ops.image.new(name=AOMAP_NAME,width=2048,height=2048,color=(186, 186, 186, 255),generated_type='BLANK')
aomap = bpy.data.images[AOMAP_NAME]
aomap.colorspace_settings.name ='Raw'# 創建texture節點,關聯AO貼圖,設置節點屬性
for mat in bpy.data.materials:mat.node_tree.nodes.new(type="ShaderNodeTexImage")mat.node_tree.nodes[-1].image = aomapmat.node_tree.links.new(mat.node_tree.nodes[-1].outputs['Color'] ,mat.node_tree.nodes[0].inputs['Surface'])mat.node_tree.nodes[-1].interpolation ='Smart'mat.node_tree.nodes[-1].extension ='EXTEND'
3. 渲染器設置
render = bpy.context.scene.render
render.engine = 'CYCLES'
bpy.data.scenes['Scene'].cycles.device = 'GPU'
bpy.data.scenes['Scene'].cycles.progressive ='BRANCHED_PATH'
bpy.data.scenes['Scene'].cycles.aa_samples =1
bpy.data.scenes['Scene'].cycles.ao_samples =256
4.?烘焙設置
bpy.data.scenes['Scene'].cycles.bake_type ='AO'
bpy.data.scenes['Scene'].render.bake.margin =4
bpy.data.scenes['Scene'].render.bake.use_clear =False
5. 烘焙
需要選中所有mesh,并且不能選中其他類型的資源,不然會報錯
bpy.ops.object.select_all(action='DESELECT')for object in bpy.data.objects:if object.type == 'MESH':bpy.context.view_layer.objects.active = objectobject.select_set(True)
# 開始烘焙
bpy.ops.object.bake(type='AO')
aomap.save_render(output_path)