Inheritance: UnityEngine.MonoBehaviour
        /// <summary>
        /// OIT Rendering main function.
        /// </summary>
        public virtual void OnRenderObject()
        {
            if (Camera.current != this.camera)
                return;

            // Render all fill passes
            foreach (var renderer in TressFXOITRenderer.renderers)
            {
                if (renderer.enabled && renderer.gameObject.activeInHierarchy)// && renderer.IsVisible(this.camera))
                {
                    renderer.RenderFillPass();
                }
            }

            // Render shadows

            // Prepare all lights
            foreach (var light in TressFXOITLight.lights)
                light.ClearShadowMaps();

            // Get shadow focus
            float multiplicator = (1f / (float)TressFXOITRenderer.renderers.Count);
            Vector3 focus = Vector3.zero;
            foreach (var renderer in TressFXOITRenderer.renderers)
            {
                focus += renderer.worldspaceBounds.center * multiplicator;
            }

            // Set shadow focus
            foreach (var light in TressFXOITLight.lights)
                light.shadowFocusPosition = focus;

            // Render all shadows
            TressFXOITLight[] shadowLights = new TressFXOITLight[4];
            int[] shadowLightIndices = new int[4];
            TressFXOITLight selfShadowLight = null;
            int shadowLightCount = 0;

            for (int i = 0; i < TressFXOITLight.lights.Count; i++)
            {
                var light = TressFXOITLight.lights[i];

                if (shadowLightCount < shadowLights.Length && light.shadows)
                {
                    light.RenderShadows();
                    shadowLightIndices[shadowLightCount] = i;
                    shadowLights[shadowLightCount] = light;
                    shadowLightCount++;
                }

                // Render self-shadows
                if (selfShadowLight == null && light.selfShadowing)
                {
                    foreach (var renderer in TressFXOITRenderer.renderers)
                    {
                        // Self-shadowing
                        light.RenderSelfShadows(renderer);
                    }

                    light.SetSelfShadowParameters(this.evaluationMaterial);
                    selfShadowLight = light;
                }
            }

            // Clear random write
            Graphics.ClearRandomWriteTargets();
            Graphics.SetRenderTarget(null);

            // Gather light information
            Vector4[] positions = new Vector4[TressFXOITLight.lights.Count];
            Vector4[] datas = new Vector4[TressFXOITLight.lights.Count];
            Vector4[] colors = new Vector4[TressFXOITLight.lights.Count];

            for (int i = 0; i < TressFXOITLight.lights.Count; i++)
            {
                TressFXOITLight.lights[i].GetLightInfo(out positions[i], out datas[i], out colors[i]);
            }

            // Set shadow data
            Matrix4x4[] shadowMatrices = new Matrix4x4[4];
            Matrix4x4[] shadowData = new Matrix4x4[4];
            for (int i = 0; i < shadowLights.Length; i++)
            {
                if (shadowLights[i] == null)
                    continue;

                // Set light -> shadow mapping index
                datas[shadowLightIndices[i]].x = i;

                // Set data
                this.evaluationMaterial.SetTexture("_ShadowMap" + i, shadowLights[i].shadowMap);
                shadowLights[i].GetShadowInfo(out shadowData[i], out shadowMatrices[i]);
            }

            this.evaluationMaterial.SetMatrixArray("_ShadowData", shadowData);
            this.evaluationMaterial.SetMatrixArray("_ShadowMatrices", shadowMatrices);
            this.evaluationMaterial.SetInt("_ShadowLightCount", shadowLightCount);

            // Prepare evaluation material
            this.evaluationMaterial.SetBuffer("SRV_fragmentHead", this.headBuffer);
            this.evaluationMaterial.SetBuffer("SRV_fragmentData", this.fragmentBuffer);

            // TODO
            this.evaluationMaterial.SetFloat("_HairWidthMultiplier", TressFXOITRenderer.renderers[0].hairMaterial.GetFloat("_HairWidthMultiplier"));
            this.evaluationMaterial.SetFloat("_HairWidth", TressFXOITRenderer.renderers[0].hairMaterial.GetFloat("_HairWidth"));

            // Set light information
            this.evaluationMaterial.SetVectorArray("_LightPositions", positions);
            this.evaluationMaterial.SetVectorArray("_LightDatas", datas);
            this.evaluationMaterial.SetVectorArray("_LightColors", colors);
            this.evaluationMaterial.SetInt("_LightCount", positions.Length);
            this.evaluationMaterial.SetFloat("_SelfShadowStrength", TressFXOITRenderer.renderers[0].selfShadowStrength);
            this.evaluationMaterial.SetInt("_SelfShadows", selfShadowLight == null ? 0 : 1);

            this.evaluationMaterial.SetTexture("TextureFakePoint", TressFXOITLight.fakePointTexture);

            // Evaluate collected data
            this.evaluationMaterial.SetPass(0);
            Graphics.DrawMeshNow(OITHelper.fsqMesh, Matrix4x4.identity);
        }
        /// <summary>
        /// OIT Rendering main function.
        /// </summary>
        public virtual void OnRenderObject()
        {
            if (Camera.current != this.camera)
            {
                return;
            }

            // Render all fill passes
            foreach (var renderer in TressFXOITRenderer.renderers)
            {
                if (renderer.enabled && renderer.gameObject.activeInHierarchy)// && renderer.IsVisible(this.camera))
                {
                    renderer.RenderFillPass();
                }
            }

            // Render shadows

            // Prepare all lights
            foreach (var light in TressFXOITLight.lights)
            {
                light.ClearShadowMaps();
            }

            // Get shadow focus
            float   multiplicator = (1f / (float)TressFXOITRenderer.renderers.Count);
            Vector3 focus         = Vector3.zero;

            foreach (var renderer in TressFXOITRenderer.renderers)
            {
                focus += renderer.worldspaceBounds.center * multiplicator;
            }

            // Set shadow focus
            foreach (var light in TressFXOITLight.lights)
            {
                light.shadowFocusPosition = focus;
            }

            // Render all shadows
            TressFXOITLight[] shadowLights       = new TressFXOITLight[4];
            int[]             shadowLightIndices = new int[4];
            TressFXOITLight   selfShadowLight    = null;
            int shadowLightCount = 0;

            for (int i = 0; i < TressFXOITLight.lights.Count; i++)
            {
                var light = TressFXOITLight.lights[i];

                if (shadowLightCount < shadowLights.Length && light.shadows)
                {
                    light.RenderShadows();
                    shadowLightIndices[shadowLightCount] = i;
                    shadowLights[shadowLightCount]       = light;
                    shadowLightCount++;
                }

                // Render self-shadows
                if (selfShadowLight == null && light.selfShadowing)
                {
                    foreach (var renderer in TressFXOITRenderer.renderers)
                    {
                        // Self-shadowing
                        light.RenderSelfShadows(renderer);
                    }

                    light.SetSelfShadowParameters(this.evaluationMaterial);
                    selfShadowLight = light;
                }
            }

            // Clear random write
            Graphics.ClearRandomWriteTargets();
            Graphics.SetRenderTarget(null);

            // Gather light information
            Vector4[] positions = new Vector4[TressFXOITLight.lights.Count];
            Vector4[] datas     = new Vector4[TressFXOITLight.lights.Count];
            Vector4[] colors    = new Vector4[TressFXOITLight.lights.Count];

            for (int i = 0; i < TressFXOITLight.lights.Count; i++)
            {
                TressFXOITLight.lights[i].GetLightInfo(out positions[i], out datas[i], out colors[i]);
            }

            // Set shadow data
            Matrix4x4[] shadowMatrices = new Matrix4x4[4];
            Matrix4x4[] shadowData     = new Matrix4x4[4];
            for (int i = 0; i < shadowLights.Length; i++)
            {
                if (shadowLights[i] == null)
                {
                    continue;
                }

                // Set light -> shadow mapping index
                datas[shadowLightIndices[i]].x = i;

                // Set data
                this.evaluationMaterial.SetTexture("_ShadowMap" + i, shadowLights[i].shadowMap);
                shadowLights[i].GetShadowInfo(out shadowData[i], out shadowMatrices[i]);
            }

            this.evaluationMaterial.SetMatrixArray("_ShadowData", shadowData);
            this.evaluationMaterial.SetMatrixArray("_ShadowMatrices", shadowMatrices);
            this.evaluationMaterial.SetInt("_ShadowLightCount", shadowLightCount);

            // Prepare evaluation material
            this.evaluationMaterial.SetBuffer("SRV_fragmentHead", this.headBuffer);
            this.evaluationMaterial.SetBuffer("SRV_fragmentData", this.fragmentBuffer);

            // TODO
            this.evaluationMaterial.SetFloat("_HairWidthMultiplier", TressFXOITRenderer.renderers[0].hairMaterial.GetFloat("_HairWidthMultiplier"));
            this.evaluationMaterial.SetFloat("_HairWidth", TressFXOITRenderer.renderers[0].hairMaterial.GetFloat("_HairWidth"));

            // Set light information
            this.evaluationMaterial.SetVectorArray("_LightPositions", positions);
            this.evaluationMaterial.SetVectorArray("_LightDatas", datas);
            this.evaluationMaterial.SetVectorArray("_LightColors", colors);
            this.evaluationMaterial.SetInt("_LightCount", positions.Length);
            this.evaluationMaterial.SetFloat("_SelfShadowStrength", TressFXOITRenderer.renderers[0].selfShadowStrength);
            this.evaluationMaterial.SetInt("_SelfShadows", selfShadowLight == null ? 0 : 1);

            this.evaluationMaterial.SetTexture("TextureFakePoint", TressFXOITLight.fakePointTexture);

            // Evaluate collected data
            this.evaluationMaterial.SetPass(0);
            Graphics.DrawMeshNow(OITHelper.fsqMesh, Matrix4x4.identity);
        }