You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:30:47