La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Víctor Roldán Betancort

Presentaciones similares


Presentación del tema: "Víctor Roldán Betancort"— Transcripción de la presentación:

1 Víctor Roldán Betancort
DIRECT 3D Víctor Roldán Betancort Raúl Sánchez Ruiz

2 ÍNDICE 1. Historia 2. Hal & Com 2.1. Hardware Abstraction Layer (HAL)
2.2. Component Object Model (COM) 3. Principios de La Programación de Gráficos en Direct3D 4. Arquitectura: La Tubería De Direct3D (Direct3D-Pipeline) 5. Tubería de Transformaciones 6. Transformaciones del Mundo 7. Transformaciones De Vista 8. Transformaciones De La Proyección 9. Puerto de Vista (ViewPorts) 10. Dispositivos De Direct3D 11. Buffers de Vertices (Vertex Buffers) 12. Renderizar una escena a partir de un buffer de vértices 13. Dibujar a Partir De Un Buffer De Índices (Index Buffer) 14. Conclusión Final y Comparativa entre Direct3D y OpenGL 15. Bibliografía

3 1. Historia (1) API de programación de Gráficos 3D Bill Gates
Era complicado el desarrollo de juegos para la plataforma Windows95 En 1995 Microsoft adquiere un motor 3D en desarrollo, “Reality Lab” de RenderMorphics, y lo integra en DirectX Directx 3.0 primera versión viable DirectX 5.0 primera versión realmente útil DirectX 6.0 presenta muchas mejoras (T&L por aceleración de HW, reorganización de las luces, materiales, objetos de puertos de vista…) Bill Gates

4 1. Historia (2) DirectX 7.0 fue altamente aceptada por desarrolladores de juegos: programación mucho mas sencilla e interfaz de programación atractiva La versión 8.0 introdujo las mayores mejoras de la historia de Direct3D: modificación de arquitectura (DirectX Graphics), menor uso de memoria y mas sencillo de programar, además de la inclusión de infinidad de nuevas técnicas. Primera vez que supera a OpenGL. La versión 9.0 no presenta muchos cambios frente a la 8.0. Destaca la mejora en los estándares de “Píxel & Vertex Shader” así como la introducción del HLSL. La versión 10 está al llegar, e incluye importantes cambios estructurales y un procesamiento muy optimizado.

5 2.1. HAL (1) Capa de software que abstrae de las peculiaridades de cada tarjeta gráfica, haciéndola ver como una entidad funcional El HAL informará sobre las capacidades de aceleración de hardware que presenta la tarjeta gráfica Accede al hardware de gráficos a través de su driver. La tarjeta debe ser compatible con Direct3D y el driver debe ofrecer una interfaz compatible. Cuatro modos de procesamiento de vértices Si la tarjeta no soporta determinadas características, se puede programar para ser emuladas por software (Pluggable Software Device, anteriormente HEL). Esto proporciona garantía de una alternativa cuando el hardware no presenta determinadas habilidades.

6 2.1. HAL (2)

7 2.2. COM Modelo de programación orientada a objetos muy utilizada por Microsoft Se trata de una porción de código que ofrece un determinado servicio a través de una interfaz compuesta de métodos. Generalmente es una librería de enlace dinámico (DLL) Ventajas: Las interfaces de los objetos COM nunca cambian Los objetos COM son independientes del lenguaje usado Es muy robustos Estas ventajas repercuten sobre la compatibilidad de DirectX: una aplicación programada en DirectX 3.0 funcionará en un computador con DirectX 9.0

8 3. Fundamentos De La Programación de Gráficos en Direct3D (1)
Al contrario que en OpenGL, Direct3D es levógiro por defecto, es decir, con la Z positiva entrando en la pantalla. Los vértices son la base de los gráficos 3D, serán usados para definir los objetos en el espacio.

