コード例 #1
0
        private ShaderResourceViewProxy CreateRenderTarget(int width, int height, MSAALevel msaa)
        {
#if MSAA
            MSAA = msaa;
#endif
            TargetWidth  = width;
            TargetHeight = height;
            DisposeBuffers();
            ColorBufferSampleDesc = GetMSAASampleDescription();
            OnCreateRenderTargetAndDepthBuffers(width, height, UseDepthStencilBuffer, out colorBuffer, out depthStencilBuffer);
            backBuffer = OnCreateBackBuffer(width, height);
            backBuffer.CreateRenderTargetView();
            fullResPPBuffer         = Collect(new PingPongColorBuffers(Format, width, height, this.deviceResources));
            fullResDepthStencilPool = Collect(new TexturePool(this.deviceResources, new Texture2DDescription()
            {
                Width             = width,
                Height            = height,
                ArraySize         = 1,
                BindFlags         = BindFlags.DepthStencil,
                CpuAccessFlags    = CpuAccessFlags.None,
                Usage             = ResourceUsage.Default,
                MipLevels         = 1,
                OptionFlags       = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0)
            }));
            Initialized = true;
            OnNewBufferCreated?.Invoke(this, new Texture2DArgs(backBuffer));
            return(backBuffer);
        }
コード例 #2
0
        private ShaderResourceViewProxy CreateRenderTarget(int width, int height, MSAALevel msaa)
        {
#if MSAA
            MSAA = msaa;
#endif
            TargetWidth  = width;
            TargetHeight = height;
            DisposeBuffers();
            ColorBufferSampleDesc = GetMSAASampleDescription();
            OnCreateRenderTargetAndDepthBuffers(width, height, UseDepthStencilBuffer, out colorBuffer, out depthStencilBuffer);
            backBuffer = OnCreateBackBuffer(width, height);
            backBuffer.CreateRenderTargetView();
            Initialized = true;
            OnNewBufferCreated?.Invoke(this, new Texture2DArgs(backBuffer));
            return(backBuffer);
        }
コード例 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="createDepthStencilBuffer"></param>
        /// <param name="colorBuffer"></param>
        /// <param name="depthStencilBuffer"></param>
        /// <returns></returns>
        protected virtual void OnCreateRenderTargetAndDepthBuffers(int width, int height, bool createDepthStencilBuffer,
                                                                   out ShaderResourceViewProxy colorBuffer, out ShaderResourceViewProxy depthStencilBuffer)
        {
            var sampleDesc  = ColorBufferSampleDesc;
            var optionFlags = ResourceOptionFlags.None;

            var colordesc = new Texture2DDescription
            {
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                Format            = Format.B8G8R8A8_UNorm,
                Width             = width,
                Height            = height,
                MipLevels         = 1,
                SampleDescription = sampleDesc,
                Usage             = ResourceUsage.Default,
                OptionFlags       = optionFlags,
                CpuAccessFlags    = CpuAccessFlags.None,
                ArraySize         = 1
            };

            colorBuffer = Collect(new ShaderResourceViewProxy(Device, colordesc));
            colorBuffer.CreateRenderTargetView();
            colorBuffer.CreateTextureView();
            if (createDepthStencilBuffer)
            {
                var depthdesc = new Texture2DDescription
                {
                    BindFlags         = BindFlags.DepthStencil,
                    Format            = Format.D32_Float_S8X24_UInt,
                    Width             = width,
                    Height            = height,
                    MipLevels         = 1,
                    SampleDescription = sampleDesc,
                    Usage             = ResourceUsage.Default,
                    OptionFlags       = ResourceOptionFlags.None,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    ArraySize         = 1,
                };
                depthStencilBuffer = Collect(new ShaderResourceViewProxy(Device, depthdesc));
                depthStencilBuffer.CreateDepthStencilView();
            }
            else
            {
                depthStencilBuffer = null;
            }
        }
