如何从天空盒获取光照信息?

How can I get the lighting information from a skybox?

我是 Unity3d 着色器的新手。我现在正在写一个客户未点亮的着色器。我知道我可以使用 _WorldSpaceLightPos0.xyz_LightColor0.rgb 来获取定向光源的信息。

但是,如果我有一个天空盒而不是一个光源,我怎样才能得到光的信息呢? radiance(Li) 现在来自我的天空盒。如何获取它们的值并计算 Li*my_custome_brdf?

谢谢

天空盒没有光照位置,因为它是全向的,因此您无法从中计算出正确的定向光照(仅环境光​​照)。但是,如果您只想要任何方向的天空盒颜色,反射探测器有 unity_SpecCube0、unity_SpecCube1 等,按权重列出。你可以使用这样的东西:

inline half3 SurfaceReflection(half3 viewDir, half3 worldNormal, half roughness) {

    half3 worldRefl = reflect(-viewDir, worldNormal);
    half r = roughness * 1.7 - 0.7 * roughness; // Some magic for calculating MIP level
    float4 reflData = UNITY_SAMPLE_TEXCUBE_LOD(
        unity_SpecCube0, worldRefl, r * 6
    );

    return DecodeHDR (reflData, unity_SpecCube0_HDR);
}

如果您的反射探针与您的天空盒不同,只需在您的着色器中将天空盒定义为 texCUBE uniform 并使用它。如果您不想使用此着色器为每个 material 设置它,只需在 CGPROGRAM 块中将其声明为统一,而不是 ShaderLab 属性 - 然后它将被视为着色器全局。然后您可以使用 Shader.SetGlobalTexture 通过脚本设置它。在此处查看相关文档:

https://docs.unity3d.com/ScriptReference/Shader.SetGlobalTexture.html