9 3. Fundamentos De La Programación de Gráficos en Direct3D (2)
El usuario podrá definir qué estructura tendrá el tipo de dato vértice, en función de la información que interese alojar. Estructura típica: Struct Vertex { D3DVECTOR vPosition; DWORD dwDiffuse; D3DVECTOR vNormal; FLOAT u, v; }

10 3. Fundamentos De La Programación de Gráficos en Direct3D (3)
Cuando se posiciona un objeto en el espacio 3D, se necesita especificar su orientación, esto se consigue usando tres vectores. Estos vectores se usan para indicar: Hacia dónde está mirando el objeto Dónde es arriba para el objeto En qué posición se encuentra

11 3. Fundamentos De La Programación de Gráficos en Direct3D (4)
Direct3D sólo es capaz de renderizar 3 tipos de primitivas: puntos, líneas y triángulos El API se encargará de descomponer el objeto en triángulos Para obtener un rendimiento óptimo, todo objeto que el usuario defina deberá poder descomponerse en triángulos

12 4. Arquitectura: La Tubería De Direct3D (Direct3D-Pipeline) (1)
Se podría asemejar a una cadena de producción: al comienzo se tiene la materia prima, a partir de la cual, a lo largo de una serie de etapas, se van procesando para dar lugar a la imagen que se desea Es el planteamiento de esta tubería lo que convierte a Direct3D en un API de gráficos 3D potente y eficiente

13 4. Arquitectura: La Tubería De Direct3D (Direct3D-Pipeline) (2)
Etapas: Tessellation Vertex Processing Geometry Processing Píxel Processing Píxel Rendering Por tanto, se puede descomponer la tubería en dos grandes etapas: el procesamiento de vértices y el procesamiento de píxeles

14 4. Arquitectura: La Tubería De Direct3D (Direct3D-Pipeline) (3)
Procesamiento de Vértices Procesamiento de Píxeles

15 5. Tubería de Transformaciones (1)
Para modificar la escena, se lleva a cabo diversas transformaciones: transformaciones del mundo transformaciones de vista transformaciones de proyección transformaciones del modelo Se tiene un conjunto de vértices sobre los cuales se efectuará una serie de operaciones para obtener la escena final

16 5. Tubería de Transformaciones (2)
1º Se parte de vértices haciendo referencia al espacio de coordenadas locales 2º Se transforman a un espacio de coordenadas mundiales común a todos los objetos de la escena a través de la transformación del mundo

17 5. Tubería de Transformaciones (3)
3º Se reorientan en función de unas coordenadas de vista, que describen lo que ve el espectador, a través las transformaciones de vista (espacio de vista) 4º Se proyecta la escena 3D sobre un plano 2D, operando sobre los vértices, resultando el espacio de proyección mediante las transformaciones de proyección

18 5. Tubería de Transformaciones (4)
5º Se ejecuta el proceso de recortado y el conjunto de vértices resultante se transforma a las coordenadas de pantalla o dispositivo (conocido como espacio de despliegue) Transformaciones de modelo: no reubica vértices, sino que calcula valores de iluminación. El orden en el que se efectúa irrelevante.

19 5. Tubería de Transformaciones (5)
Todas las operaciones de transformación son cálculos a través de matrices Dichas transformaciones se especificarán haciendo uso de: Matriz del mundo Matriz de vista Matriz de proyección

20 6. Transformaciones del Mundo (1)
Las transformaciones básicas que se pueden realizar son rotaciones, translaciones y escalado Las transformaciones del mundo se efectúan concatenando diversas matrices de transformación para finalmente ser establecida como matriz del mundo

21 6. Transformaciones del Mundo (2)
Crear matriz de traslación: D3DXMatrixTranslation() Crear matriz de rotación en torno al eje X, Y, Z: D3DXMatrixRotationX() D3DXMatrixRotationY() D3DXMatrixRotationZ() Crear matriz de rotación en torno a un vector determinado: D3DXMatrixRotationAxis()

