重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
godot-3d-materials by thedivergentai/gd-agentic-skills
npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-3d-materials关于 Godot 中 PBR 材质和 StandardMaterial3D 的专家指导。
normal_enabled = true,否则法线贴图不会生效。这是一个常见的静默失败点。Near 平面属性并减小 Far 属性,以压缩精度范围。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
必读:在实现相应模式前,请先阅读对应的脚本。
用于伤害效果、溶解和纹理交换的运行时材质属性动画。适用于动态材质状态变化。
使用 ORM 纹理和三平面映射在运行时创建 PBR 材质。
为有机表面(皮肤、树叶)设置的次表面散射和边缘光照。适用于逼真的角色或植被材质。
用于无 UV 映射地形的三平面投影着色器。基于表面法线混合纹理。适用于悬崖、洞穴或程序化地形。
专业的 PBR 资源工具。将环境光遮蔽、粗糙度和金属度打包成单个 ORM 纹理,以优化显存和绘制调用。
高性能 GPU 驱动的植被动画。使用顶点世界坐标和顶点颜色权重绘制来模拟风,无需骨骼。
无需 UV 的环境映射。沿 X/Y/Z 轴投影纹理,用于复杂岩石和地形上的有机混合。
配置逼真的有机材质。涵盖用于 Forward+ 渲染的皮肤模式、透射率和深度散射设置。
用于高速批处理的架构模式。允许 10,000 个网格共享一个材质,同时通过实例 Uniform 保持独特的颜色或生命值状态。
具有剔除遮罩和生命周期管理的动态 3D 贴花系统,用于冲击效果。
使用 Alpha Hash 和深度预通道策略解决视觉伪影问题。
用于在多个实体上切换基于着色器的视觉状态(冻结、燃烧)的简洁模式。
针对大规模世界中 Z 冲突和纹理闪烁的相机端修复方案。
全局覆盖系统,确保环境网格在优化的、状态锁定的批次中绘制。
# 创建基于物理的材质
var mat := StandardMaterial3D.new()
# 反照率(基础颜色)
mat.albedo_texture = load("res://textures/wood_albedo.png")
mat.albedo_color = Color.WHITE # 色调倍增器
# 法线贴图(表面细节)
mat.normal_enabled = true # 关键:必须先启用
mat.normal_texture = load("res://textures/wood_normal.png")
mat.normal_scale = 1.0 # 凹凸强度
# ORM 纹理(R=环境光遮蔽,G=粗糙度,B=金属度)
mat.orm_texture = load("res://textures/wood_orm.png")
# 替代方案:单独的纹理(效率较低)
# mat.roughness_texture = load("res://textures/wood_roughness.png")
# mat.metallic_texture = load("res://textures/wood_metallic.png")
# mat.ao_texture = load("res://textures/wood_ao.png")
# 应用到网格
$MeshInstance3D.material_override = mat
# 纯金属(钢、金、铜)
mat.metallic = 1.0
mat.roughness = 0.2 # 抛光金属
mat.albedo_color = Color(0.8, 0.8, 0.8) # 金属色调
# 粗糙金属(铁、铝)
mat.metallic = 1.0
mat.roughness = 0.7
# 非金属(木材、塑料、石材)
mat.metallic = 0.0
mat.roughness = 0.6 # 木材典型值
mat.albedo_color = Color(0.6, 0.4, 0.2) # 棕色木材
# 光滑塑料
mat.metallic = 0.0
mat.roughness = 0.1 # 非常光滑
# 使用纹理混合金属/非金属
mat.metallic_texture = load("res://rust_mask.png")
# 白色区域 (1.0) = 金属
# 黑色区域 (0.0) = 锈迹(非金属)
| 模式 | 使用场景 | 性能 | 排序问题 |
|---|---|---|---|
| ALPHA_SCISSOR | 树叶、铁丝网 | 快 | 无 |
| ALPHA_HASH | 抖动淡出、LOD 过渡 | 快 | 有噪点 |
| ALPHA | 玻璃、水、godot-粒子 | 慢 | 有(渲染顺序) |
# 用于树叶、草、栅栏
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR
mat.alpha_scissor_threshold = 0.5 # Alpha 值 < 0.5 的像素被丢弃
mat.albedo_texture = load("res://leaf.png") # 必须具有 Alpha 通道
# 启用背面剔除以提高性能
mat.cull_mode = BaseMaterial3D.CULL_BACK
# 用于无排序问题的平滑淡出
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_HASH
mat.alpha_hash_scale = 1.0 # 抖动图案缩放
# 淡出动画
var tween := create_tween()
tween.tween_property(mat, "albedo_color:a", 0.0, 1.0)
# 用于玻璃、水(开销大)
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.blend_mode = BaseMaterial3D.BLEND_MODE_MIX
# 禁用深度写入以实现正确混合
mat.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_DISABLED
mat.cull_mode = BaseMaterial3D.CULL_DISABLED # 显示两面
mat.emission_enabled = true
mat.emission = Color(1.0, 0.5, 0.0) # 橙色辉光
mat.emission_energy_multiplier = 2.0 # 亮度 (HDR)
mat.emission_texture = load("res://lava_emission.png")
# 动画化自发光
func _process(delta: float) -> void:
mat.emission_energy_multiplier = 1.0 + sin(Time.get_ticks_msec() * 0.005) * 0.5
mat.rim_enabled = true
mat.rim = 1.0 # 强度
mat.rim_tint = 0.5 # 反照率对边缘颜色的影响程度
mat.clearcoat_enabled = true
mat.clearcoat = 1.0 # 图层强度
mat.clearcoat_roughness = 0.1 # 光泽顶层
mat.anisotropy_enabled = true
mat.anisotropy = 1.0 # 方向性高光
mat.anisotropy_flowmap = load("res://brushed_flow.png")
# 外部工具 (GIMP, Substance, Python 脚本):
# 将 3 张灰度纹理合并为 1 张 RGB:
# R 通道 = 环境光遮蔽 (亮 = 无遮蔽)
# G 通道 = 粗糙度 (亮 = 粗糙)
# B 通道 = 金属度 (亮 = 金属)
# 在 Godot 中:
mat.orm_texture = load("res://textures/material_orm.png")
# 这将替代 ao_texture、roughness_texture 和 metallic_texture!
# 如果使用自定义通道分配:
mat.roughness_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_GREEN
mat.metallic_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_BLUE
# 1. 创建包含所有设置的 StandardMaterial3D
var std_mat := StandardMaterial3D.new()
std_mat.albedo_color = Color.RED
std_mat.metallic = 1.0
std_mat.roughness = 0.2
# 2. 转换为 ShaderMaterial
var shader_mat := ShaderMaterial.new()
shader_mat.shader = load("res://custom_shader.gdshader")
# 3. 手动传输参数
shader_mat.set_shader_parameter("albedo", std_mat.albedo_color)
shader_mat.set_shader_parameter("metallic", std_mat.metallic)
shader_mat.set_shader_parameter("roughness", std_mat.roughness)
# 基础材质(共享)
var base_red_metal := StandardMaterial3D.new()
base_red_metal.albedo_color = Color.RED
base_red_metal.metallic = 1.0
# 变体 1:粗糙
var rough_variant := base_red_metal.duplicate()
rough_variant.roughness = 0.8
# 变体 2:光滑
var smooth_variant := base_red_metal.duplicate()
smooth_variant.roughness = 0.1
# 注意:使用 resource_local_to_scene 进行每个实例的微调
# ✅ 良好:在网格间复用材质
const SHARED_STONE := preload("res://materials/stone.tres")
func _ready() -> void:
for wall in get_tree().get_nodes_in_group("stone_walls"):
wall.material_override = SHARED_STONE
# 所有墙体在单个绘制调用中批处理
# ❌ 不佳:每个网格使用唯一材质
func _ready() -> void:
for wall in get_tree().get_nodes_in_group("stone_walls"):
var mat := StandardMaterial3D.new() # 新材质!
mat.albedo_color = Color(0.5, 0.5, 0.5)
wall.material_override = mat
# 每个墙体都是单独的绘制调用
# 将多个材质合并到一个纹理图集中
# 然后使用 UV 偏移来选择区域
# material_atlas.gd
extends StandardMaterial3D
func set_atlas_region(tile_x: int, tile_y: int, tiles_per_row: int) -> void:
var tile_size := 1.0 / tiles_per_row
uv1_offset = Vector3(tile_x * tile_size, tile_y * tile_size, 0)
uv1_scale = Vector3(tile_size, tile_size, 1)
# 问题:忘记启用
mat.normal_enabled = true # 必需
# 问题:纹理导入设置错误
# 在导入选项卡中:Texture → Normal Map = true
# 问题:Mipmap 导致接缝
# 解决方案:对于紧密排列的 UV,禁用 Mipmap
# 导入 → Mipmaps → Generate = false
# 问题:缺少法线贴图或粗糙度变化
# 解决方案:添加法线贴图 + 粗糙度纹理
mat.normal_enabled = true
mat.normal_texture = load("res://normal.png")
mat.roughness_texture = load("res://roughness.png")
# 玻璃
func create_glass() -> StandardMaterial3D:
var mat := StandardMaterial3D.new()
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.albedo_color = Color(1, 1, 1, 0.2)
mat.metallic = 0.0
mat.roughness = 0.0
mat.refraction_enabled = true
mat.refraction_scale = 0.05
return mat
# 黄金
func create_gold() -> StandardMaterial3D:
var mat := StandardMaterial3D.new()
mat.albedo_color = Color(1.0, 0.85, 0.3)
mat.metallic = 1.0
mat.roughness = 0.3
return mat
当使用分层细节层次 (HLOD) 或可见性范围在远处淡出物体时,标准的 Alpha 混合会因重叠的透明边界而导致严重的性能损失。相反,请将材质上的距离淡出模式配置为像素抖动。这提供了感知上平滑的淡出效果,同时完全保持在高效的不透明渲染管线内。
直接在 StandardMaterial3D 中使用模板缓冲区。这使你能够轻松渲染隐藏于墙后物体的轮廓或 X 射线效果,而无需为基本效果编写自定义着色器。
如果你正在开发 AR 游戏,可能希望虚拟阴影出现在真实世界的相机画面上。不要使用标准混合,而是在空间着色器中使用 Godot 内置的 shadow_to_opacity 渲染模式。
shader_type spatial;
// shadow_to_opacity 使材质在被照亮时不可见,
// 但在接收到来自其他 3D 对象的阴影时变为不透明(暗色)。
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;
void fragment() {
// 表面颜色为黑色;不透明度将由传入的阴影驱动
ALBEDO = vec3(0.0, 0.0, 0.0);
}
每周安装次数
66
代码仓库
GitHub 星标数
59
首次出现
2026年2月10日
安全审计
安装于
opencode65
gemini-cli64
codex64
kimi-cli63
github-copilot63
amp63
Expert guidance for PBR materials and StandardMaterial3D in Godot.
normal_enabled = true. Silent failure is common.Near plane property and decrease the Far property to compress the precision range.MANDATORY : Read the appropriate script before implementing the corresponding pattern.
Runtime material property animation for damage effects, dissolve, and texture swapping. Use for dynamic material state changes.
Runtime PBR material creation with ORM textures and triplanar mapping.
Subsurface scattering and rim lighting setup for organic surfaces (skin, leaves). Use for realistic character or vegetation materials.
Triplanar projection shader for terrain without UV mapping. Blends textures based on surface normals. Use for cliffs, caves, or procedural terrain.
Expert PBR resource utility. Packs Ambient Occlusion, Roughness, and Metallic into a single ORM texture to optimize VRAM and draw calls.
High-performance GPU-driven foliage animation. Uses vertex world coordinates and vertex color weight painting to simulate wind without skeletons.
UV-less environment mapping. Projects textures along X/Y/Z axes for organic blending over complex rocks and terrain.
Configuring realistic organic materials. Covers Skin Mode, Transmittance, and depth scattering settings for Forward+ rendering.
Architecture pattern for high-speed batching. Allows 10,000 meshes to share one material while maintaining unique colors or health states via instance uniforms.
Dynamic 3D decal system with cull masking and life-cycle management for impact effects.
Solving visual artifacts using Alpha Hash and Depth Prepass strategies.
Clean pattern for toggling shader-based visual states (Frozen, Burned) on multiple entities.
Camera-side fix for Z-fighting and texture flickering in large-scale worlds.
Global override system to ensure environmental meshes draw in optimized, state-locked batches.
# Create physically-based material
var mat := StandardMaterial3D.new()
# Albedo (base color)
mat.albedo_texture = load("res://textures/wood_albedo.png")
mat.albedo_color = Color.WHITE # Tint multiplier
# Normal map (surface detail)
mat.normal_enabled = true # CRITICAL: Must enable first
mat.normal_texture = load("res://textures/wood_normal.png")
mat.normal_scale = 1.0 # Bump strength
# ORM Texture (R=Occlusion, G=Roughness, B=Metallic)
mat.orm_texture = load("res://textures/wood_orm.png")
# Alternative: Separate textures (less efficient)
# mat.roughness_texture = load("res://textures/wood_roughness.png")
# mat.metallic_texture = load("res://textures/wood_metallic.png")
# mat.ao_texture = load("res://textures/wood_ao.png")
# Apply to mesh
$MeshInstance3D.material_override = mat
# Pure metal (steel, gold, copper)
mat.metallic = 1.0
mat.roughness = 0.2 # Polished metal
mat.albedo_color = Color(0.8, 0.8, 0.8) # Metal tint
# Rough metal (iron, aluminum)
mat.metallic = 1.0
mat.roughness = 0.7
# Non-metal (wood, plastic, stone)
mat.metallic = 0.0
mat.roughness = 0.6 # Typical for wood
mat.albedo_color = Color(0.6, 0.4, 0.2) # Brown wood
# Glossy plastic
mat.metallic = 0.0
mat.roughness = 0.1 # Very smooth
# Use texture to blend metal/non-metal
mat.metallic_texture = load("res://rust_mask.png")
# White areas (1.0) = metal
# Black areas (0.0) = rust (dielectric)
| Mode | Use Case | Performance | Sorting Issues |
|---|---|---|---|
| ALPHA_SCISSOR | Foliage, chain-link fence | Fast | No |
| ALPHA_HASH | Dithered fade, LOD transitions | Fast | Noisy |
| ALPHA | Glass, water, godot-particles | Slow | Yes (render order) |
# For leaves, grass, fences
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR
mat.alpha_scissor_threshold = 0.5 # Pixels < 0.5 alpha = discarded
mat.albedo_texture = load("res://leaf.png") # Must have alpha channel
# Enable backface culling for performance
mat.cull_mode = BaseMaterial3D.CULL_BACK
# For smooth fade-outs without sorting issues
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_HASH
mat.alpha_hash_scale = 1.0 # Dither pattern scale
# Animate fade
var tween := create_tween()
tween.tween_property(mat, "albedo_color:a", 0.0, 1.0)
# For glass, water (expensive)
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.blend_mode = BaseMaterial3D.BLEND_MODE_MIX
# Disable depth writing for correct blending
mat.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_DISABLED
mat.cull_mode = BaseMaterial3D.CULL_DISABLED # Show both sides
mat.emission_enabled = true
mat.emission = Color(1.0, 0.5, 0.0) # Orange glow
mat.emission_energy_multiplier = 2.0 # Brightness (HDR)
mat.emission_texture = load("res://lava_emission.png")
# Animated emission
func _process(delta: float) -> void:
mat.emission_energy_multiplier = 1.0 + sin(Time.get_ticks_msec() * 0.005) * 0.5
mat.rim_enabled = true
mat.rim = 1.0 # Intensity
mat.rim_tint = 0.5 # How much albedo affects rim color
mat.clearcoat_enabled = true
mat.clearcoat = 1.0 # Layer strength
mat.clearcoat_roughness = 0.1 # Glossy top layer
mat.anisotropy_enabled = true
mat.anisotropy = 1.0 # Directional highlights
mat.anisotropy_flowmap = load("res://brushed_flow.png")
# External tool (GIMP, Substance, Python script):
# Combine 3 grayscale textures into 1 RGB:
# R channel = Ambient Occlusion (bright = no occlusion)
# G channel = Roughness (bright = rough)
# B channel = Metallic (bright = metal)
# In Godot:
mat.orm_texture = load("res://textures/material_orm.png")
# This replaces ao_texture, roughness_texture, and metallic_texture!
# If using custom channel assignments:
mat.roughness_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_GREEN
mat.metallic_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_BLUE
# 1. Create StandardMaterial3D with all settings
var std_mat := StandardMaterial3D.new()
std_mat.albedo_color = Color.RED
std_mat.metallic = 1.0
std_mat.roughness = 0.2
# 2. Convert to ShaderMaterial
var shader_mat := ShaderMaterial.new()
shader_mat.shader = load("res://custom_shader.gdshader")
# 3. Transfer parameters manually
shader_mat.set_shader_parameter("albedo", std_mat.albedo_color)
shader_mat.set_shader_parameter("metallic", std_mat.metallic)
shader_mat.set_shader_parameter("roughness", std_mat.roughness)
# Base material (shared)
var base_red_metal := StandardMaterial3D.new()
base_red_metal.albedo_color = Color.RED
base_red_metal.metallic = 1.0
# Variant 1: Rough
var rough_variant := base_red_metal.duplicate()
rough_variant.roughness = 0.8
# Variant 2: Smooth
var smooth_variant := base_red_metal.duplicate()
smooth_variant.roughness = 0.1
# Note: Use resource_local_to_scene for per-instance tweaks
# ✅ GOOD: Reuse materials across meshes
const SHARED_STONE := preload("res://materials/stone.tres")
func _ready() -> void:
for wall in get_tree().get_nodes_in_group("stone_walls"):
wall.material_override = SHARED_STONE
# All walls batched in single draw call
# ❌ BAD: Unique material per mesh
func _ready() -> void:
for wall in get_tree().get_nodes_in_group("stone_walls"):
var mat := StandardMaterial3D.new() # New material!
mat.albedo_color = Color(0.5, 0.5, 0.5)
wall.material_override = mat
# Each wall is separate draw call
# Combine multiple materials into one texture atlas
# Then use UV offsets to select regions
# material_atlas.gd
extends StandardMaterial3D
func set_atlas_region(tile_x: int, tile_y: int, tiles_per_row: int) -> void:
var tile_size := 1.0 / tiles_per_row
uv1_offset = Vector3(tile_x * tile_size, tile_y * tile_size, 0)
uv1_scale = Vector3(tile_size, tile_size, 1)
# Problem: Forgot to enable
mat.normal_enabled = true # REQUIRED
# Problem: Wrong texture import settings
# In Import tab: Texture → Normal Map = true
# Problem: Mipmaps causing seams
# Solution: Disable mipmaps for tightly-packed UVs
# Import → Mipmaps → Generate = false
# Problem: Missing normal map or roughness variation
# Solution: Add normal map + roughness texture
mat.normal_enabled = true
mat.normal_texture = load("res://normal.png")
mat.roughness_texture = load("res://roughness.png")
# Glass
func create_glass() -> StandardMaterial3D:
var mat := StandardMaterial3D.new()
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.albedo_color = Color(1, 1, 1, 0.2)
mat.metallic = 0.0
mat.roughness = 0.0
mat.refraction_enabled = true
mat.refraction_scale = 0.05
return mat
# Gold
func create_gold() -> StandardMaterial3D:
var mat := StandardMaterial3D.new()
mat.albedo_color = Color(1.0, 0.85, 0.3)
mat.metallic = 1.0
mat.roughness = 0.3
return mat
When utilizing Hierarchical Level of Detail (HLOD) or Visibility Ranges to fade objects out at a distance, standard alpha blending causes severe performance hits due to overlapping transparent bounds. Instead, configure the Distance Fade mode on your material to Pixel Dither. This provides a perceptually smooth fade while remaining entirely within the high-performance opaque pipeline.
Use the Stencil Buffer directly in StandardMaterial3D. This allows you to easily render outlines or X-ray effects for objects hidden behind walls without needing to write custom shaders for basic effects.
If you are developing an AR game, you might want virtual shadows to appear on real-world camera feeds. Instead of standard blending, use Godot's built-in shadow_to_opacity render mode in a spatial shader.
shader_type spatial;
// shadow_to_opacity makes the material invisible when lit,
// but opaque (dark) when it receives a shadow from another 3D object.
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;
void fragment() {
// The surface color is black; opacity will be driven by incoming shadows
ALBEDO = vec3(0.0, 0.0, 0.0);
}
Weekly Installs
66
Repository
GitHub Stars
59
First Seen
Feb 10, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode65
gemini-cli64
codex64
kimi-cli63
github-copilot63
amp63
TanStack Query v5 完全指南:React 数据管理、乐观更新、离线支持
2,500 周安装