public override void Render(RenderContext context, DeviceContextProxy deviceContext)
            {
                if (!enableReflector)
                {
                    return;
                }
                if (CreateCubeMapResources())
                {
                    RaiseInvalidateRender();
                    return; // Skip this frame if texture resized to reduce latency.
                }
                else if(!(IsDynamicScene || context.UpdateSceneGraphRequested || context.UpdatePerFrameRenderableRequested))
                {
                    return;
                }
                context.IsInvertCullMode = true;
                var camLook = Vector3.Normalize(context.Camera.LookDirection);

                Exception exception = null;
    #if TEST
                for (int index = 0; index < 6; ++index)
    #else
                Parallel.For(0, 6, (index) =>
    #endif
                {               
                    try
                    {
                        var ctx = contextPool.Get();
                        ctx.ClearRenderTargetView(cubeRTVs[index], context.RenderHost.ClearColor);
                        ctx.ClearDepthStencilView(cubeDSVs[index], DepthStencilClearFlags.Depth, 1, 0);
                        ctx.SetRenderTarget(cubeDSVs[index], cubeRTVs[index]);
                        ctx.SetViewport(ref viewport);
                        ctx.SetScissorRectangle(0, 0, FaceSize, FaceSize);
                        var transforms = new GlobalTransformStruct();
                        transforms.Projection = cubeFaceCameras.Cameras[index].Projection;
                        transforms.View = cubeFaceCameras.Cameras[index].View;
                        transforms.Viewport = new Vector4(FaceSize, FaceSize, 1/FaceSize, 1/FaceSize);
                        transforms.ViewProjection = transforms.View * transforms.Projection;

                        modelCB.Upload(ctx, ref transforms);

                        var frustum = new BoundingFrustum(transforms.ViewProjection);
                        //Render opaque
                        for (int i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i)
                        {
                            var node = context.RenderHost.PerFrameOpaqueNodes[i];
                            if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum))
                            {
                                node.Render(context, ctx);
                            }
                        }
                        //Render particle
                        for (int i = 0; i < context.RenderHost.PerFrameParticleNodes.Count; ++i)
                        {
                            var node = context.RenderHost.PerFrameParticleNodes[i];
                            if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum))
                            {
                                node.Render(context, ctx);
                            }
                        }
                        commands[index] = ctx.FinishCommandList(true);
                        contextPool.Put(ctx);
                    }
                    catch(Exception ex)
                    {
                        exception = ex;
                    }                
                }
    #if !TEST
                );
    #endif
                context.IsInvertCullMode = false;
                if (exception != null)
                {
                    throw exception;
                }          
                for (int i = 0; i < commands.Length; ++i)
                {
                    if (commands[i] != null)
                    {
                        Device.ImmediateContext.ExecuteCommandList(commands[i], true);
                        Disposer.RemoveAndDispose(ref commands[i]);
                    }
                }
                deviceContext.GenerateMips(CubeMap);
                context.UpdatePerFrameData(true, false, deviceContext);
            }
        protected override void OnRender(RenderContext context, DeviceContextProxy deviceContext)
        {
            if (CreateCubeMapResources())
            {
                InvalidateRenderer();
                return; // Skip this frame if texture resized to reduce latency.
            }
            context.IsInvertCullMode = true;
#if TEST
            for (int index = 0; index < 6; ++index)
#else
            Parallel.For(0, 6, (index) =>
#endif
            {
                var ctx = contextPool.Get();
                ctx.DeviceContext.ClearRenderTargetView(cubeRTVs[index], context.RenderHost.ClearColor);
                ctx.DeviceContext.ClearDepthStencilView(cubeDSVs[index], DepthStencilClearFlags.Depth, 1, 0);
                ctx.DeviceContext.OutputMerger.SetRenderTargets(cubeDSVs[index], cubeRTVs[index]);
                ctx.DeviceContext.Rasterizer.SetViewport(viewport);
                ctx.DeviceContext.Rasterizer.SetScissorRectangle(0, 0, FaceSize, FaceSize);
                var transforms = new GlobalTransformStruct();
                transforms.Projection = cubeFaceCameras.Cameras[index].Projection;
                transforms.View = cubeFaceCameras.Cameras[index].View;
                transforms.Viewport = new Vector4(FaceSize, FaceSize, 1/FaceSize, 1/FaceSize);
                transforms.ViewProjection = transforms.View * transforms.Projection;

                ModelConstBuffer.UploadDataToBuffer(ctx, ref transforms);

                var frustum = new BoundingFrustum(transforms.ViewProjection);
                //Render opaque
                for (int i = 0; i < context.RenderHost.PerFrameOpaqueNodes.Count; ++i)
                {
                    var node = context.RenderHost.PerFrameOpaqueNodes[i];
                    if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum))
                    {
                        node.Render(context, ctx);
                    }
                }
                //Render particle
                for (int i = 0; i < context.RenderHost.PerFrameParticleNodes.Count; ++i)
                {
                    var node = context.RenderHost.PerFrameParticleNodes[i];
                    if (node.GUID != this.GUID && !IgnoredGuid.Contains(node.GUID) && node.TestViewFrustum(ref frustum))
                    {
                        node.Render(context, ctx);
                    }
                }
                commands[index] = ctx.DeviceContext.FinishCommandList(false);
                contextPool.Put(ctx);
            }
#if !TEST
            );
#endif
            context.IsInvertCullMode = false;
            for (int i = 0; i < commands.Length; ++i)
            {
                Device.ImmediateContext.ExecuteCommandList(commands[i], true);
                commands[i].Dispose();
            }
            deviceContext.DeviceContext.GenerateMips(CubeMap);
            context.UpdatePerFrameData(true, false);
        }