public void Draw(double deltaTime, Camera camera)
        {
            if (MeshRenderer == null)
            {
                return;
            }

            var drawMeshDic = new Dictionary <Material, List <SubMesh> >();

            for (var i = 0; i < MeshRenderer.MaterialCount; i++)
            {
                var mat = MeshRenderer.GetMaterialAt(i);
                drawMeshDic.Add(mat, new List <SubMesh>());
            }
            foreach (var sm in MeshRenderer.Mesh.subMeshes)
            {
                var mat = MeshRenderer.GetMaterial(sm.materialIndex);
                drawMeshDic[mat].Add(sm);
            }

            var sp = new ShaderUniqueParameter()
            {
                camera          = camera,
                cameraDir       = camera.WorldDirection,
                cameraPos       = camera.Transform.WorldPosition,
                deltaTime       = deltaTime,
                dirLight        = DirLight,
                environmentMap  = camera.EnvironmentMap,
                proj            = Projection,
                resolution      = new Vector2(MMW.Width, MMW.Height),
                projInverse     = Projection.Inverted(),
                view            = View,
                viewInverse     = View.Inverted(),
                viewProj        = View * Projection,
                viewProjInverse = (View * Projection).Inverted(),
                world           = Model,
                worldInv        = Model.Inverted(),
                skinning        = false,
                morphing        = false,
            };

            sh.UseShader();
            sh.SetUniqueParameter(sp, true);
            foreach (var mat in drawMeshDic)
            {
                mat.Key.ApplyShaderParam();
                foreach (var sub in mat.Value)
                {
                    sh.SetUniqueParameter(sp, false);
                    Drawer.DrawSubMesh(sub);
                }
            }
            sh.UnuseShader();
        }