Как я могу получить информацию об освещении из скайбокса?

Я новичок в шейдере 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

Другие вопросы по тегам