Módulo DirectX – Introducción ¿Qué es DirectX? Conjunto de API´s que permite a los desarrolladores de contenido interactivo acceder a características de hardware especializado sin tener que escribir código específico de hardware
Módulo DirectX – Introducción Componentes incluidos en DirectX Nos permiten desarrollar aplicaciones de alto rendimiento y en tiempo real API DirectPlay API DirectInput API DirectSound API DirectDraw API Direct3D
Módulo DirectX – Introducción Objetivos de DirectX Desarrollo de Aplicaciones Windows de alto rendimiento Tarjetas aceleradoras Plug´n Play Servicios de comunicaciones construidos bajo Windows Recursos instalados en el sistema Utilización del nuevo hardware implementado
Módulo DirectX – Introducción DirectX & COM (Component Object Model) Objeto: caja negra que representa el hardware y requiere comunicación con las aplicaciones a través de una interface. Método: comandos enviados y recibidos por el objeto a través de la interface COM Ej.: Método GetDisplayMode es enviado a través de la interface IDirectDraw2 para tomar el valor de la actual resolución de la pantalla mediante el objeto DirectDraw
Módulo DirectX – DirectDraw Se encarga del manejo de la memoria de vídeo Proporciona herramientas para Manipulación de múltiples buffers de vídeo Acceso directo a la memoria de vídeo Page flipping Back Buffering Manejo de la paleta gráfica Clipping
Módulo DirectX – DirectDraw Tipos de objetos IDirectDraw IDirectDrawSurface IDirectDrawPalette IDirectDrawClipper IDirectDrawVideoPort
Módulo DirectX – DirectDraw Conceptos Gráficos y Técnicos Bitmaps Superficies de dibujo (buffers) Blitting Page Flipping y Back Buffering Rectángulos Sprites Niveles cooperativos Modos de vídeo Buffers Overlays Clippers Video Ports
Ejemplo 1 Ejemplo 2 Ejemplo 3 Ejemplo 4 Ejemplo 5
Módulo DirectX – DirectSound Componente de Audio de DirectX: Mezclado de canales de audio Aceleración hardware Acceso directo al dispositivo de sonido Captura de Audio (versión 6)
Módulo DirectX – DirectSound Interfaces COM IDirectSoundBuffer IDirectSound3DBuffer IDirectSound3DListener IDirectSoundCapture IDirectSoundCaptureBuffer
Módulo DirectX – DirectPlay Simplifica el acceso de las aplicaciones a los servicios de comunicación Otorga independencia para la creación de servidores de juegos Comunicaciones Peer-to-Peer Cliente/Servidor Sesiones Lobby´s
Módulo DirectX – Direct3D Interfaz gráfica para hardware 3D Permitir gráficos tridimensionales interactivos en aplicaciones de Windows 2 Modos: Inmediato API 3D de bajo nivel Independiente del dispositivo Programadores experimentados Retenido Desarrollo rápidos Capa superior del inmediato
Módulo DirectX – Direct3D Conceptos Básicos Sistemas de coordenadas 3-D Left-handed (mano izquierda) Podemos simular el right-handed Transformaciones 3-D Traslación Rotación Escalado Polígonos Normales de cara y vértice Modos de sombreado Interpolaciones de triángulos
Módulo DirectX – Direct3D Conceptos Básicos Triángulos Reglas de rasterización de triángulos
Módulo DirectX – Direct3D (Modo Inmediato) Tipos de Objetos IDirectDraw IDirectDrawSurface IDirect3Ddevice IDirect3Dmaterial IDirect3Dviewport IDirect3Dlight IDirect3DexecuteBuffer
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMAnimation Define como será modificada una transformación acorde al valor tiempo La animación es ajustada mediante el método SetTime
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMAnimationSet Permite a IDirect3DRMAnimation que haya agrupación Compartirán el mismo parámetro tiempo Dim anim As IDirect3DRMAnimationSet D3DRM.CreateAnimationSet anim anim.Load App.Path & “anim.x”, 0, 0, 0, 0, animframe anim.SetTime 1
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMDevice Representa la visualización final del Render creado Soporta Devices que renderizan directamente a la pantalla, ventana o memoria de vídeo Dim Device As IDirect3DRMDevice D3DRM.CreateDeviceFromSurface …..
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMFace Representa un único objeto en un mesh
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMFrame Posiciona objetos en una escena y define las posiciones y orientaciones de los objetos visuales Escena: frame que no tiene “padre”, define el frame de referencia para todos los demás objetos Jerarquías y Motion (rotación y velocidad intrínseca)
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMInterpolator Guarda acciones y las aplica a otros objetos mediante cálculos automáticos Ej.: Background en el espacio tiempo 0 el color rojo y en el 10 el color verde. Coloreará de forma automática las escenas sucesivas para fundir desde el rojo al verde
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMLight Define uno de los 5 tipos de luces que son utilizadas para iluminar los objetos visuales de la escena Ambiente, Point, Spotlight, Directional y Parallel point La luz va contenida en un frame y consume mucho proceso de CPU
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMMaterial Define cómo una superficie refleja la luz IDirect3DRMMesh Podemos utilizarlo para manipular grupos de caras y vértices IDirect3DRMMeshBuilder Nos permite trabajar con vértices y caras individuales de un mesh. Realmente formará un objeto 3D en la escena
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMPickedArray Identifica un objeto visual que corresponde a un punto 2D determinado IDirect3DRMPicked2Array Suele ser utilizado para colisiones entre objetos IDirect3DRMShadow Define una sombra emitida por otro
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMObject Clase base utilizada por todos los demás objetos del modo retenido IDirect3DRMProgressiveMesh Permite la carga de objetos 3D mediante pequeñas porciones IDirect3DRMTexture Consta de un array rectangular de píxeles coloreados
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMViewport Define cómo la escena 3D es renderizada en un plano 2D (como una ventana de Windows) Cámara: renderiza lo que es visible a lo largo del eje Z positivo, con la dirección ascendente representada en el eje Y positivo Viewing Frustum: cámara en el pico de la pirámide. Serán visibles los objetos entre el front y el back clipping
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMVisual Representa cualquier cosa que pueda ser renderizada en una escena
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMWrap Calcula las coordenadas de textura para una cara o mesh. Tipo Frame de referencia Origen Vector de dirección Vector de altura Factores de escalado Origen para las coordenadas de textura
Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMWrap Tipos Wrapping Flags Flat Cylindrical Spherical Chrome
Módulo DirectX Programación Direct3D Ejemplo 1 Ejemplo 2
Programación Direct3D Decidir entre Clipper o FullScreen La programación se basa en frames. Puede contener uno o más objetos Cada objeto 3D debe ir enlazado a un frame determinado Cinco objetos básicos Device Viewport Scene World Camera
Programación Direct3D Inicio del Programa Option Explicit Objeto Direct3D M. retenido Dim D3DRM As IDirect3DRM3 Dim Scene As IDirect3DRMFrame3 Frame de escena Dim Camera As IDirect3DRMFrame3 Frame de cámara Dim clipper As IDirectDrawClipper Objeto Clipper Dim Device As IDirect3DRMDevice3 Objeto Device Dim Viewport As IDirect3DRMViewPort Objeto Viewport Dim LightFrame As IDirect3DRMFrame3 Frame de Luz Dim Light As IDirect3DRMLight Objeto Luz Dim Globe As IDirect3DRMMeshBuilder3 Mesh (objeto 3D) Dim globeframe As IDirect3DRMFrame3 Frame del Mesh Dim salir As Boolean Fin de la aplicación
Programación Direct3D Inicializar los objetos Direct3D Modo Retenido, Clipper, Viewport y Device. Se crean los frames correspondientes a la escena y la cámara, enlazando el frame cámara a de la escena para que la visualización sea posible Sub init_clipper() Creamos el objeto Direct3D Modo Retenido Direct3DRMCreate D3DRM Creamos el frame de la escena sin enlazarlo a ningún frame, puesto que será el frame padre D3DRM.CreateFrame Nothing, Scene Creamos el frame de cámara enlazándolo directamente al de la escena y lo posicionamos en 0,0,0 de X, Y y Z. Variando estos valores podremos mover la cámara hacia diferentes puntos de vista de la escena que hemos creado. D3DRM.CreateFrame Scene, Camera Camera.SetPosition Scene, 0, 0, 0 Creamos el clipper (ventana) DirectDrawCreateClipper 0&, clipper, Nothing clipper.SetHWnd 0, Me.hWnd Creamos el Device y el Viewport. El Device debemos enlazarlo al Clipper para que los gráficos 3D sean volcados en el mismo. En la creación del Viewport es necesario señalar el frame del Device y la cámara que utilicemos. D3DRM.CreateDeviceFromClipper clipper, ByVal 0&, 320, 200, Device D3DRM.CreateViewport Device, Camera, 0, 0, 320, 200, Viewport End Sub
Programación Direct3D ApplyTexture es un procedimiento encargado de crear el wrapper (envoltura) y la textura que se aplicarán a un objeto determinado. Los parámetros son: Meshbuilder que asigna el objeto que se verá afectado por la textura y StrTextureFileName que pasa el nombre del fichero que contiene la textura a aplicar Sub ApplyTexture(MeshBuilder As IDirect3DRMMeshBuilder3, ByVal strTextureFileName As String) Dim Box As D3DRMBOX Volumen del objeto Dim MaxY As Single Valor máximo Dim MinY As Single Valor mínimo Dim Height As Single Valor de alto Dim Wrap As IDirect3DRMWrap Wrapper Dim texture As IDirect3DRMTexture Textura Tomamos el objeto para crear una caja imaginaria que lo cubra MeshBuilder.GetBox Box MaxY = Box.Max.Y MinY = Box.Min.Y Height = MaxY – MinY
Programación Direct3D Creamos el wrapper con los valores obtenidos anteriormente D3DRM.CreateWrap D3DRMWRAP_CYLINDER, Nothing, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, MinY / Height, 1, -1 / Height, Wrap Aplicamos el wrapper al objeto Wrap.Apply MeshBuilder Cargamos la textura con la variable texture D3DRM.LoadTexture strTextureFileName, texture MeshBuilder.SetTexture texture Set texture = Nothing End Sub Mediante Form_Keypress detectamos si se ha pulsado una tecla para salir del programa automáticamente Private Sub Form_KeyPress(KeyAscii As Integer) salir = True End Sub
Programación Direct3D En este procedimiento de formulario iniciamos los valores necesarios pare crear los objetos que conformarán la escena 3D. Además, también gestionamos el bucle principal que permitirá la visualización de la escena en pantalla Private Sub Form_Load() Llamamos a init_clipper para crear los frames y el clipper init_clipper El método SetBack se aplica al frame Viewport. Se encarga de establecer el espacio en el cual es posible visualizar los objetos. Si un objeto, o parte de él, sobrepasa este valor, no será representado en pantalla Viewport.SetBack 5000 Asignamos la calidad de Render al dispositivo Device.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD Creamos un Frame en la escena para asignar una fuente de luz D3DRM.CreateFrame Scene, LightFrame Creamos un objeto de luz tipo direccional D3DRM.CreateLightRGB D3DRMLIGHT_DIRECTIONAL, 0.8, 0.8, 0.8, Light Asignamos el objeto al frame anterior LightFrame.AddLight Light
Programación Direct3D Dim light2 As IDirect3DRMLight Objeto luz ambiente Es necesario crear una luz de tipo ambiente para definir la claridad por defecto que ofrecerá el Render. Sin luz ambiente no lograremos visualizar bien la escena D3DRM.CreateLightRGB D3DRMLIGHT_AMBIENT, 0.4, 0.4, 0.4, light2 Aplicamos la luz en la escena Scene.AddLight light2 Posicionamos la luz direccional en la escena LightFrame.SetPosition Scene, 0, 0, 0 Posicionamos la cámara para ajustar el punto de vista Camera.SetPosition Scene, 0, 0, 0 Camera.SetOrientation Scene, 0, 0, 1, 0, 1, 0 Creamos el objeto visual (Esfera) y su frame correspondiente D3DRM.CreateFrame Scene, globeframe D3DRM.CreateMeshBuilder Globe Mediante el método Load asignamos el path que contiene el objeto Globe.Load App.Path & "globe.x", 0, D3DRMLOAD_FROMFILE, 0, 0 Establecemos la calidad que tendrá el objeto de cara al Render Globe.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD
Programación Direct3D Dependiendo del punto de vista del observador, hay veces en que las texturas de los objetos parecen descolocarse u ofrecen una representación visual muy distinta a la que deberían tener en un principio. Mediante la corrección de perspectiva se soluciona este pequeño problema. Para ello, hay que establecer en true el método SetPerspective que apliquemos al objeto Globe.SetPerspective 1 Asignamos el objeto a su frame y establecemos sus posiciones en la escena globeframe.AddVisual Globe globeframe.SetPosition Scene, 0, 0, 5 globeframe.SetOrientation Scene, 0, 0, 1, 0, 1, 0 Ponemos una rotación al objeto para animarlo constantemente globeframe.SetRotation Scene, 1, 1, 1, 0.17 Le asignamos la textura ApplyTexture Globe, App.Path & "fire.bmp" Vaciamos los objetos que representan las Fuentes de luz Set LightFrame = Nothing Set Light = Nothing
Programación Direct3D Bucle principal While salir = False Dibuja en pantalla el render obtenido redraw_clipper DoEvents Wend Descarga el formulario cuando se acabe la aplicación vacia_clipper Unload Me End Sub Descarga los objetos DirectX creados Sub vacia_clipper() Set Scene = Nothing Set Camera = Nothing Set Viewport = Nothing Set Device = Nothing Set D3DRM = Nothing Set clipper = Nothing End Sub
Programación Direct3D Dibuja en pantalla el Render obtenido. Recordemos que el Render se alberga primero en el backbuffer y luego se vuelca automáticamente a la ventana Public Sub redraw_clipper() On Error GoTo mi_Error Aplica las rotaciones y velocidades para todos los frames de la jerarquía Scene.Move 1 Borra el Viewport con el color actual del background Viewport.Clear Renderiza una jerarquía de frames al Viewport utilizado. Sólo serán renderizados aquellos objetos visuales que estén en esa jerarquía de frames Viewport.Render Scene Copia la imagen que ha sido renderizada a la pantalla o buffer de destino Device.Update Exit Sub mi_Error: Resume End Sub