首页 > 解决方案 > 如何从天空盒获取光照信息?

问题描述

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

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

谢谢

标签: unity3dshaderunity3d-shaders

解决方案


天空盒没有光照位置,因为它是全向的,因此您无法从中计算出正确的定向光照(仅环境光​​照)。但是,如果您只想要任何方向的天空盒颜色,则按权重列出的反射探针有 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 统一并使用它。如果您不想使用此着色器为每种材质设置它,只需在 CGPROGRAM 块中将其声明为统一,而不是作为 ShaderLab 属性 - 然后将其视为全局着色器。然后,您可以使用 Shader.SetGlobalTexture 通过脚本进行设置。在此处查看相关文档:

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


推荐阅读