Exemple #1
0
        /// <summary>
        /// Bake SphericalHarmonicsL2 values
        /// </summary>
        /// <param name="probePosition"></param>
        /// <param name="position"></param>
        /// <param name="range"></param>
        /// <param name="color"></param>
        /// <param name="intensity"></param>
        /// <param name="shL2"></param>
        public static void SHAddPointLight(Vector3 probePosition, Vector3 position, float range, Color color, float intensity, ref SphericalHarmonicsL2 sphericalHarmonicsL2)
        {
            Vector3 probeToLight = position - probePosition;
            float   attenuation  = 1.0F / (1.0F + 25.0F * probeToLight.sqrMagnitude / (range * range));

            sphericalHarmonicsL2.AddDirectionalLight(probeToLight.normalized, color, intensity * attenuation);
        }
Exemple #2
0
    void SHAddPointLight(Vector3 probePosition, Vector3 position, float range, Color color, float intensity, ref SphericalHarmonicsL2 sh)
    {
        // From the point of view of an SH probe, point light looks no different than a directional light,
        // just attenuated and coming from the right direction.
        Vector3 probeToLight = position - probePosition;
        float   attenuation  = 1.0F / (1.0F + 25.0F * probeToLight.sqrMagnitude / (range * range));

        sh.AddDirectionalLight(probeToLight.normalized, color, intensity * attenuation);
    }
Exemple #3
0
        public SphericalHarmonicsL2 ProjectCubeIntoSH(Cubemap src, int miplevel)
        {
            Vector3[] vectorArray1 = new Vector3[0x12];
            vectorArray1[0]    = new Vector3(0f, 0f, -1f);
            vectorArray1[1]    = new Vector3(0f, -1f, 0f);
            vectorArray1[2]    = new Vector3(-1f, 0f, 0f);
            vectorArray1[3]    = new Vector3(0f, 0f, 1f);
            vectorArray1[4]    = new Vector3(0f, -1f, 0f);
            vectorArray1[5]    = new Vector3(1f, 0f, 0f);
            vectorArray1[6]    = new Vector3(1f, 0f, 0f);
            vectorArray1[7]    = new Vector3(0f, 0f, 1f);
            vectorArray1[8]    = new Vector3(0f, -1f, 0f);
            vectorArray1[9]    = new Vector3(1f, 0f, 0f);
            vectorArray1[10]   = new Vector3(0f, 0f, -1f);
            vectorArray1[11]   = new Vector3(0f, 1f, 0f);
            vectorArray1[12]   = new Vector3(1f, 0f, 0f);
            vectorArray1[13]   = new Vector3(0f, -1f, 0f);
            vectorArray1[14]   = new Vector3(0f, 0f, -1f);
            vectorArray1[15]   = new Vector3(-1f, 0f, 0f);
            vectorArray1[0x10] = new Vector3(0f, -1f, 0f);
            vectorArray1[0x11] = new Vector3(0f, 0f, 1f);
            Vector3[]            vectorArray = vectorArray1;
            float                num         = 0f;
            SphericalHarmonicsL2 sl          = new SphericalHarmonicsL2();

            sl.Clear();
            int num2 = 0;

            while (num2 < 6)
            {
                Vector3 vector  = vectorArray[num2 * 3];
                Vector3 vector2 = -vectorArray[(num2 * 3) + 1];
                Vector3 vector3 = -vectorArray[(num2 * 3) + 2];
                Color[] pixels  = src.GetPixels((CubemapFace)num2, miplevel);
                int     num3    = src.width >> (miplevel & 0x1f);
                if (num3 < 1)
                {
                    num3 = 1;
                }
                float num4 = -1f + (1f / ((float)num3));
                float num5 = (2f * (1f - (1f / ((float)num3)))) / (num3 - 1f);
                int   num6 = 0;
                while (true)
                {
                    if (num6 >= num3)
                    {
                        num2++;
                        break;
                    }
                    float num7 = (num6 * num5) + num4;
                    int   num8 = 0;
                    while (true)
                    {
                        if (num8 >= num3)
                        {
                            num6++;
                            break;
                        }
                        Color   color   = pixels[num8 + (num6 * num3)];
                        float   num9    = (num8 * num5) + num4;
                        float   f       = (1f + (num9 * num9)) + (num7 * num7);
                        float   num11   = 4f / (Mathf.Sqrt(f) * f);
                        Vector3 vector4 = (vector3 + (vector * num9)) + (vector2 * num7);
                        vector4.Normalize();
                        Color color2 = (color * color.a) * 8f;
                        sl.AddDirectionalLight(-vector4, (QualitySettings.activeColorSpace != ColorSpace.Linear) ? color2 : color2.linear, num11 * 0.5f);
                        num += num11;
                        num8++;
                    }
                }
            }
            return(sl * (4f / num));
        }
