예제 #1
0
    void InitResources()
    {
        // Volume
        InitVolume(ref m_VolumeInject);
        InitVolume(ref m_VolumeScatter);


        // Compute buffers
        int pointLightCount = 0, tubeLightCount = 0, areaLightCount = 0;
        HashSet <FogLight> fogLights = LightManagerFogLights.Get();

        for (var x = fogLights.GetEnumerator(); x.MoveNext();)
        {
            var fl = x.Current;
            if (fl == null)
            {
                continue;
            }

            bool isOn = fl.isOn;

            switch (fl.type)
            {
            case FogLight.Type.Point:       if (isOn)
                {
                    pointLightCount++;
                }
                break;

            case FogLight.Type.Tube:        if (isOn)
                {
                    tubeLightCount++;
                }
                break;

            case FogLight.Type.Area:        if (isOn)
                {
                    areaLightCount++;
                }
                break;
            }
        }

        // PointLightParams {float3 float float3 float} -> 32 bytes
        CreateBuffer(ref m_PointLightParamsCB, pointLightCount, 32);

        // TubeLightParams {float3 float float3 float float3 float} -> 48 bytes
        CreateBuffer(ref m_TubeLightParamsCB, tubeLightCount, 48);

        // TubeLightShadowPlaneParams {float4 float4 float float float float} -> 48 bytes
        CreateBuffer(ref m_TubeLightShadowPlaneParamsCB, tubeLightCount, 48);

        // TubeLightParams {float4x4 float4 float3 float} -> 96 bytes
        CreateBuffer(ref m_AreaLightParamsCB, areaLightCount, 96);

        // FogEllipsoidParams {float3 float float3 9xfloat} -> 64 bytes
        HashSet <FogEllipsoid> fogEllipsoids = LightManagerFogEllipsoids.Get();

        CreateBuffer(ref m_FogEllipsoidParamsCB, fogEllipsoids == null ? 0 : fogEllipsoids.Count, 64);
    }
예제 #2
0
    void SetUpTubeLightBuffers(int kernel)
    {
        int count = m_TubeLightParamsCB == null ? 0 : m_TubeLightParamsCB.count;

        m_InjectLightingAndDensity.SetFloat("_TubeLightsCount", count);
        if (count == 0)
        {
            return;
        }

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

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

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

        int j = 0;

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

            TubeLight light      = fl.tubeLight;
            Transform t          = light.transform;
            Vector3   pos        = t.position;
            Vector3   halfLength = 0.5f * t.up * light.m_Length;

            // Tube lights
            m_TubeLightParams[j].start = pos + halfLength;
            m_TubeLightParams[j].end   = pos - halfLength;
            float range = light.m_Range * fl.m_RangeMult;
            m_TubeLightParams[j].range = 1.0f / (range * range);
            //m_TubeLightParams[j].color = new Vector3(light.m_Color.r, light.m_Color.g, light.m_Color.b) * light.m_Intensity * fl.m_IntensityMult;
            m_TubeLightParams[j].radius = light.m_Radius;

            // Tube light shadow planes
            var p = light.GetShadowPlaneParams(ref sppArr);
            m_TubeLightShadowPlaneParams[j].plane0   = p[0].plane;
            m_TubeLightShadowPlaneParams[j].plane1   = p[1].plane;
            m_TubeLightShadowPlaneParams[j].feather0 = p[0].feather;
            m_TubeLightShadowPlaneParams[j].feather1 = p[1].feather;

            j++;
        }

        m_TubeLightParamsCB.SetData(m_TubeLightParams);
        m_InjectLightingAndDensity.SetBuffer(kernel, "_TubeLights", m_TubeLightParamsCB);
        m_TubeLightShadowPlaneParamsCB.SetData(m_TubeLightShadowPlaneParams);
        m_InjectLightingAndDensity.SetBuffer(kernel, "_TubeLightShadowPlanes", m_TubeLightShadowPlaneParamsCB);
    }
예제 #3
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);
        }
    }
예제 #4
0
    void InitResources()
    {
        // Volume
        InitVolume(ref m_VolumeInject);
        InitVolume(ref m_VolumeScatter);


        // Compute buffers
        int pointLightCount = 0, tubeLightCount = 0, areaLightCount = 0;
        HashSet <FogLight> fogLights = LightManagerFogLights.Get();

        for (var x = fogLights.GetEnumerator(); x.MoveNext();)
        {
            var fl = x.Current;
            if (fl == null)
            {
                continue;
            }

            bool isOn = fl.isOn;

            switch (fl.type)
            {
            case FogLight.Type.Point:       if (isOn)
                {
                    pointLightCount++;
                }
                break;

            case FogLight.Type.Tube:        if (isOn)
                {
                    tubeLightCount++;
                }
                break;

            case FogLight.Type.Area:        if (isOn)
                {
                    areaLightCount++;
                }
                break;
            }
        }

        CreateBuffer(ref m_PointLightParamsCB, pointLightCount, Marshal.SizeOf(typeof(PointLightParams)));
        CreateBuffer(ref m_TubeLightParamsCB, tubeLightCount, Marshal.SizeOf(typeof(TubeLightParams)));
        CreateBuffer(ref m_TubeLightShadowPlaneParamsCB, tubeLightCount, Marshal.SizeOf(typeof(TubeLightShadowPlaneParams)));
        CreateBuffer(ref m_AreaLightParamsCB, areaLightCount, Marshal.SizeOf(typeof(AreaLightParams)));
        HashSet <FogEllipsoid> fogEllipsoids = LightManagerFogEllipsoids.Get();

        CreateBuffer(ref m_FogEllipsoidParamsCB, fogEllipsoids == null ? 0 : fogEllipsoids.Count, Marshal.SizeOf(typeof(FogEllipsoidParams)));
        CreateBuffer(ref m_DummyCB, 1, 4);
    }
예제 #5
0
    FogLight GetDirectionalLight()
    {
        HashSet <FogLight> fogLights = LightManagerFogLights.Get();
        FogLight           fogLight  = null;

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

            fogLight = fl;
            break;
        }

        return(fogLight);
    }
예제 #6
0
    void SetUpPointLightBuffers(int kernel)
    {
        int count = m_PointLightParamsCB == null ? 0 : m_PointLightParamsCB.count;

        m_InjectLightingAndDensity.SetFloat("_PointLightsCount", count);
        if (count == 0)
        {
            // Can't not set the buffer
            m_InjectLightingAndDensity.SetBuffer(kernel, "_PointLights", m_DummyCB);
            return;
        }

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

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

        int j = 0;

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

            Light light = fl.light;
            m_PointLightParams[j].pos = light.transform.position;
            float range = light.range * fl.m_RangeMult;
            m_PointLightParams[j].range = 1.0f / (range * range);
            m_PointLightParams[j].color = new Vector3(light.color.r, light.color.g, light.color.b) * light.intensity * fl.m_IntensityMult;
            j++;
        }

        // TODO: try a constant buffer with setfloats instead for perf
        m_PointLightParamsCB.SetData(m_PointLightParams);
        m_InjectLightingAndDensity.SetBuffer(kernel, "_PointLights", m_PointLightParamsCB);
    }