Introduction to Computer Graphics with Managed DirectX and C# 2.0
Miguel Jiménez aka Migs Diego Muñoz aka Kartones
ilitia technologies
http://www.ilitia.com
Agenda
• • • • • • • • Teoría básica del espacio 3D Introducción a Managed DirectX Inicialización de dispositivos Primitivas, Meshes y Pipelines de renderización Texturización, Pixel Shaders y Vertex Shaders Camaras y acción en el espacio 3D Introducción a la demoscene Demonstración práctica de DirectX y C# 2.0
Teoría básica del espacio 3D
• El espacio se compone de 3 dimensiones
– Espacio Euclideo Linear – Dispone de 3 ejes, perpendiculares entre si
Teoría básica del espacio 3D
• Existen diferentes espacios 3D
– Espacio del Objeto (Object Space) – Espacio del Mundo (World Space) – Espacio de la Vista (Viewport Space) – Espacio de la Pantalla (Screen Space)
• Diferentes espacios son necesarios para diferentes movimientos y algoritmos
Teoría básica del espacio 3D
• Movimientos en el espacio 3D
– Translación – Rotación – Siempre con vectores
Teoría básica del espacio 3D
• Matématicas básicas del 3D
– Algebra!!! – Matrices y operaciones entre ellas – Vectores – Operaciones entre matrices y vectores – Trigonometría básica
• Seno, Coseno, Pi, Radianes, etc...
Introducción a Managed DirectX
• Set avanzado de APIs multimedia incluido en los sistemas operativos Windows • Managed DirectX es una capa completa del runtime de DirectX
– Cumple guias de estilo de desarrollo .NET – Puedes hacer todo como con DirectX nativo
Introducción a Managed DirectX
• DirectX nos aisla del hardware
– Hardware Abstraction Layer
• Sistemas heterogénos a través de simulación software del hardware
– Software Emulation Layer
• Identificamos las posibilidades hardware
– Device Capabilities
Introducción a Managed DirectX
• Microsoft.DirectX
– Contiene estructuras algebraicas útiles
• Matrix, Vector3, Plane, Quaternion, ...
• Microsoft.DirectX.Direct3D
– Contiene todo lo demas
• Device, Meshes, Texture, Light, Material, ...
Inicialización de dispositivos
• Device, la piedra angular de DirectX
– Todo se realiza en un dispotivo – Gestiona los Parametros de Presentación – Es el que presenta la escena en la pantalla – Hardware o Software
Inicialización de dispositivos
• Toda escena en DirectX se renderiza entre la llamada a los metodos:
– BeginScene – EndScene – Present
• Por tanto es necesario generar un bucle de renderización.
DEMO
Inicializar dispositivo DirectX Device Capabilites
Primitivas, Meshes y Pipelines
• Primitivas son los datos más basicos representables, el punto • Existen diferentes tipos de primitivas, basados en la primera
– Lineas – Triangulos
• En 3D todo esta triangulado
Primitivas, Meshes y Pipelines
• Las primitivas se almacenan en vértices. Los hay básicos (Vector3, Vector4,…) y CustomVertex:
Position, Transformed + Colored, Textured, Normal Ej: CustomVertex.PositionColoredTextured
Primitivas, Meshes y Pipelines
• Los indices de vértices pueden ser almacenados en buffers. VertexBuffer, IndexBuffer • Los VertexBuffer se han de bloquear y desbloquear si se van a modificar.
Primitivas, Meshes y Pipelines
• Los vértices se pueden dibujar de distintas formas:
PointList
LineList
LineStrip
TriangleList
TriangleStrip
TriangleFan
Primitivas, Meshes y Pipelines
• Los Meshes son objetos mas complejos creados a partir de primitivas
– Cubo – Donut (Torus) – Tetera (Teapot) – Esfera – Cono – Cilindro
Primitivas, Meshes y Pipelines
• Los Meshes se almacenan en ficheros con extensión .X
– Modo Texto, legibles y fácilmente editables
• Los grandes del 3D exportan directamente a formato .X a través de plug-ins
– AliasWavefront Maya – Discreet 3D Studio Max
Primitivas, Meshes y Pipelines
• Tenemos que decidir el orden de dibujado de los poligonos y objetos. ZBuffer • El orden se puede especificar en el CullMode
– Clockwise – CounterClockwise – None
Simplificación de Meshes
• SimplifyMesh: Reducción simple
Objeto SimplificationMesh
simplifiedMesh.ReduceFaces(…) simplifiedMesh.ReduceVertices(…)
• ProgressiveMesh: Simplificación/Optimización
progressiveMesh = new ProgressiveMesh(…) progressiveMesh.NumberVertices = … progressiveMesh.NumberFaces = …
• PatchMesh: Reduce/Amplia vértices y caras
PatchMesh patch = PatchMesh.CreateNPatchMesh(mesh); patch.Tessellate(tessLevel, mesh);
Texturización
• Existen diferentes modos de relleno (FillModes) para poligonos:
– Wireframe, es un alámbrico – Flat, rellena cada poligono con un unico color – Shaded, se sombrea cada poligono
Texturización
• Ademas del modo de relleno, disponemos del modo de sombreado. Existen dos modos básicos:
– Goraud. Se sombrea cada vertice y se aplica interpolación entre la linea que los une. – Phong. Se sombrea cada pixel del poligono basandose en la normal del mismo.
Texturización
• Rellenar y sombrear un poligono u objeto no es suficiente. • Hay que aplicar texturas, graficos • Para ello disponemos de la clase Texture que nos permite realizar la carga de las mismas • El dispositivo selecciona la textura a aplicar antes de dibujar cada objeto.
DEMO
Primitivas y Meshes Rotación y Traslación de Meshes Texturización de un Mesh
Environmental Mapping
• Reflejar el entorno sobre un objeto o parte del mismo.
-Se crea un objeto invisible (cubo, esfera,…) que recubre el objeto que reflejará -Se renderiza la escena en cada cara del objeto, aputando a su normal (ej: camara 90º visión para cada cara del cubo) -Se mapean las caras en la superficie reflectante.
Entorno a reflejar
Cubo de mapeo Dentro estaría el objeto
DEMO
Environmental Mapping
Reproducción de videos
• Referencias a DirectX y AudioVideoPlayback • Crear objeto Video • Establecer Owner (control) • Reproducir :)
DEMO
Reproducción de videos
Iluminación y Cámaras
• DirectX nos proporciona diferentes modelos de iluminación para nuestras escenas:
– Directional – Spot (foco) – Point (bombilla) – Ambiental (entorno)
Iluminación y Cámaras
• Las cámaras deciden la proyección que se visualiza en 2D en la pantalla • Se posicionan como cualquier otro objeto:
– Vector3 que define la posicion – Vector3 que define donde apunta, LookAt – Vector3 que define donde esta nuestro “arriba”
Iluminación y Cámaras
• Como todo objeto 3D posicionado en nuestro mundo a través de vectores, las cámaras y luces se pueden animar:
– Rotación y Traslación aplicando matrices – Generación de movimientos sinuidales basados en el Tick del sistema.
• Se pueden crear paths para animar la camara y las luces.
Alpha Blending
• Transparencias en texturas/materiales
– Añadir propiedad Difusse al mesh
cube = cube.Clone(MeshFlags.Managed, VertexFormats.Position | VertexFormats.Normal | VertexFormats.Diffuse, renderer.Device);
– Establecer alpha channel
data[i].Color = Color.FromArgb(127, 255, 255, 255).ToArgb();
– Activar blending
device.RenderState.SourceBlend = Blend.SourceAlpha; device.RenderState.DestinationBlend = Blend.InvSourceAlpha; device.RenderState.AlphaBlendEnable = true;
DEMO
Alpha Blending
Sombras básicas
• Renderización de una sombra básica:
– Plano con la normal del objeto – Matrix.Shadow: • Genera flattern/aplastamiento del objeto – Renderizar el objeto en el mundo Sombra – Renderizar el objeto de nuevo en la matriz sombra Plano (invisible)
Objeto
Superficie/objeto
Objeto “shadow”
High Level Shader Language
• Todo lo anterior es “básico” y funciona con el fixed pipeline. • HLSL emplea el programmable pipeline mediante Vertex Shaders y Pixel Shaders. • Sintaxis similar a C. • Dependiente del hardware. • Representan mini-programas, pero desde DirectX se llaman como efectos.
High Level Shader Language
• Se componen de:
– Variables, constantes, estructuras – Funciones – Techniques (punto de entrada ~ main())
• Vertex Shaders: Para modificar vértices
• Pixel Shaders: Para modificar pixels
High Level Shader Language
float4x4 WorldViewProj : WORLDVIEWPROJECTION; sampler TextureSampler; void Transform( in float4 inputPosition : POSITION, in float2 inputTexCoord : TEXCOORD0, out float4 outputPosition : POSITION, out float2 outputTexCoord : TEXCOORD0 ) { outputPosition = mul(inputPosition, WorldViewProj); outputTexCoord = inputTexCoord; } void TextureColor( in float2 textureCoords : TEXCOORD0, out float4 diffuseColor : COLOR0) { diffuseColor = tex2D(TextureSampler, textureCoords); }; technique TransformTexture { pass P0 { VertexShader = compile vs_1_1 Transform(); PixelShader = compile ps_1_1 TextureColor(); } }
Se almacenan en ficheros .fx
High Level Shader Language
• Uso desde C#: effect = Effect.FromFile(device, @"..\..\transf.fx", null, ShaderFlags.None, null); effect.Technique = "TransformTexture"; … effect.SetValue("WorldViewProj", worldViewProj); int numPasses = effect.Begin(0); for (int iPass = 0; iPass < numPasses; iPass++) { effect.Pass(iPass); for (int i = 0; i < meshMaterials.Length; i++) { device.SetTexture(0, meshTextures[i]); mesh.DrawSubset(i); } } effect.End();
DEMO
HLSL Ejemplo de alteración de pixels
Shaders en los videojuegos
El Futuro
• XNA
– Plataforma de desarrollo de videojuegos – Xbox 360 y PC – XNA Studio (Visual Studio Team System especial)
• DirectX 10
– Rediseño APIs y DLL – Mayor velocidad, compatibilidad hacia atrás mediante software layer (mas lento) – Shaders 4.0+ – Geometry Shader (gestión de polígonos en lugar de vértices/pixels)
• Mobile DirectX - Acc. 3D en PDAs !
– Managed Mobile DirectX – Requiere Windows Mobile 5.0
Introducción a la Demoscene
• Movimiento underground de principio de los 90 • Los crackers de juegos hacian pequeños créditos en las aplicaciones que crackeaban • Se originó en Amiga y Commodore 64
Introducción a la Demoscene
• Rapidamente se segregó la producción de esos créditos y se separaron del mundo del warez • Nació el concepto de Demostración para demostrar las habilidades de los programadores • Todo en una demo se renderiza en tiempo real, nada se genera con programas auxiliares • Existen diferentes modalidades de demos: 4Kb, 64Kb y Megademo
DEMO
Demo MCCD Demo de Managed DirectX y C#
¿Preguntas?
DirectX http://msdn.microsoft.com/directx/
Blogs http://blogs.clearscreen.com/migs http://blogs.clearscreen.com/kartones Demoscene http://www.demoscene.tv http://www.scene.org