22 6. Transformaciones del Mundo (3)
Crear matriz de rotación en torno a ejes Z, X e Y consecutivamente: D3DXMatrixRotationYawPitchRoll() Crear matriz de escalado: D3DXMatrixScaling() El orden en que se concatenan las matrices es crucial. Las transformaciones ocurren en el orden en que se invocan las multiplicaciones

23 6. Transformaciones del Mundo (4)
EJEMPLO D3DXMATRIX matWorld; D3DXMatrixTranslation(&matWorld, 0,1,0); D3DXMATRIX matRotateX; D3DXMatrixRotationY(&matRotateY, 1.57); D3DXMatrixMultiply(&matWorld, &matRotateY, &matWorld); m_pd3dDevice -> SetTransform (D3DTS_WORLD, matWorld);

24 7. Transformaciones De Vista (1)
Construir una matriz de vista con un sistema de referencia levógiro. D3DXMatrixLookAtLH Se le pasa: Coordenadas del observador Dirección en la que está mirando el espectador Cual será la dirección que tomará como “arriba”

25 7. Transformaciones De Vista (2)
EJEMPLO D3DXMATRIX out; D3DXVECTOR3 eye(2,3,3); D3DXVECTOR3 at(0,0,0); D3DXVECTOR3 up(0,1,0); D3DXMatrixLookAtLH(&out, &eye, &at, &up); m_pd3dDevice->SetTransform (D3DTS_VIEW,&out);

26 8. Transformaciones De Proyección (1)
Cómo se plasmará la escena 3D que se observa en el plano 2D al que se proyecta y de qué forma se proyectará los elementos dentro del volumen de vista Direct3D proporciona las funciones para poder efectuar proyecciones en perspectiva y ortogonales

27 8. Transformaciones De Proyección (2)
Crea matriz de proyección levógiro: D3DXMatrixPerspectiveLH Construir matriz de proyección levógiro basándose en un campo de visión: D3DXMatrixPerspectiveFovLH Construir matriz de proyección levógiro personalizada D3DXMatrixPerspectiveOffCenterLH

28 8. Transformaciones De Proyección (3)
EJEMPLO D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_pd3dDevice -> SetTransform (D3DTS_PROJECTION, &matProj);

29 9. Puerto de Vista (ViewPorts)
Conceptualmente, es el plano 2D sobre el que se proyecta la escena 3D que hemos definido En Direct3D, las coordenadas de este plano son definidas sobre el dispositivo en que se renderiza la escena El rectángulo que define el puerto de vista se especifica a través de la estructura D3DVIEWPORT9 Se establece y obtiene con GetViewport() y SetViewport(), métodos de la interfaz de Direct3D

30 10. Dispositivos De Direct3D (1)
Componente de Direct3D que se encarga de la renderización, encapsulando y almacenando todo su estado También se encarga de las transformaciones y de las luces, así como del proceso de rasterizado Podemos distinguir tres grandes módulos que lo componen: el módulo de transformaciones, el módulo de iluminaciones y el módulo de rasterizado

31 10. Dispositivos De Direct3D (2)
Direct3D da soporte a dos tipos de dispositivos: HAL: efectúa trabajos mediante aceleración de hardware. Mejor rendimiento. Dispositivo de referencia: emular características que aún no están disponibles en el hardware presente Para crear un dispositivo, se invoca el método IDirect3D9::CreateDevice() Indicando si será HAL o de referencia Tipo de procesamiento de vértices Adaptador de video que usa

32 10. Dispositivos De Direct3D (3)
Se debe inicializar un conjunto de parámetros del dispositivo pasándole una estructura denominada D3DPRESENT_PARAMETERS, que controla: BackBuffers Intercambio de BackBuffers Buffers Z y Stencil Manejador del dispositivo de pantalla Frecuencia de refresco Pantalla Completa / Ventana

