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

Godot 4.4.1中RenderingServer无法获取全局着色器参数求助

在Godot 4.4.1中访问全局着色器变量的问题解决

核心问题:混淆了两个独立的全局着色器变量系统

Godot存在两套互不关联的全局着色器变量机制,你当前的操作混淆了它们:

  • 着色器中的global uniform:属于着色器程序的全局变量,由着色器编译器管理,仅在着色器上下文生效,不会被RenderingServer的参数API识别。你在项目设置global/shaders里配置的就是这类变量,所以着色器能正常使用,但RenderingServer的方法读不到。
  • RenderingServer全局参数:这是引擎级的全局参数,需要用global_param关键字在着色器中声明,才能通过RenderingServer.global_shader_parameter_*系列方法读写。

解决方法

根据你“GDScript读写+着色器使用”的需求,有两种可行方案:

方案一:改用RenderingServer全局参数系统

  1. 修改着色器代码,将global uniform替换为global_param:
    global_param float spotlight_radius; // The radius of the effect in pixels
    global_param float spotlight_inner_radius;
    
  2. 在GDScript中操作参数:
    # 初始化参数(若项目设置未提前配置)
    RenderingServer.global_shader_parameter_add("spotlight_inner_radius", RenderingServer.GLOBAL_VAR_TYPE_FLOAT, 0.25)
    # 现在可正常获取参数列表和值
    print(RenderingServer.global_shader_parameter_get_list())
    var inner_radius_px = RenderingServer.global_shader_parameter_get("spotlight_inner_radius") * screen_width
    var outer_radius_px = RenderingServer.global_shader_parameter_get("spotlight_radius") * screen_width
    
    也可以直接在项目设置的Rendering/Global Shader Parameters中配置参数,无需代码添加。

方案二:保留global uniform,直接读写项目设置

如果想继续使用global uniform,可以直接通过项目设置读写对应值:

# 读取参数值
var spotlight_radius = ProjectSettings.get_setting("global/shaders/spotlight_radius")
var spotlight_inner_radius = ProjectSettings.get_setting("global/shaders/spotlight_inner_radius")
# 修改参数值(修改后着色器会自动同步)
ProjectSettings.set_setting("global/shaders/spotlight_inner_radius", 0.3)
# 可选:保存到项目配置文件,重启后依然生效
ProjectSettings.save()

你的代码报错原因

你通过RenderingServer.global_shader_parameter_add添加的参数,和着色器里的global uniform是完全独立的两个变量。着色器使用的是项目设置里的global uniform值,而RenderingServer的方法无法识别这类变量,所以get_list返回空数组,get返回null导致运算报错。

内容的提问来源于stack exchange,提问作者Dean Packard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:12:43