Resize and Fullscreen (DXGI)

Verändert man die Dimension des Controls auf dem gerendert wird, stimmen die Dimension der Buffer nicht mehr mit der Dimension des Controls überein und es kommt zu Verzerrungen. Betroffen sind alle Rendertargets, der Viewport und die SwapChain. Es ist sinnvoll allen Rendertargets eine Resize-Methode zu implementieren, um sich selbst an die neuen Pixelabmessungen anzupassen.


SwapChain Resize
Alle Objekte die aus der SwapChain erzeugt wurden, müssen vor dem Resize disposed werden.

'Dispose RenderTargetView
'
If Not _BackBufferRenderTargetView Is Nothing Then _BackBufferRenderTargetView.Dispose()
'

Ein Resize der SwapChain mit DXGI ist recht einfach und benötigt lediglich eine Zeile Code.

'Resize SwapChainBuffers
'
_SwapChain.ResizeBuffers(0, 0, 0, DXGI.Format.Unknown, DXGI.SwapChainFlags.None)
'

Nach dem Resize der SwapChainBuffer, erzeugen wir einen neuen RenderTargetView um wieder in den BackBuffer rendern zu können.

'New RenderTargetView
'
Using Resource = Direct3D11.Resource.FromSwapChain(Of Texture2D)(_SwapChain, 0)
  _BackBufferRenderTargetView = New RenderTargetView(_DX11Device.Device, Resource)
End Using
'


SwapChain FullScreen Switching

Das Switching der SwapChain in den FullScreen, wurde über die Tastenkombination Alt+Enter direkt in Windows implementiert. Unter Winforms scheint es damit aber Probleme zu geben. Die Entwickler von SlimDX empfehlen eine eingene Implementierung über Alt+Enter oder einer anderen Tastenkombination. Bei der Erstellung der SwapChain lässt sich die Windows-Implementierung deaktivieren. Um Probleme zu vermeiden, sollte die Anwendung vor dem Beenden wieder in den Fenstermodus geschaltet werden.

'Disable Alt+Enter
'
_DX11Device.Factory.SetWindowAssociation(_SwapChainDescription.OutputHandle, DXGI.WindowAssociationFlags.IgnoreAltEnter)
_SwapChain = New DXGI.SwapChain(_DX11Device.Factory, _DX11Device.Device, _SwapChainDescription)
'

Die einfachste Variante mit einer gültigen Auflösung in den Fullscreen zu wechseln, ist die aktuelle Desktopauflösung zu nutzen. Generell wird wohl empfohlen den gewünschten Resize immer im WindowMode durchzuführen, bevor in den FullScreen gewechselt wird.

Public Sub SwitchFullScreen()
  '#Get Render-Control
   Dim c As System.Windows.Forms.Control = System.Windows.Forms.Control.FromHandle(_SwapChainDescription.OutputHandle)

  If _SwapChain.IsFullScreen Then
      '#Switch to WindowMode
      _SwapChain.IsFullScreen = False
      '#Set WindowModeSize
      c.Size = New Drawing.Size(_ResX, _ResY)
  Else
      '#Save WindowModeSize
      _ResX = c.Width
      _ResY = c.Height
      '#Set Desktop ScreenSize
      c.Size = New Drawing.Size(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)
      '#Go FullScreen
       _SwapChain.IsFullScreen = True
      End If
End Sub
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s