Как я могу получить информацию об освещении из скайбокса?
Я новичок в шейдере Unity3d. Я сейчас пишу обычные неосвещенные шейдеры. Я знаю, что могу использовать _WorldSpaceLightPos0.xyz
а также _LightColor0.rgb
получить информацию о направленном источнике света.
Однако, если у меня вместо источника света есть скайбокс, как я могу получить информацию о свете? radiance(Li)
сейчас идет из моего скайбокса. Как я могу получить их значение и вычислить Li*my_custome_brdf
?
Спасибо
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