我是 Unity3d 着色器的新手。我现在正在编写一个自定义未点亮着色器。我知道我可以使用_WorldSpaceLightPos0.xyz
并_LightColor0.rgb
获取定向光源的信息。
但是,如果我有一个天空盒而不是一个光源,我怎样才能得到光照信息呢?现在radiance(Li)
来自我的天空盒。我怎样才能得到它们的价值并计算Li*my_custome_brdf
?
谢谢
我是 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 统一并使用它。如果您不想使用此着色器为每种材质设置它,只需在 CGPROGRAM 块中将其声明为统一,而不是作为 ShaderLab 属性 - 然后将其视为全局着色器。然后,您可以使用 Shader.SetGlobalTexture 通过脚本进行设置。在此处查看相关文档:
https://docs.unity3d.com/ScriptReference/Shader.SetGlobalTexture.html