3D 软件造壳,AI/贴图画皮,引擎赋魂。
text
VFX ≈ 简单 Mesh(塑料外壳)× 滚动贴图(活涂装)× 引擎数学(缩放/旋转/淡出/错开)
Do not render finished FX in DCC or rely on TyFlow/Houdini for indie iteration.
Do not replace textures with pure procedural noise2d() unless prototyping.
StepInputOutput1. MeshCC0 VFX pack or Godot primitives (Plane/Cylinder/Torus)UV-ready shell2. TextureAI seamless noise or CC0 sprite sheet (Kenney placeholder)Alpha/mask + detail3. Shadersampler2D + UV scroll + style gradeVisible texture shape4. CodeTween scale / rotation / intensity / staggerTimed performance5. AnchorNode under Player at feet (y≈0) or chestCorrect bind point
Generate seamless, high-contrast masks suitable for UV scroll:
seamless jade ink wash noise, high contrast alpha, tileable, 512x512, no backgroundseamless magic energy noise, soft core bright edges dark, tileableDrop into assets/textures/vfx/ and assign to albedo_texture in shader.
ElementRoleMeshTexture examples面Base area, 60% main colorHorizontal plane, large billboardcircle, smoke, magic线Direction, trail, ink strokeThin billboard, ground trace planeslash, trace, scratch点Accent sparkle, scatterSmall billboardsstar, spark
Layer with staggered delays (0.05–0.18s). Never spawn everything at t=0.
ShareRoleUsage**60%Main attribute colorPool, rings, body aura30%Secondary (adjacent hue)Mist, inner glow, edge wash10%**Accent (warm/high sat)Gold stars, white core flash
Ink black (墨痕) is not part of 631 area — use as contrast edge (like bubble black rims): small coverage, high opacity.
Extended formula (fluid/magic):
主色冷色大面积 + 辅色邻近/弱对比 + 微面积色散高光 + 极小面积点缀色
For ink-wash projects: main = jade/teal; secondary = blue-purple mist; accent = warm gold; ink = near-black.
Orthographic oblique camera (e.g. offset (20, 22.5, 20)) breaks many free-3D assumptions.
DoDon'tHorizontal PlaneMesh for ground FXVertical ring only visible as lineBillboard planes for body FX ( look_at camera)Cylinder/Torus body (shows caps, hides UV)Texture discard on low alpha ( if mask < 0.025: discard)Uniform green fog without texture shapeTexture drives mask; shader tintsProcedural ring mask *= ring covering textureblend_mix + ink grade for main layersFull-scene neon blend_add``blend_add only for accent/core layerAnchor ground at y ≈ -0.93 (feet), slightly above ground planeSame Y as ground (z-fight)
Billboard facing (Godot 4):
gdscript
node.look_at(camera.global_position, Vector3.UP)
node.rotate_object_local(Vector3.RIGHT, -PI * 0.5)
node.rotate_object_local(Vector3.FORWARD, yaw_offset)
ShaderRenderPurposeheal_vfx_layer.gdshader``blend_mixMain layers: 4-tone grade, UV scroll, optional expandheal_vfx_ink.gdshader``blend_mixBlack ink strokes/splashesheal_vfx_add.gdshader``blend_addGold/white accent only
Key uniforms: albedo_texture, scroll_speed, effect_time, intensity, expand_progress, tone_dark/mid/bright/accent.
heal_mesh_effect.gd reference)#text
HealEffect (Node3D, y=1.0 on Player)
├── Ground: pool + rings (horizontal planes)
├── Body: twirl billboards ×2 crossed yaw
├── Mist: secondary billboard (30%)
├── Ink: splashes, strokes, traces, rising flecks
└── Accent: core add + star billboards (10%)
API: trigger_heal() with cooldown; _process updates effect_time + billboard facing.
gdscript
# CORRECT — lambda passes float to intensity
_tween.tween_method(func(v): mat.set_shader_parameter("intensity", v), 0.0, 2.0, 0.3)
# WRONG — bind appends args; float hits wrong parameter
_tween.tween_method(_set_intensity.bind(mat), 0.0, 2.0, 0.3) # breaks in GDScript 4
Return type for tween_method: MethodTweener, not Tween.
Typed arrays for texture pick:
gdscript
const SPARK_TEX: Array[Texture2D] = [TEX_A, TEX_B, TEX_C]
var tex: Texture2D = SPARK_TEX[i % 3]
Before shipping a VFX, verify:
preload() textures; sync effect_time on all materialsFailed approachWhyGPUParticles + Kenney without billboardSide-on quads invisible in 2.5DCylinder auraTop cap reads as geometry, not texturePure noise shadersNo craft; flat green fogProcedural ring × textureTexture shape lostStacking 10+ layers same hueMonotone, no 631Tween.bind() for multi-arg settersRuntime type errors
AssetPathEffect scriptscripts/heal_mesh_effect.gdLayer shadershaders/heal_vfx_layer.gdshaderInk shadershaders/heal_vfx_ink.gdshaderAdd shadershaders/heal_vfx_add.gdshaderTextures (placeholder)addons/kenney_particle_pack/Scene hookPlayer/HealEffect in scenes/main_3d.tscn
Kenney mapping for heal: smoke_06 pool, circle_05 ring, twirl_02 body, light_03 halo, magic_02 mist, magic_04 core, star/spark accent, scratch/scorch/slash/trace ink.
For extended pitfalls and environment constraints, see reference.md.