Как я могу получить информацию об освещении из скайбокса? - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок в шейдере Unity3d.Я сейчас пишу обычные неосвещенные шейдеры.Я знаю, что могу использовать _WorldSpaceLightPos0.xyz и _LightColor0.rgb для получения информации о направленном источнике света.

Однако, если у меня есть скайбокс вместо источника света, как я могу получить информацию о свете?radiance(Li) исходит из моего скайбокса.Как я могу получить их значение и вычислить Li*my_custome_brdf?

Спасибо

1 Ответ

0 голосов
/ 07 января 2019

Скайбокс не имеет положения освещения, поскольку он является всенаправленным, поэтому из него нельзя рассчитать правильное направленное освещение (только окружающее).Однако, если вы просто хотите, чтобы цвет скайбокса был в любом направлении, для весовых зондов есть весы 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

...