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全局参数系统
- 修改着色器代码,将
global uniform替换为global_param:global_param float spotlight_radius; // The radius of the effect in pixels global_param float spotlight_inner_radius; - 在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_widthRendering/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
相关产品推荐
相关产品推荐

