如何在Godot Shader中获取世界位置实现3D网格材质切换?
Godot复刻Unity指定Shader效果方案
获取世界空间位置(对应Unity的worldPos)
在Godot的Spatial Shader中,直接使用内置变量WORLD_POS即可获取当前像素的世界空间坐标,这就是你需要的类似Unity中worldPos的变量。
完整Shader代码
以下代码实现了参考图中的圆形高亮/遮罩效果:
uniform vec3 world_target_pos = vec3(1.0, 0.68, 0.0); // 效果在世界空间的位置 uniform float ob_radius = 0.5; // 圆形半径 uniform float feather = 0.1; // 边缘羽化强度 // 计算圆形衰减效果 float circle_effect(vec3 world_pos, vec3 target_pos, float radius, float feather) { float dist = distance(world_pos, target_pos); // 反向平滑过渡,中心效果最强,边缘逐渐消失 return 1.0 - smoothstep(radius - feather, radius, dist); } void fragment() { // 获取当前像素的世界空间位置 vec3 current_world_pos = WORLD_POS; float effect_strength = circle_effect(current_world_pos, world_target_pos, ob_radius, feather); // 将效果叠加到原材质颜色上(白色高亮,可按需修改) ALBEDO = mix(ALBEDO, vec3(1.0), effect_strength); // 可选:增强高光,提升发光质感 SPECULAR += effect_strength * 0.5; }
代码说明
WORLD_POS:Godot内置变量,直接提供当前像素对应的世界空间坐标,完全替代Unity的worldPos。world_target_pos:在Inspector面板中可调节X/Y/Z值,控制效果在3D世界中的位置。circle_effect函数:通过计算世界空间中当前像素到目标点的距离,生成带羽化边缘的圆形效果,反向smoothstep让中心区域保留效果,边缘平滑过渡。- 若需要参考图的"挖空"效果,可将
ALBEDO = mix(ALBEDO, vec3(1.0), effect_strength)改为ALBEDO *= (1.0 - effect_strength),使中心区域变暗/透明。
使用提示
- 该Shader为Spatial类型,需应用在3D物体材质上。
- 调整
ob_radius控制圆形大小,feather控制边缘柔和度,数值越大边缘越模糊。
内容的提问来源于stack exchange,提问作者Maratonec
相关产品推荐
相关产品推荐

