Bien, ayer lo dejamos en un método de la clase Motor que queríamos emplear para detectar el hardware de DirectX. Vamos a completar ese método IniciarDX con un poco más de código pues nos falta lo más importante: el objeto device. Si veis la contrucción del método tenemos 3 parámetros, todos ByRef. Recordar que ByRef no crea copias del objeto que se recibe por lo que, cuando llamemos a este método desde FORM1, los objetos que lleguen desde FORM1 serán expuestos a este código y a las modificaciones que en él se hagan.
Public Sub IniciarDX(ByRef Objeto3D As Form, ByRef DP3 As Direct3D.Device, ByRef fs As Boolean)
A continuación de la línea Conf_Pantalla.AutoDepthStencilFormat = DepthFormat.D16 y antes del Catch (que está en verde) añadimos el siguiente código en la clase Motor.
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Objeto3D, CreateFlags.HardwareVertexProcessing, Conf_Pantalla)
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Software, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Reference, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
MessageBox.Show("La aplicación no ha podido inicializar DirectX", "Error inicio DX", MessageBoxButtons.OK, MessageBoxIcon.Error)
Application.Exit()
End If
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Software, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
DP3 = New Direct3D.Device(0, Direct3D.DeviceType.Reference, Objeto3D, CreateFlags.SoftwareVertexProcessing, Conf_Pantalla)
End If
If DP3 Is Nothing Then
MessageBox.Show("La aplicación no ha podido inicializar DirectX", "Error inicio DX", MessageBoxButtons.OK, MessageBoxIcon.Error)
Application.Exit()
End If
DP3 es el objeto Direct3D.Device que recibimos desde la llamada a IniciarDx en el FORM1 y lo que intentamos en esa primera línea es crear un nuevo objeto Device con los valores que tenemos que son;
- El Cero: representa al adaptador de gráficos por defecto del equipo, "la tarjeta gráfica". Se puede cambiar por Direct3D.Manager.Adapters(0).Adapter pero el cero es más rápido...
- DeviceType: El tipo de adaptador puede ser Hardware (más os vale), Software (emulación) y Reference. En caso de no tener gráfica 3d podeis usar Reference. Os permitirá emplear todas las funciones de la GPU simulándolas a través de la CPU, eso sí, no le pidais velocidad.
- En cuanto al procesado de vértices más de lo mismo: teneis procesado por hardware, software o mixto. El mejor por hardware evidentemente, por software tiene muchas limitaciones pero ya lo veremos con calma.
- Conf_Pantalla es nuestro objeto PresentParameters y hemos guardado en él todas las cosas que vimos en el post anterior.
Una vez hecho esto, si el objeto DP3 sigue siendo Nulo es que no hemos podido iniciar con esa configuración, entonces probamos de nuevo bajando el procesado de vértices a software y volvemos a comprobar, si está Nulo todavía, el tipo de dispositivo a software y otra vez. Así probando todas las combinaciones (hacia abajo en prestaciones) si al final no conseguimos iniciar sacamos un error.
Si conseguimos iniciar bien, el objeto DP3, que es ByRef, habrá sido modificado y esos cambios los tendremos disponibles en FORM1. Lo único que nos queda por hacer es ir a FORM1 a su código de evento del Load y completar:
Engine.IniciarDX(Me, Dispo3D, FS)
No hay comentarios:
Publicar un comentario