Membuat Material Glowing Edge Procedural di Blender
Pada objek 3D seperti teks, logo, atau emblem, salah satu cara sederhana untuk memberikan kesan lebih premium adalah membuat bagian pinggir objek terlihat lebih terang dibandingkan permukaan utamanya. Efek ini dapat digunakan sebagai dasar glowing edge, terutama jika hasil render nantinya akan dilanjutkan dengan compositing di After Effects.
Pada eksperimen ini, material dibuat menggunakan satu material procedural bernama Glowing Edge. Tidak diperlukan material terpisah untuk bagian bevel atau edge objek.
Konsep Material
Material menggunakan Principled BSDF sebagai shader utama dengan karakter permukaan metallic berwarna silver.
Efek terang pada pinggir objek dibuat menggunakan nilai Facing dari node Layer Weight.
Secara sederhana, Facing memberikan informasi mengenai orientasi permukaan terhadap kamera. Permukaan yang menghadap langsung ke kamera memiliki nilai berbeda dengan permukaan yang terlihat pada sudut menyamping.
Informasi tersebut kemudian digunakan sebagai mask untuk menentukan bagian mana yang mendapatkan emission.
Alur dasarnya:
Layer Weight
│
Facing
│
▼
ColorRamp
│
▼
Multiply
│
▼
Emission Strength
Dengan metode ini, edge tidak perlu dipisahkan menjadi geometry atau material tersendiri.
Base Material
Permukaan utama menggunakan Principled BSDF dengan konfigurasi:
Base Color : RGB (0.92, 0.92, 0.95)
Metallic : 1.0
Roughness : 0.22
Nilai Metallic 1.0 membuat material bereaksi seperti permukaan logam, sementara Roughness 0.22 mempertahankan refleksi yang cukup tajam.
Warna dasar sedikit kebiruan dibandingkan putih murni sehingga memberikan karakter cold silver.
Membentuk Glowing Edge
Deteksi edge menggunakan:
Layer Weight → Facing
Output tersebut kemudian masuk ke ColorRamp.
ColorRamp pada material ini menggunakan nilai:
White Position : 0.58
Black Position : 0.88
Interpolation : EASE
ColorRamp berfungsi mengontrol seberapa luas area yang dianggap sebagai edge.
Setelah itu hasil mask diperkuat menggunakan Math Node:
Operation : Multiply
Value : 3.0
Output akhirnya dihubungkan ke:
Principled BSDF → Emission Strength
Sedangkan warna emission menggunakan warm white:
Emission Color
R : 1.00
G : 0.82
B : 0.55
Perpaduan antara cold silver surface dan warm edge highlight memberikan sedikit pemisahan warna sehingga pinggiran objek terlihat lebih hidup.
Menambahkan Micro Surface
Supaya material tidak terlihat terlalu sempurna atau flat, ditambahkan detail permukaan menggunakan Noise Texture.
Konfigurasinya:
Noise Texture
Dimensions : 3D
Scale : 220
Detail : 2.0
Roughness : 0.5
Noise tersebut tidak digunakan untuk mengubah warna material, tetapi diteruskan ke node Bump:
Bump
Strength : 0.025
Distance : 0.008
Alurnya:
Texture Coordinate
│
▼
Noise Texture
│
▼
Bump
│
▼
Principled BSDF
Normal
Nilainya sengaja dibuat kecil karena tujuannya hanya memberikan micro surface variation, bukan membuat permukaan terlihat kasar secara berlebihan.
Struktur Material
Secara keseluruhan material mempunyai dua sistem procedural.
Edge system:
Layer Weight
↓
Facing
↓
ColorRamp
↓
Multiply × 3
↓
Emission Strength
Surface detail system:
Texture Coordinate
↓
Noise Texture
↓
Bump
↓
Principled BSDF Normal
Keduanya kemudian bekerja pada satu Principled BSDF yang diteruskan ke Material Output.
Karakter Efek
Hal penting dari teknik ini adalah glowing edge bersifat view-dependent.
Artinya, posisi highlight ditentukan oleh hubungan antara surface normal dan sudut pandang kamera. Ketika kamera atau objek bergerak, distribusi edge highlight juga dapat berubah.
Karena itu teknik ini lebih tepat disebut sebagai:
View-Dependent Glowing Edge / Fresnel-Like Edge Highlight
dan bukan directional top-edge lighting.
Jika yang dibutuhkan adalah highlight yang selalu muncul pada sisi atas objek terlepas dari posisi kamera, pendekatannya berbeda. Dalam kasus tersebut, surface normal dapat dibandingkan dengan arah lokal atau world-space tertentu.
Workflow Blender → After Effects
Emission pada Blender tidak harus dibuat sangat kuat.
Dalam workflow compositing, Blender cukup menghasilkan hot edge yang jelas dan memiliki luminance lebih tinggi daripada permukaan utama.
Contohnya:
Blender
↓
Metallic Surface
+
Bright / Hot Edge
↓
Render
↓
After Effects
↓
Glow / Bloom
Dengan pendekatan tersebut, bentuk dan posisi highlight tetap berasal dari geometry 3D, sementara karakter glow seperti radius, intensity, threshold, dan falloff dapat dikontrol lebih fleksibel saat compositing di After Effects.
Kesimpulan
Material Glowing Edge menggunakan satu material procedural untuk menghasilkan permukaan metallic sekaligus edge highlight tanpa perlu memisahkan bevel menjadi material lain.
Kombinasi Layer Weight, ColorRamp, Emission, Noise Texture, dan Bump membuat material tetap sederhana tetapi cukup fleksibel untuk digunakan pada teks 3D, logo, emblem, maupun objek hard-surface.
Teknik ini juga cocok untuk workflow motion graphics karena Blender dapat difokuskan untuk menghasilkan surface dan highlight information, sementara efek glow akhir disempurnakan pada tahap compositing.
import bpy
# ============================================================
# GLOWING EDGE MATERIAL 1
# Blender 4.x / 5.x
# ============================================================
MAT_NAME = "Glowing Edge"
# ------------------------------------------------------------
# Get active object
# ------------------------------------------------------------
obj = bpy.context.active_object
if obj is None:
raise Exception("Tidak ada object aktif. Pilih object dulu.")
# ------------------------------------------------------------
# Create / reuse material
# ------------------------------------------------------------
mat = bpy.data.materials.get(MAT_NAME)
if mat is None:
mat = bpy.data.materials.new(name=MAT_NAME)
mat.use_nodes = True
nodes = mat.node_tree.nodes
links = mat.node_tree.links
# Clear existing nodes
nodes.clear()
# ============================================================
# NODES
# ============================================================
# Material Output
output = nodes.new("ShaderNodeOutputMaterial")
output.name = "Material Output"
output.label = "Material Output"
output.location = (850, 0)
# Principled BSDF
bsdf = nodes.new("ShaderNodeBsdfPrincipled")
bsdf.name = "Principled BSDF"
bsdf.label = "Glowing Edge Surface"
bsdf.location = (560, 0)
# Base metallic surface
bsdf.inputs["Base Color"].default_value = (0.92, 0.92, 0.95, 1.0)
bsdf.inputs["Metallic"].default_value = 1.0
bsdf.inputs["Roughness"].default_value = 0.22
# Slight warm emission color
if "Emission Color" in bsdf.inputs:
bsdf.inputs["Emission Color"].default_value = (1.0, 0.82, 0.55, 1.0)
else:
bsdf.inputs["Emission"].default_value = (1.0, 0.82, 0.55, 1.0)
# ------------------------------------------------------------
# Layer Weight
# ------------------------------------------------------------
layer = nodes.new("ShaderNodeLayerWeight")
layer.name = "Layer Weight"
layer.label = "Edge Detection"
layer.location = (-500, 120)
layer.inputs["Blend"].default_value = 0.5
# ------------------------------------------------------------
# ColorRamp
# ------------------------------------------------------------
ramp = nodes.new("ShaderNodeValToRGB")
ramp.name = "Edge Ramp"
ramp.label = "Glowing Edge Control"
ramp.location = (-260, 120)
# Remove default positions and tune edge
cr = ramp.color_ramp
cr.elements[0].position = 0.58
cr.elements[0].color = (1.0, 1.0, 1.0, 1.0)
cr.elements[1].position = 0.88
cr.elements[1].color = (0.0, 0.0, 0.0, 1.0)
cr.interpolation = 'EASE'
# ------------------------------------------------------------
# Multiply edge intensity
# ------------------------------------------------------------
multiply = nodes.new("ShaderNodeMath")
multiply.name = "Glow Strength"
multiply.label = "Glow Strength"
multiply.operation = 'MULTIPLY'
multiply.location = (30, 120)
multiply.inputs[1].default_value = 3.0
# ------------------------------------------------------------
# Noise texture for subtle surface variation
# ------------------------------------------------------------
texcoord = nodes.new("ShaderNodeTexCoord")
texcoord.name = "Texture Coordinate"
texcoord.location = (-520, -220)
noise = nodes.new("ShaderNodeTexNoise")
noise.name = "Surface Noise"
noise.location = (-280, -220)
noise.noise_dimensions = '3D'
noise.inputs["Scale"].default_value = 220.0
noise.inputs["Detail"].default_value = 2.0
noise.inputs["Roughness"].default_value = 0.5
# ------------------------------------------------------------
# Bump
# ------------------------------------------------------------
bump = nodes.new("ShaderNodeBump")
bump.name = "Micro Bump"
bump.location = (250, -220)
bump.inputs["Strength"].default_value = 0.025
bump.inputs["Distance"].default_value = 0.008
# ============================================================
# LINKS
# ============================================================
links.new(layer.outputs["Facing"], ramp.inputs["Fac"])
links.new(ramp.outputs["Color"], multiply.inputs[0])
if "Emission Strength" in bsdf.inputs:
links.new(multiply.outputs["Value"], bsdf.inputs["Emission Strength"])
links.new(texcoord.outputs["Generated"], noise.inputs["Vector"])
links.new(noise.outputs["Fac"], bump.inputs["Height"])
links.new(bump.outputs["Normal"], bsdf.inputs["Normal"])
links.new(bsdf.outputs["BSDF"], output.inputs["Surface"])
# ============================================================
# ASSIGN TO OBJECT
# ============================================================
if len(obj.data.materials) == 0:
obj.data.materials.append(mat)
else:
obj.data.materials[0] = mat
print(f"Material '{MAT_NAME}' berhasil dibuat dan dipasang ke '{obj.name}'.")

0 Komentar