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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:37:46