如何从天窗获取照明信息?

时间:2018-12-24 06:49:09

标签: unity3d shader unity3d-shaders

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

由于天空箱是全向的,因此天空箱没有灯光位置,因此您无法从中计算出适当的定向光照(仅环境光​​)。但是,如果您只想在任何方向上显示天空盒的颜色,则按重量列出的反射探测器有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