33 11. Buffers de Vertices (Vertex Buffers) (1)
Porciones de memoria que alojan vértices Estos buffers se suelen alojar en la memoria de video, desde donde se pueden efectuar los cálculos 3D mucho más rápido Permite poder memorizar escenas para presentarlas cuantas veces se desee sin necesidad de ser calculada cada vez que se presenta

34 11. Buffers de Vertices (Vertex Buffers) (2)
Se usa el método de la interfaz del dispositivo IDirect3DDevice9::CreateVertexBuffer Los vértices tienen una estructura variable (FVF o Flexible Vertex Format), por lo que se deberá especificar con una mascara que estructura poseen para crear el buffer acorde a su definición

35 11. Buffers de Vertices (Vertex Buffers) (3)
1. Posición del vértice  D3DFVF_XYZ 2. RJW (reciprocal of homogeneus w coordinate) sólo para vértices ya transformados  D3DFVF_XYZRHW 3. Normal del vértice  D3DFVF_NORMAL 4. Tamaño de punto del vértice  D3DFVF_PSIZE 5. Color difuso  D3DFVF_DIFFUSE 6. Color especular  D3DFVF_SPECULAR Ejemplo: #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)

36 11. Buffers de Vertices (Vertex Buffers) (4)
Para poder acceder al buffer, primero hay que bloquearlo. Para ello se usa la función IDirect3DVertexBuffer9::Lock() Luego se rellena el buffer con los vértices (por ejemplo, con un memcpy) Tras finalizar el uso de un buffer de vértices, habrá que desbloquearlo a través de IDirect3DVertexBuffer9::Unlock()

37 12. Renderizar una escena a partir de un buffer de vértices (1)
En primer lugar se debe especificar la fuente de los vértices, para lo cual se usa la función IDirect3DDevice9::SetStreamSource() El siguiente paso para el dibujo de una escena sería indicar el “vertex shader” a usar, mediante IDirect3DDevice9:: SetVertexShader() Ya estamos en disposición de dibujar la escena, esto se realiza a través de la función IDirect3DDevice9::DrawPrimitive()

38 12. Renderizar una escena a partir de un buffer de vértices (2)
D3DPT_POINTLIST: Renderiza un conjunto de puntos aislados. D3DPT_LINELIST: Renderiza los vértices como un conjunto de líneas aisladas D3DPT_LINESTRIP: Renderiza los vértices como un conjunto de líneas continuas D3DPT_TRIANGLELIST: Efectuar la renderización de los vértices como un conjunto de triángulos aislados. D3DPT_TRIANGLESTRIP: Se renderizará un conjunto de triángulos como una tira. D3DPT_TRIANGLEFAN: Renderiza los vértices como un abanico

39 12. Renderizar una escena a partir de un buffer de vértices (3)

40 12. Renderizar una escena a partir de un buffer de vértices (4)
EJEMPLO if(SUCCEEDED(d3dDevice->BeginScene())) { d3dDevice->SetStreamSource(0,m_pVB,sizeof(VERTICE)); d3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX); d3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2); d3dDevice->EndScene(); }

41 13. Dibujar a Partir De Un Buffer De Índices (Index Buffer) (1)
Los buffer de índices surgen para: Mejorar aprovechamiento de la memoria de video (en muchos modelos, las primitivas tienen vértices comunes que se podrían repetir) Mejora rendimiento (favorece el principio de localidad de la caché de video) Facilita diseño, ya que los vértices se deben dispone en el buffer en el orden en que se dibujan las primitivas

42 13. Dibujar a Partir De Un Buffer De Índices (Index Buffer) (2)

43 13. Dibujar a Partir De Un Buffer De Índices (Index Buffer) (3)
Se crean haciendo uso del método IDirect3DDevice9::CreateIndexBuffer() También requieren ser bloqueados previo uso (Lock()) y desbloquearlos al finalizar (UnLock()) En lugar establecer la fuente del buffer de vértices, establecemos las fuentes de los índices IDirect3DDevice9::SetIndices() En lugar de dibujar con DrawPrimitive(), se usa IDirect3DDevice9::DrawIndexedPrimitive()

