我是Unity3d着色器的新生。我正在编写一个自定义的未着色着色器。我知道我可以使用_WorldSpaceLightPos0.xyz
和_LightColor0.rgb
来获取定向光源的信息。
但是,如果我有一个天窗而不是一个光源,如何获取灯光信息? radiance(Li)
现在来自我的天空盒。如何获得它们的价值并计算Li*my_custome_brdf
?
谢谢
答案 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