예제 #1
0
        /// <summary>
        /// 描画
        /// </summary>
        public void Draw()
        {
            var context = GraphicsCore.ImmediateContext;

            UpdateDraw();

            {
                // シャドウマップ
                using (new MyGpuProfilePoint(context, "Create ShadowMap")) {
                    shadowMap_.BeginRender(context);
                    {
                        SceneDraw(context);
                    }
                    shadowMap_.EndRender(context);
                }

                // キューブマップ
                if (cubeMapRenderEnable_ && !cubeMapRendered_)
                {
                    RenderCubeMap();
                    cubeMapRendered_ = true;
                }

                // ディファードパス
                using (new MyGpuProfilePoint(context, "Deferred Path")) {
                    // GBuffer
                    using (new MyGpuProfilePoint(context, "Render GBuffer")) {
                        GraphicsCore.CurrentDrawCamera = GraphicsCore.Camera3D;
                        RenderGBuffer();
                    }
                    context.SetRenderTargets(new Texture[4], null);                     // unbind

                    // ライティングCS
                    using (new MyGpuProfilePoint(context, "Lighting")) {
                        csMgr_.Bind();
                        int x = Lib.ComputeShader.CalcThreadGroups(gbuffers_[0].Width, 32);
                        int y = Lib.ComputeShader.CalcThreadGroups(gbuffers_[0].Height, 32);
                        csMgr_.Dispatch(gbuffers_[0].Width, gbuffers_[0].Height);
                        csMgr_.UnBind();
                    }
                }

                // フォワードパス
                using (new MyGpuProfilePoint(context, "Forward Path")) {
                    context.SetRenderTargets(forwardBuffer_.color_buffer_, forwardBuffer_.depth_stencil_);
                    {
                        // キューブマップデバッグ
                        if (cubeMapRenderEnable_)
                        {
                            //globalCapture_.DebugDraw();
                            //foreach (var c in localCapture_) {
                            //	c.DebugDraw();
                            //}
                        }

                        //// ライトのデバッグ描画
                        //if (ViewModel.IsDrawLights
                        //	&& ViewModel.ViewIndex == (int)ViewItems.Type.Result
                        //	&& ViewModel.TiledRenderView != (int)TiledRenderItems.Type.LightCount
                        //	) {
                        //	lightMgr_.DebugDraw();
                        //}
                    }
                }

                // トーンマップ
                using (new MyGpuProfilePoint(context, "HDR Resolve")) {
                    if (viewModel_.IsEnableToneMap)
                    {
                        toneMap_.CalcLuminance(context, uav_);
                        context.SetRenderTargets(hdrResultBuffer_.color_buffer_, null);
                        toneMap_.KeyValue = viewModel_.ToneMapKeyValue;
                        toneMap_.ResolveHDR(context, uav_);
                    }
                    else
                    {
                        context.SetRenderTargets(hdrResultBuffer_.color_buffer_, null);
                        toneMap_.ResolveGamma(context, uav_);
                    }
                }

                // 最終レンダリング
                GraphicsCore.BeginRender();
                {
                    context.ClearDepthStencil(GraphicsCore.DefaultDepthBuffer, 1.0f);

                    // ライティング結果
                    if (ViewModel.IsEnableFXAA && ViewModel.ViewIndex == (int)ViewItems.Type.Result)
                    {
                        using (new MyGpuProfilePoint(context, "FXAA")) {
                            fxaaPrim_.Draw(context);
                        }
                    }
                    else
                    {
                        prim_.Draw(context);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// 描画
        /// </summary>
        public void Draw()
        {
            var context = GraphicsCore.ImmediateContext;

            UpdateDraw();

            {
                // GBuffer
                using (new ksGpuProfilePoint(context, "Render GBuffer")) {
                    MyRenderer.CurrentDrawCamera = MyRenderer.Camera3D;
                    RenderGBuffer();
                }

                var framebuffer = new MyRenderer.FrameBuffer();
                var edgeBuffer  = hdrResolveBuffer_;
                // アウトライン検出
                using (new ksGpuProfilePoint(context, "Outline")) {
                    framebuffer.color_buffer_ = new Texture[] { hdrResolveBuffer_ };
                    context.SetRenderTargets(framebuffer.color_buffer_, framebuffer.depth_stencil_);
                    prim_.GetMaterial().SetShader("Outline");
                    prim_.GetMaterial().SetShaderViewPS(0, gbuffers_[0]);
                    prim_.GetMaterial().SetShaderViewPS(1, gbuffers_[1]);
                    prim_.GetMaterial().BlendState = RenderState.BlendState.None;
                    prim_.Draw(context);

                    //framebuffer.color_buffer_ = new Texture[] { gbuffers_[1] };
                    //ksRenderer.BeginRender(framebuffer);
                    //fxaaPrim_.GetMaterial().SetShaderViewPS(0, hdrResolveBuffer_);
                    //fxaaPrim_.Draw();
                    //ksRenderer.EndRender();
                    //edgeBuffer = gbuffers_[1];
                }

                // vertexIDによるスプライト描画
                using (new ksGpuProfilePoint(context, "LineSprite")) {
                    framebuffer.color_buffer_ = new Texture[] { gbuffers_[0] };
                    context.SetRenderTargets(framebuffer.color_buffer_, framebuffer.depth_stencil_);
                    if (test)
                    {
                        MyRenderer.D3D11ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding());
                        lineSpriteMaterial_.SetShaderViewVS(0, edgeBuffer);
                        lineSpriteMaterial_.SetShaderViewPS(0, lineTexture_);
                        lineSpriteMaterial_.DepthState = RenderState.DepthState.None;
                        lineSpriteMaterial_.BlendState = RenderState.BlendState.Normal;
                        lineSpriteMaterial_.Setup(context);
                        Matrix ident = Matrix.Identity;
                        ShaderManager.SetUniformParams(ref ident);
                        MyRenderer.SetRasterizerState(RenderState.RasterizerState.CullNone);
                        int instance = hdrResolveBuffer_.Width * hdrResolveBuffer_.Height;
                        MyRenderer.D3D11ImmediateContext.DrawInstanced(6, instance, 0, 0);
                    }
                    else
                    {
                        prim_.GetMaterial().SetShader("Direct");
                        prim_.GetMaterial().SetShaderViewPS(0, hdrResolveBuffer_);
                        prim_.GetMaterial().BlendState = RenderState.BlendState.Normal;
                        prim_.Draw(context);
                    }
                }


                // 最終レンダリング
                MyRenderer.BeginRender();
                {
                    // ライティング結果
                    using (new ksGpuProfilePoint(context, "FXAA")) {
                        fxaaPrim_.GetMaterial().SetShaderViewPS(0, gbuffers_[0]);
                        fxaaPrim_.GetMaterial().BlendState = RenderState.BlendState.None;
                        fxaaPrim_.Draw(context);
                    }
                }
            }
        }
예제 #3
0
 public void DebugDraw(GraphicsContext context)
 {
     debugPrim_.Draw(context, (int)count_);
 }