44 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (1)
Ventajas Direct3D: Se ha convertido en un pilar básico en la programación de gráficos 3D en aplicaciones y juegos API muy fuerte y estable Garantía de soporte de nueva característica que surjan en la evolución del hardware gráfico Posiblemente el mejor API para Windows, ya que es desarrollado por Microsoft

45 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (2)
HAL: Abstracción del hardware Uso de modelo COM: Independencia del lenguaje usado Compatibilidad hacia atrás Eficiente incluso para ordenadores de gama baja Frente a OpenGL, soporta las ultimas características de hardware, mientras que este último requiere código personalizado dependiente del hardware

46 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (3)
Direct3D mas complicado de programar que OpenGL, pues trabaja a mas bajo nivel. Sin embargo, esto aporta versatilidad: OpenGL  Sencillo pero poco versátil Direct3D  Complejo pero muy versátil

47 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (4)
Desventajas Direct3D Lenta actualización, ya que se actualiza cada año o más, frente a la rápida evolución del hardware gráfico. Requiere mucho más código para inicializarse que OpenGL. Requerirá un buen conocimiento de cómo funciona, por lo que es mucho más complicado de aprender a usar que OpenGL. No es portable No es de estándar abierto, por lo que Microsoft es el único que puede implementarlo en sus sistema Dificultades de programación en C, debido a que es necesario acceder a los objetos COM a través de las V-Tables.

48 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (5)
Ventajas OpenGL: Relativamente sencillo de aprender Altamente portable Muy eficiente y fuerte también en cualquier plataforma Estándar abierto Desarrollo representa un amplio rango de intereses proveniente de muchas empresas Reconocido como el estándar de la industria de los gráficos, como en el campo del modelado 3D profesional, uso militar, CAD, etc, salvo en el campo de los juegos y aplicaciones, donde Direct3D ofrece una fuerte competencia

49 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (6)
Desventajas OpenGL: Extensiones muy dependientes de hardware especifico Elevado número de nombres diferentes para una misma función (Direct3D aprovecha sobrecarga) Poco soporte para todos los lenguajes de programación Actualizaciones aún más lentas que con Direct3D

50 14. Conclusión Final y Comparativa entre Direct3D y OpenGL (7)
Tanto OpenGL y Direct3D son igual de complicados de aprender, el problema está en que la programación de gráficos 3D en sí es muy complicada Si se desea aprender a programar gráficos 3D, cualquiera de los dos APIs es una buena elección En cualquier momento se podrá aprender a usar el otro, ya que las bases son las mismas

51 15. Bibliografía Microsoft DirectX 9.0 SDK Update (April 2005) Documentation Artículo: Direct3D vs. OpenGL: Which API to Use When, Where, and Why by Promit Roy, GameDev.net Direct3D vs. OpenGL: A Comparison, Beginning Direct3D By Vahid Kazemi, Cutting Edge Direct 3D Programming (Publisher: The Coriolis Group) Author(s): Stan Trujillo ISBN: Publication Date: 11/01/96 Beginning Direct3D Game Programming, Second Edition 2003, Wolfgang F. Engel, Premier Press. ISBN: x Tutoriales de Direct3D by Corday, 24 Octubre del 2001, basado en los textos de Wolfgang F. Engel, Apuntes de Informática Gráficas de la Ingeniería Informática de la Universidad de Salamanca creados por el Dr. Juan Manuel Corchado.

52 ¡Gracias Por No Dormirse!
(Super Mario Hecho Con 3DStudio Max Con Aceleración Por Hardware)


Descargar ppt "Víctor Roldán Betancort"

Presentaciones similares


Anuncios Google