- 개요
네온 머티리얼을 적용하는 쉐이더 Add-On을 만들어본다
단, 이번에는 머티리얼의 노드에 키프레임 모디파이어를 적용하여 기능을 구현한다
키 프레임 모디파이어를 머티리얼 노드에 사용하면
고정된 값이 아닌 유동적인 값을 사용하여 머티리얼을 다양하게 연출할 수 있다
- Add-On 스크립트의 구성
1) Add-On을 사용하기 위한 패널의 클래스 생성
import bpy
class HelloWorldPanel(bpy.types.Panel):
bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'Name Your New Tab'
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row()
row.operator('shader.neon_operator')
...
클래스 HelloWorldPanel을 생성하여 Add-On을 사용할 수 있는 패널을 정의한다
패널을 활성화하는 draw 함수에서는 operator 연산자를 통해 수행할 연산을 정의한다
실행할 네온 쉐이더 Add-On의 bl_idname을 인자로 넘겨주어 실행한다
2) Add-On 클래스 정의
...
class SHADER_OT_NEON(bpy.types.Operator):
bl_label = "Add Neon Shader"
bl_idname = 'shader.neon_operator'
def execute(self, context):
cur_frame = bpy.context.scene.frame_current
# Creating a New Neon material
material_neon = bpy.data.materials.new(name = "Neon")
material_neon.use_nodes = True
tree = material_neon.node_tree
# Handling Principled BSDF Node
material_neon.node_tree.nodes.remove(material_neon.node_tree.nodes.get('Principled BSDF'))
# Handling Material Output Node
material_output = material_neon.node_tree.nodes.get('Material Output')
material_output.location = (400, 0)
# Handling Emission Node
emiss_node = material_neon.node_tree.nodes.new('ShaderNodeEmission')
emiss_node.location = (-600, 0)
# Default Color
emiss_node.inputs[0].default_value = (0.591019, 0.758087, 1, 1)
# Strength Value
emiss_node.inputs[1].default_value = 2
# Add Keyframe to Emission Node`s Strength
emiss_node.inputs[1].keyframe_insert("default_value", frame = cur_frame)
data_path = f'nodes["{emiss_node.name}"].inputs[1].default_value'
fcurves = tree.animation_data.action.fcurves
fc = fcurves.find(data_path)
if fc :
new_modi = fc.modifiers.new('NOISE')
new_modi.strength = 10
new_modi.depth = 1
# Link nodes
material_neon.node_tree.links.new(emiss_node.outputs[0], material_output.inputs[0])
return {'FINISHED'}
...
Add-On으로 사용할 SHADER_OT_NEON 클래스를 정의하였다
해당 클래스는 연산에 사용하므로 bpy.types.Operator를 부모 클래스로 사용하고
연산의 종료를 알리는 'FINISHED'를 반환한다
클래스의 구성을 큰 단락으로 구분하면 다음과 같이 구분할 수 있다
- 새로운 Neon 머티리얼 정의
- Principled BSDF 노드 설정
- Material Output 노드 설정
- Emission 노드 설정
- Emission 노드에 키프레임 모디파이어 설정
- 노드간의 연결 설정
주목해야 할 정보는 다음과 같다
cur_frame 변수는 scene.frame_current의 값으로 설정하였다
해당 값은 현재 프레임을 의미하고 애니메이션 데이터를 업데이트하기 위해 사용한다
따라서 키프레임 모디파이어에 cur_frame의 값을 사용한다
다음으로 furves 변수는 animation_data.action.fcurves의 값을 사용한다
FCurve는 주기를 나타내는 값으로 이뤄진 곡선을 의미하는데,
따라서 애니메이션의 주기의 값을 가져오는 용도로 fcurves 변수를 사용한다
fc 변수는 fcurves.find(data_path)의 값으로 설정된다
FCurve에서 find 함수를 호출하고 data_path를 넘겨주면 인자에 해당하는 FCurve를 찾아온다
로직에서는 인자에 맞는 FCurve가 존재한다면
Noise 모디파이어를 추가하고 strength와 depth를 설정한다
- 최종 실행 결과
'blender > blender python' 카테고리의 다른 글
| 텍스트 Add-On (0) | 2025.07.09 |
|---|---|
| 대화 상자 (0) | 2025.07.09 |
| 다이아몬드 쉐이더 Add-On (0) | 2025.07.02 |
| BPY 스크립트를 Add-On으로 완성 (0) | 2025.06.25 |
| BPY 스크립트로 Blender에 기능 추가 (0) | 2025.06.25 |