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