コード例 #4
0
 private void EnsureTextureResources(int w, int h, DeviceContextProxy deviceContext)
 {
     if (w != width || h != height)
     {
         RemoveAndDispose(ref ssaoView);
         width  = w;
         height = h;
         if (width > 10 && height > 10)
         {
             ssaoTextureDesc.Width  = width;
             ssaoTextureDesc.Height = height;
             ssaoView = new ShaderResourceViewProxy(deviceContext, ssaoTextureDesc);
             ssaoView.CreateTextureView();
             ssaoView.CreateRenderTargetView();
         }
     }
 }
コード例 #5
0
            private bool CreateRenderTargets(int width, int height)
            {
                if (currWidth == width || currHeight == height)
                {
                    return(false);
                }
                DisposeAllTargets();
                currWidth  = width;
                currHeight = height;
                var tex2DDesc = new Texture2DDescription()
                {
                    Width             = width,
                    Height            = height,
                    ArraySize         = 1,
                    MipLevels         = 1,
                    SampleDescription = new SampleDescription(1, 0),
                    BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    Usage             = ResourceUsage.Default,
                    CpuAccessFlags    = CpuAccessFlags.None,
                };

                tex2DDesc.Format = Format.R32G32_Float;
                minMaxZTarget0   = new ShaderResourceViewProxy(Device, tex2DDesc);
                minMaxZTarget0.CreateRenderTargetView();
                minMaxZTarget0.CreateTextureView();
                minMaxZTarget1 = new ShaderResourceViewProxy(Device, tex2DDesc);
                minMaxZTarget1.CreateRenderTargetView();
                minMaxZTarget1.CreateTextureView();
                minMaxZTargets[0]   = minMaxZTarget0;
                minMaxZTargets[1]   = minMaxZTarget1;
                tex2DDesc.Format    = Format.R8G8B8A8_UNorm;
                frontBlendingTarget = new ShaderResourceViewProxy(Device, tex2DDesc);
                frontBlendingTarget.CreateRenderTargetView();
                frontBlendingTarget.CreateTextureView();
                backBlendingTarget = new ShaderResourceViewProxy(Device, tex2DDesc);
                backBlendingTarget.CreateRenderTargetView();
                backBlendingTarget.CreateTextureView();
                return(true);
            }
コード例 #6
0
            /// <summary>
            ///
            /// </summary>
            /// <param name="width"></param>
            /// <param name="height"></param>
            /// <param name="createDepthStencilBuffer"></param>
            /// <param name="colorBuffer"></param>
            /// <param name="depthStencilBuffer"></param>
            /// <returns></returns>
            protected virtual void OnCreateRenderTargetAndDepthBuffers(int width, int height, bool createDepthStencilBuffer,
                                                                       out ShaderResourceViewProxy colorBuffer, out ShaderResourceViewProxy depthStencilBuffer)
            {
                var sampleDesc  = ColorBufferSampleDesc;
                var optionFlags = ResourceOptionFlags.None;

                var colordesc = new Texture2DDescription
                {
                    BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    Format            = Format,
                    Width             = width,
                    Height            = height,
                    MipLevels         = 1,
                    SampleDescription = sampleDesc,
                    Usage             = ResourceUsage.Default,
                    OptionFlags       = optionFlags,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    ArraySize         = 1
                };

                colorBuffer = new ShaderResourceViewProxy(Device, colordesc);
                colorBuffer.CreateRenderTargetView();
                colorBuffer.CreateTextureView();
                if (createDepthStencilBuffer)
                {
                    var depthdesc = new Texture2DDescription
                    {
                        BindFlags         = BindFlags.DepthStencil,
                        Format            = DepthStencilFormatHelper.ComputeTextureFormat(Format.D32_Float_S8X24_UInt, out var canUseAsShaderResource),
                        Width             = width,
                        Height            = height,
                        MipLevels         = 1,
                        SampleDescription = sampleDesc,
                        Usage             = ResourceUsage.Default,
                        OptionFlags       = ResourceOptionFlags.None,
                        CpuAccessFlags    = CpuAccessFlags.None,
                        ArraySize         = 1,
                    };
                    canUseAsShaderResource &= !HasMSAA;
                    if (canUseAsShaderResource)
                    {
                        depthdesc.BindFlags |= BindFlags.ShaderResource;
                    }
                    depthStencilBuffer = new ShaderResourceViewProxy(Device, depthdesc);
                    depthStencilBuffer.CreateDepthStencilView(
                        new DepthStencilViewDescription()
                    {
                        Format    = DepthStencilFormatHelper.ComputeDSVFormat(depthdesc.Format),
                        Dimension = HasMSAA ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D
                    });
                    if (canUseAsShaderResource)
                    {
                        depthStencilBuffer.CreateTextureView(new ShaderResourceViewDescription()
                        {
                            Format    = DepthStencilFormatHelper.ComputeSRVFormat(depthdesc.Format),
                            Dimension = global::SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                            Texture2D = new ShaderResourceViewDescription.Texture2DResource()
                            {
                                MipLevels = depthdesc.MipLevels
                            }
                        });
                    }
                }
                else
                {
                    depthStencilBuffer = null;
                }
            }
