miércoles, 12 de junio de 2013

2 .-. Detección del Hardware

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

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