コード例 #1
0
        /// <summary>
        /// Resizes the backbuffer.
        /// </summary>
        /// <param name="width">Width of the back buffer</param>
        /// <param name="height">Height of the back buffer</param>
        public override void Resize(int width, int height)
        {
            //Do not resize if the dimensions have not changed
            if (_presentParams.BackBufferHeight == height && _presentParams.BackBufferWidth == width)
            {
                return;
            }
            _resetting = true;
            _presentParams.BackBufferWidth  = width;
            _presentParams.BackBufferHeight = height;

            //If resizing in full screen, resize the target/front buffer otherwise bad things seem to happen
            if (_isFullScreen)
            {
                DXGI.ModeDescription modeDesc = new DXGI.ModeDescription();
                modeDesc.Format      = D3D10Helper.ToD3DSurfaceFormat(_presentParams.BackBufferFormat);
                modeDesc.Width       = width;
                modeDesc.Height      = height;
                modeDesc.RefreshRate = new SDX.Rational(0, 0);
                _swapChain.ResizeTarget(modeDesc);
            }

            //Resize the swap chain back buffer
            DestroyViews();
            _swapChain.ResizeBuffers(1, width, height, D3D10Helper.ToD3DSurfaceFormat(_presentParams.BackBufferFormat), DXGI.SwapChainFlags.AllowModeSwitch);
            CreateViews();

            _resetting = false;
        }
コード例 #2
0
        protected override void OnResize(System.EventArgs e)
        {
            if (SwapChain != null)
            {
                // Do things here.
                Util.ReleaseCom(ref RenderTargetView);
                Util.ReleaseCom(ref DepthStencilView);
                Util.ReleaseCom(ref DepthStencilBuffer);

                // Resize the render target
                SwapChain.ResizeBuffers(1, ClientSize.Width, ClientSize.Height, Format.R8G8B8A8_UNorm, SwapChainFlags.None);
                using (var resource = SlimDX.Direct3D11.Resource.FromSwapChain <Texture2D>(SwapChain, 0))
                {
                    RenderTargetView = new RenderTargetView(Device, resource);
                }

                // Create the depth/stencil buffer and view
                var depthBufferDesc = new Texture2DDescription
                {
                    ArraySize         = 1,
                    BindFlags         = BindFlags.DepthStencil,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    Format            = Format.D32_Float,
                    Height            = ClientSize.Height,
                    Width             = ClientSize.Width,
                    MipLevels         = 1,
                    OptionFlags       = ResourceOptionFlags.None,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage             = ResourceUsage.Default
                };

                DepthStencilBuffer = new Texture2D(Device, depthBufferDesc);

                var depthStencilViewDesc = new DepthStencilViewDescription
                {
                    ArraySize       = 0,
                    Format          = Format.D32_Float,
                    Dimension       = DepthStencilViewDimension.Texture2D,
                    MipSlice        = 0,
                    Flags           = 0,
                    FirstArraySlice = 0
                };

                DepthStencilView = new DepthStencilView(Device, DepthStencilBuffer, depthStencilViewDesc);

                ImmediateContext.OutputMerger.SetTargets(DepthStencilView, RenderTargetView);

                // Set up viewport, render target (back buffer on swap chain), and render target view
                // TODO KAM: Do the viewports actually need adjusting here? Probably?
                Viewport = new Viewport(0.0f, 0.0f, ClientSize.Width, ClientSize.Height, 0.0f, 1.0f);
                ImmediateContext.Rasterizer.SetViewports(Viewport);

                base.OnResize(e);
            }
        }
コード例 #3
0
        private void CreateView(int width, int height)
        {
            if (width <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(width));
            }

            if (height <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(height));
            }

            Destroy();

            mWidth  = width;
            mHeight = height;

            Execution.ExecuteOnUiThread(() =>
            {
                mOffScreenWindow                 = new Form();
                mOffScreenWindow.Left            = -65535;
                mOffScreenWindow.Top             = -65535;
                mOffScreenWindow.FormBorderStyle = FormBorderStyle.None;
                mOffScreenWindow.Width           = 1;
                mOffScreenWindow.Height          = 1;
                mOffScreenWindow.ShowInTaskbar   = false;
                mOffScreenWindow.Show();
                mOffScreenWindow.Hide();
            });

            var description = new SwapChainDescription
            {
                BufferCount       = 1,
                IsWindowed        = true,
                ModeDescription   = new ModeDescription(0, 0, new Rational(60, 1), Format.B8G8R8A8_UNorm),
                SampleDescription = new SampleDescription(1, 0),
                Usage             = Usage.RenderTargetOutput | Usage.Shared,
                OutputHandle      = mOffScreenWindow.Handle
            };

            mSwapChain    = mDevice.CreateSwapChain(description);
            mPixelShader  = new PixelShader(Device, Bytecode);
            mVertexShader = new VertexShader(Device, mVertexShaderBytecode);
            mVertexBuffer = CreateVertexBuffer(out mVertices);

            Execution.ExecuteOnUiThread(() =>
            {
                mOffScreenWindow.Width  = mWidth;
                mOffScreenWindow.Height = mHeight;
            });

            mSwapChain.ResizeBuffers(1, mWidth, mHeight, Format.B8G8R8A8_UNorm, SwapChainFlags.None);
            Device.ImmediateContext.Rasterizer.SetViewports(new Viewport(0.0f, 0.0f, mWidth, mHeight));

            Device.ImmediateContext.Rasterizer.State =
                RasterizerState.FromDescription(Device,
                                                new RasterizerStateDescription
            {
                CullMode = CullMode.None,
                FillMode = FillMode.Solid
            });

            mRenderTarget = new HardwareRenderTarget(mDevice, mSwapChain);
        }