Exemplo n.º 1
0
    void SetUpAreaLightBuffers(int kernel)
    {
        int count = m_AreaLightParamsCB == null ? 0 : m_AreaLightParamsCB.count;

        m_InjectLightingAndDensity.SetFloat("_AreaLightsCount", count);
        if (count == 0)
        {
            // Can't not set the buffers/textures
            m_InjectLightingAndDensity.SetBuffer(kernel, "_AreaLights", m_DummyCB);
            m_InjectLightingAndDensity.SetTexture(kernel, "_AreaLightShadowmap", Texture2D.whiteTexture);
            return;
        }

        if (m_AreaLightParams == null || m_AreaLightParams.Length != count)
        {
            m_AreaLightParams = new AreaLightParams[count];
        }

        HashSet <FogLight> fogLights = LightManagerFogLights.Get();

        int shadowedAreaLightIndex = -1;
        int j = 0;

        for (var x = fogLights.GetEnumerator(); x.MoveNext();)
        {
            var fl = x.Current;
            if (fl == null || fl.type != FogLight.Type.Area || !fl.isOn)
            {
                continue;
            }

            AreaLight light = fl.areaLight;

            m_AreaLightParams[j].mat     = light.GetProjectionMatrix(true);
            m_AreaLightParams[j].pos     = light.GetPosition();
            m_AreaLightParams[j].color   = new Vector3(light.m_Color.r, light.m_Color.g, light.m_Color.b) * light.m_Intensity * fl.m_IntensityMult;
            m_AreaLightParams[j].bounded = fl.m_Bounded ? 1 : 0;

            if (fl.m_Shadows)
            {
                RenderTexture shadowmap = light.GetBlurredShadowmap();
                if (shadowmap != null)
                {
                    m_InjectLightingAndDensity.SetTexture(kernel, "_AreaLightShadowmap", shadowmap);
                    m_InjectLightingAndDensity.SetFloat("_ESMExponentAreaLight", fl.m_ESMExponent);
                    shadowedAreaLightIndex = j;
                }
            }

            j++;
        }
        m_AreaLightParamsCB.SetData(m_AreaLightParams);
        m_InjectLightingAndDensity.SetBuffer(kernel, "_AreaLights", m_AreaLightParamsCB);
        m_InjectLightingAndDensity.SetFloat("_ShadowedAreaLightIndex", shadowedAreaLightIndex < 0 ? fogLights.Count : shadowedAreaLightIndex);
        if (shadowedAreaLightIndex < 0)
        {
            m_InjectLightingAndDensity.SetTexture(kernel, "_AreaLightShadowmap", Texture2D.whiteTexture);
        }
    }