コード例 #7
0
        private bool CreateTextureResources(RenderContext context, DeviceContextProxy deviceContext)
        {
            var currSampleDesc = context.RenderHost.RenderBuffer.ColorBufferSampleDesc;

#if MSAASEPARATE
            hasMSAA = currSampleDesc.Count > 1 || currSampleDesc.Quality > 0;
#endif
            if (width != (int)context.ActualWidth || height != (int)context.ActualHeight ||
                sampleDesc.Count != currSampleDesc.Count || sampleDesc.Quality != currSampleDesc.Quality)
            {
                RemoveAndDispose(ref colorTarget);
                RemoveAndDispose(ref alphaTarget);
                RemoveAndDispose(ref colorTargetNoMSAA);
                RemoveAndDispose(ref alphaTargetNoMSAA);
                sampleDesc = currSampleDesc;

                width                       = (int)context.ActualWidth;
                height                      = (int)context.ActualHeight;
                colorDesc.Width             = alphaDesc.Width = width;
                colorDesc.Height            = alphaDesc.Height = height;
                colorDesc.SampleDescription = alphaDesc.SampleDescription = sampleDesc;
#if MSAASEPARATE
                if (hasMSAA)
                {
                    colorDesc.BindFlags = alphaDesc.BindFlags = BindFlags.RenderTarget;
                }
                else
#endif
                {
                    colorDesc.BindFlags = alphaDesc.BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource;
                }

                colorTarget = Collect(new ShaderResourceViewProxy(Device, colorDesc));
                alphaTarget = Collect(new ShaderResourceViewProxy(Device, alphaDesc));


                colorTarget.CreateRenderTargetView();
                alphaTarget.CreateRenderTargetView();
#if MSAASEPARATE
                if (!hasMSAA)
#endif
                {
                    alphaTarget.CreateTextureView();
                    colorTarget.CreateTextureView();
                    colorTargetNoMSAA = colorTarget;
                    alphaTargetNoMSAA = alphaTarget;
                }
#if MSAASEPARATE
                else
                {
                    colorDesc.SampleDescription = alphaDesc.SampleDescription = new SampleDescription(1, 0);
                    colorDesc.BindFlags         = alphaDesc.BindFlags = BindFlags.ShaderResource;
                    colorTargetNoMSAA           = Collect(new ShaderResourceViewProxy(Device, colorDesc));
                    alphaTargetNoMSAA           = Collect(new ShaderResourceViewProxy(Device, alphaDesc));
                    colorTargetNoMSAA.CreateTextureView();
                    alphaTargetNoMSAA.CreateTextureView();
                }
#endif
                InvalidateRenderer();
                return(true); // Skip this frame if texture resized to reduce latency.
            }
            return(false);
        }