private void createMaskCommandBuffer()
    {
        WaveVR_Utils.SafeExecuteAllDelegate <BeforeCreateMaskCommandBuffer>(beforeCreateMaskCommandBuffer, a => a(this));

        if (renderMaskShader == null)
        {
            renderMaskShader = Shader.Find("Hidden/WaveVR/RenderMask");
        }

        if (renderMaskMaterial == null && renderMaskShader != null)
        {
            renderMaskMaterial = new Material(renderMaskShader);
            renderMaskMaterial.SetColor("_Color", color);
        }
        if (renderMaskMaterial == null)
        {
            Log.e(TAG, "RenderMask Shader not found");
            return;
        }

        // You can custom them
        if (renderMaskMeshLeft == null || renderMaskMeshRight == null)
        {
#if UNITY_EDITOR
            if (Application.isEditor)
            {
                if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES3 ||
                    SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES2 ||
                    SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLCore)
                {
                    // Cause Unity error: "Unknown shader count".  Need solve.
                    //renderMaskMeshLeft = renderMaskMeshRight = Resources.Load<Mesh>("WaveVR_RenderMask_GL");
                }
                else
                {
                    //if (SystemInfo.usesReversedZBuffer)
                    //	renderMaskMeshLeft = renderMaskMeshRight = Resources.Load<Mesh>("WaveVR_RenderMask_D3D_ReversedZ");
                    //else
                    //	renderMaskMeshLeft = renderMaskMeshRight = Resources.Load<Mesh>("WaveVR_RenderMask_D3D");
                }
            }
            else
#endif
            {
                renderMaskMeshLeft  = GetStencilMesh(WVR_Eye.WVR_Eye_Left);
                renderMaskMeshRight = GetStencilMesh(WVR_Eye.WVR_Eye_Right);
            }
        }

        if (renderMaskMeshLeft == null || renderMaskMeshRight == null)
        {
            Log.w(TAG, "RenderMask resource not exist. Disable RenderMask.");
            enabled = false;
            return;
        }

        if (renderMaskMeshBoth == null)
        {
            renderMaskMeshBoth = GetEyeBothMesh(renderMaskMeshLeft, renderMaskMeshRight);
            var MeshXOffset = Mathf.Max(Mathf.Abs(renderMaskMeshLeft.bounds.max.x), Mathf.Abs(renderMaskMeshRight.bounds.min.x));
            renderMaskMaterial.SetFloat("MeshXOffset", MeshXOffset);
        }

        foreach (var d in data)
        {
            if (d.eye == WVR_Eye.WVR_Eye_Left)
            {
                var cmdBuf = new CommandBuffer();
                cmdBuf.name = "WVRMaskLeft";
                cmdBuf.DrawMesh(renderMaskMeshLeft, Matrix4x4.identity, renderMaskMaterial, 0, 0);
                d.cmdBuf = cmdBuf;
            }
            else if (d.eye == WVR_Eye.WVR_Eye_Right)
            {
                var cmdBuf = new CommandBuffer();
                cmdBuf.name = "WVRMaskRight";
                cmdBuf.DrawMesh(renderMaskMeshRight, Matrix4x4.identity, renderMaskMaterial, 0, 0);
                d.cmdBuf = cmdBuf;
            }
            else if (d.eye == WVR_Eye.WVR_Eye_Both)
            {
                var cmdBuf = new CommandBuffer();
                cmdBuf.name = "WVRMaskBoth";
                cmdBuf.DrawMesh(renderMaskMeshBoth, Matrix4x4.identity, renderMaskMaterial, 0, 1);
                d.cmdBuf = cmdBuf;
            }
        }
    }