Bueno vamos con una de las partes importantes. Tenemos que detectar si nuestro hardware vale o no para lo que queremos hacer. Existen múltiples rutinas de detección más o menos elaboradas, yo os dejo una que, a mi me funciona bien y no me da problemas. La idea es tener un método, en la clase Motor que permita realizar la Detección. Llamaremos al método pasándole una serie de objetos para ver si es capaz de inicializar DX.
En la clase Motor:
Public Sub IniciarDX(ByRef Objeto3D As Form, ByRef DP3 As Direct3D.Device, ByRef fs As Boolean)
Try
PantallaCompleta = fs
If PantallaCompleta = True Then
Modo_Pantalla.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
Modo_Pantalla.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
Modo_Pantalla.Format = Direct3D.Manager.Adapters(0).CurrentDisplayMode.Format
Ratio = CSng(Modo_Pantalla.Width / Modo_Pantalla.Height)
Conf_Pantalla.Windowed = Not (PantallaCompleta)
Conf_Pantalla.BackBufferCount = 1
Conf_Pantalla.BackBufferWidth = Modo_Pantalla.Width
Conf_Pantalla.BackBufferHeight = Modo_Pantalla.Height
Else
Conf_Pantalla.Windowed = True
End If
Conf_Pantalla.SwapEffect = SwapEffect.Discard
Conf_Pantalla.BackBufferFormat = Modo_Pantalla.Format
Conf_Pantalla.EnableAutoDepthStencil = False
'Conf_Pantalla.AutoDepthStencilFormat = DepthFormat.D16
Catch ex As Direct3DXException
MessageBox.Show(ex.Message)
End Try
End Sub
Try
PantallaCompleta = fs
If PantallaCompleta = True Then
Modo_Pantalla.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
Modo_Pantalla.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
Modo_Pantalla.Format = Direct3D.Manager.Adapters(0).CurrentDisplayMode.Format
Ratio = CSng(Modo_Pantalla.Width / Modo_Pantalla.Height)
Conf_Pantalla.Windowed = Not (PantallaCompleta)
Conf_Pantalla.BackBufferCount = 1
Conf_Pantalla.BackBufferWidth = Modo_Pantalla.Width
Conf_Pantalla.BackBufferHeight = Modo_Pantalla.Height
Else
Conf_Pantalla.Windowed = True
End If
Conf_Pantalla.SwapEffect = SwapEffect.Discard
Conf_Pantalla.BackBufferFormat = Modo_Pantalla.Format
Conf_Pantalla.EnableAutoDepthStencil = False
'Conf_Pantalla.AutoDepthStencilFormat = DepthFormat.D16
Catch ex As Direct3DXException
MessageBox.Show(ex.Message)
End Try
End Sub
Vamos a ver qué es cada cosa, con calma.
En primer lugar vemos que el IniciarDX recibe un obeto Objeto3D que es un form, DP3 hace referencia a un objeto tipo Device y fs a un boleano, como siempre, el FullScreen o no. Fijaros también que todos los valores son Byref, es decir, las modificaciones que realizo sobre ellos afectan al objeto de origen (el que invoca el método. Engine que está en FORM1).
Bien, Modo_Pantalla es un objeto DisplayMode que va a guardar 3 cosas que me interesan: el ancho, el alto y el formato de color que se emplee en ese momento en la pantalla.
Ratio se encarga de calcular la proporción entre ancho y alto, el famoso 4/3, 16/9, 16/10 de la pantalla. Es un valor que usaremos mucho.
Conf_Pantalla es del tipo PresentParameters y va a encargarse de todas estas cosas:
- AutoDepthStencilFormat
- El Depth/Stencil Buffer es un buffer adicional al Pixel Buffer y se encarga del área de render del pixel. La propiedad se ignora a menos que EnableAutoDepthStencil = True
- BackBufferCount
- Puede tomar valores desde cero a tres teniendo en cuanta que 0 y 1 es lo mismo. Dicho de otro modo, como mínimo necesitas un buffer.
- BackBufferFormat
- Controla la profundidad de color en el bakbuffer. En DX9 no se soportan modos de 8 ni de 24 bits. Cada modo es un mundo así que emplear CheckDeviceType para saber qué modos se pueden emplear y cuales no.
- BackBufferWidth - BackBufferHeight
- El ancho y el alto del backbuffer. En pantalla completa estas dimensiones DEBEN de ser un modo soportado de resoluciones. Mientras que, en modo ventana, las dimensiones pueden ser cualesquiera.
- DeviceWindow
- Para entendernos este es el Form asociado al Device, nuestro Form1.
- DeviceWindowHandle
- Funciona solamente como interoperatividad con el API de Win32, como no lo necesitamos...
- EnableAutoDepthStencil
- Ver AutoDepthStencilFormat, lo activa o no.
- ForceNoMultiThreadedFlag
- Si hay MultiThreading lo ponemos en true.
- FullScreenRefreshRateInHz
- Siempre 0 en modo ventana, en pantalla completa no le pongáis valor por que si os equivocais no se mueve el juego.
- MultiSample and MultiSampleQuality
- Para Antialiasing a pantalla completa.
- PresentationInterval
- Controla el tiempo de retraso entre que el BackBuffer se presenta en pantalla. Cero para modo ventana y un valor de los que figuran en PresentationInterval sino fallará.
- PresentFlag
- Comportamiento avanzado. Consultar DX SDK para más info.
- SwapEffect
- Esto controla cómo el backbuffer es presentado. Por defecto podeis poner Discard, esto hará que el Device elija por vosotros el método más apropiado. Copy sólo vale para un único BackBuffer y Flip para múltiples.
- Windowed
- Si es falso, DX cambiará automáticamente vuestro modo de pantalla a las dimensiones que tenga BackBuffer.
Bueno espero que el rollo no sea mucho.
No hay comentarios:
Publicar un comentario