Godot自定义无光照空间着色器输出过亮问题求助
Godot 3.4.4: Custom Unshaded Spatial Shader Appears Brighter Than SpatialMaterial
问题核心原因
你碰到的这个亮度差异,根源是颜色空间转换的自动处理差异:Godot自带的SpatialMaterial在无光照模式下,会自动把sRGB格式的纹理转换成线性空间颜色输出;但自定义空间着色器里,texture()函数直接返回的是sRGB颜色值(如果纹理导入时开了sRGB属性——这是颜色纹理的默认设置),而ALBEDO变量需要的是线性空间颜色,直接赋值就会导致视觉上颜色偏亮。
解决方案
只需要在自定义着色器里手动完成sRGB到线性空间的转换就行,这里有两种规范的实现方式:
方式1:用Godot内置函数(推荐)
shader_type spatial; render_mode unshaded; uniform sampler2D albedo; void fragment() { // 调用内置的颜色空间转换函数,对齐SpatialMaterial的行为 ALBEDO = srgb_to_linear(texture(albedo, UV).rgb); }
方式2:手动幂运算模拟转换
shader_type spatial; render_mode unshaded; uniform sampler2D albedo; void fragment() { ALBEDO = texture(albedo, UV).rgb; // 通过2.2次方模拟sRGB到线性空间的标准转换 ALBEDO = pow(ALBEDO, vec3(2.2)); }
额外验证提示
记得确认你的纹理导入设置里sRGB选项是开启的(这是颜色纹理的默认配置,不用改)——只有数据类纹理(比如法线图、粗糙度图)才需要关闭这个选项。
内容的提问来源于stack exchange,提问作者Benjamin Schulte
相关产品推荐
相关产品推荐