Exemple #4
0
    public SphericalHarmonicsL2 RenderToSphericalHarmonics()
    {
        SphericalHarmonicsL2 result = default(SphericalHarmonicsL2);
        bool    directLight         = false;
        Color   color  = TOD_Util.ChangeSaturation(this.AmbientColor.linear, this.Ambient.Saturation);
        Vector3 vector = new Vector3(0.612372458f, 0.5f, 0.612372458f);
        Vector3 up     = Vector3.up;
        Color   linear = this.SampleAtmosphere(up, directLight).linear;

        result.AddDirectionalLight(up, linear, 0.428571433f);
        Vector3 direction = new Vector3(-vector.x, vector.y, -vector.z);
        Color   color2    = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(direction, color2, 0.2857143f);
        Vector3 direction2 = new Vector3(vector.x, vector.y, -vector.z);
        Color   color3     = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction2, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(direction2, color3, 0.2857143f);
        Vector3 direction3 = new Vector3(-vector.x, vector.y, vector.z);
        Color   color4     = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction3, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(direction3, color4, 0.2857143f);
        Vector3 direction4 = new Vector3(vector.x, vector.y, vector.z);
        Color   color5     = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction4, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(direction4, color5, 0.2857143f);
        Vector3 left   = Vector3.left;
        Color   color6 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(left, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(left, color6, 0.142857149f);
        Vector3 right  = Vector3.right;
        Color   color7 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(right, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(right, color7, 0.142857149f);
        Vector3 back   = Vector3.back;
        Color   color8 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(back, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(back, color8, 0.142857149f);
        Vector3 forward = Vector3.forward;
        Color   color9  = TOD_Util.ChangeSaturation(this.SampleAtmosphere(forward, directLight).linear, this.Ambient.Saturation);

        result.AddDirectionalLight(forward, color9, 0.142857149f);
        Vector3 direction5 = new Vector3(-vector.x, -vector.y, -vector.z);

        result.AddDirectionalLight(direction5, color, 0.2857143f);
        Vector3 direction6 = new Vector3(vector.x, -vector.y, -vector.z);

        result.AddDirectionalLight(direction6, color, 0.2857143f);
        Vector3 direction7 = new Vector3(-vector.x, -vector.y, vector.z);

        result.AddDirectionalLight(direction7, color, 0.2857143f);
        Vector3 direction8 = new Vector3(vector.x, -vector.y, vector.z);

        result.AddDirectionalLight(direction8, color, 0.2857143f);
        Vector3 down = Vector3.down;

        result.AddDirectionalLight(down, color, 0.428571433f);
        return(result);
    }
    public SphericalHarmonicsL2 ProjectCubeIntoSH3Func(Cubemap src, int miplevel)
    {
        Vector4[] array = new Vector4[]
        {
            new Vector4(0f, 0f, -1f, 0f),
            new Vector4(0f, -1f, 0f, 0f),
            new Vector4(-1f, 0f, 0f, 0f),
            new Vector4(0f, 0f, 1f, 0f),
            new Vector4(0f, -1f, 0f, 0f),
            new Vector4(1f, 0f, 0f, 0f),
            new Vector4(1f, 0f, 0f, 0f),
            new Vector4(0f, 0f, 1f, 0f),
            new Vector4(0f, -1f, 0f, 0f),
            new Vector4(1f, 0f, 0f, 0f),
            new Vector4(0f, 0f, -1f, 0f),
            new Vector4(0f, 1f, 0f, 0f),
            new Vector4(1f, 0f, 0f, 0f),
            new Vector4(0f, -1f, 0f, 0f),
            new Vector4(0f, 0f, -1f, 0f),
            new Vector4(-1f, 0f, 0f, 0f),
            new Vector4(0f, -1f, 0f, 0f),
            new Vector4(0f, 0f, 1f, 0f)
        };
        Quaternion rotation = base.gameObject.transform.rotation;
        Matrix4x4  matrix4x = this.QuaternionToMatrix(rotation);

        for (int i = 0; i < 6; i++)
        {
            array[i] = matrix4x * array[i];
        }
        Shader.SetGlobalMatrix("_SkyRotation", matrix4x);
        float num = 0f;
        SphericalHarmonicsL2 sphericalHarmonicsL = default(SphericalHarmonicsL2);

        sphericalHarmonicsL.Clear();
        for (int j = 0; j < 6; j++)
        {
            Vector3 a      = array[j * 3];
            Vector3 a2     = -array[j * 3 + 1];
            Vector3 a3     = -array[j * 3 + 2];
            Color[] pixels = src.GetPixels((CubemapFace)j, miplevel);
            int     num2   = src.width >> miplevel;
            if (num2 < 1)
            {
                num2 = 1;
            }
            float num3 = -1f + 1f / (float)num2;
            float num4 = 2f * (1f - 1f / (float)num2) / ((float)num2 - 1f);
            for (int k = 0; k < num2; k++)
            {
                float num5 = (float)k * num4 + num3;
                for (int l = 0; l < num2; l++)
                {
                    Color   a4   = pixels[l + k * num2];
                    float   num6 = (float)l * num4 + num3;
                    float   num7 = 1f + num6 * num6 + num5 * num5;
                    float   num8 = 4f / (Mathf.Sqrt(num7) * num7);
                    Vector3 a5   = a3 + a * num6 + a2 * num5;
                    a5.Normalize();
                    Color color = a4 * a4.a * 8f;
                    sphericalHarmonicsL.AddDirectionalLight(-a5, (QualitySettings.activeColorSpace != ColorSpace.Linear) ? color : color.linear, num8 * 0.5f);
                    num += num8;
                }
            }
        }
        float rhs = 4f / num;

        sphericalHarmonicsL *= rhs;
        return(sphericalHarmonicsL);
    }