Introducción Informática Gráfica Segundo Esteban San Román Dpto. Arquitectura de Computadores y Automáitca Fac. CC. Físicas, Desp. 236, Fac. Informática, Desp:421 segundo@dacya.ucm.es 91-3944740 Historia Proceso de Visualización Paradigma Modelado-Renderizado, CPU-GPU APIS Gráficas. OpenGL vs DirectX Historia Evolución del hardware y las aplicaciones Años 50: MIT primeros CRT s (I.Shuderland) Años 60: Industrias aeronáutica y automóvil Años 70: CAD/CAM, Plotters, Videojuegos 2D Años 80: Aparece Impr. Laser Años 80: Industria de Animación Años 90: Industria del videojuego (Tarjetas PC: NVIDIA, ATI, ) Siglo XXI: Sistemas Empotrados 1
Historia APIS Estandarización de APIs Gráficos 1977: 3D CGS ACM/SIGGRAPH 1985: GKS ( bidimensional ) ISO ANSI 1988: GKS-3D, PHIGS 1989: SGI IrisGL ( Terminator2 ) 1992: SGI -> OpenGL 1993: Mesa 3D (OpenSource) 1995: RenderMan (Pixar) ( ToyStory ) 1995: Microsoft DirectX 1.0 2001: Pixel-Vertex Shaders 2007: Vista-DirectX10 2008: OpenGL 3.0 Estado Actual (imagen estática) Cuál es la imagen real y la sintética? 2
Aplicar técnicas de la industria de la animación 3D Nuevas técnicas de modelado Mayor nº de superficies, Bump-normal mapping Múltiples materiales Nuevas técnicas de iluminación Shaders con efectos ilumin. Sombras Animación Física en ropas Animación facial Futuro Gráficos (videojuegos) Proceso de Visualización Procesamiento de imagen (Visión): La adquisición y tratamiento de una imagen para conseguir un modelo informático de la misma Síntesis de imagen (Proceso de visualización): es el conjunto de operaciones (en 3D y en 2D) sobre un Modelo Informático de Datos para obtener una Representación Gráfica del mismo en un dispositivo físico de representación. Proceso de Visualización 2D Modelo Geométrico Primitivas de Dibujo Recortado Cambio de Coordenadas 2-D Rasterization / Scan Conversion Display 3
Proceso de Visualización 3D Recorrido de la escena Transform. del Modelo Transform. de la Vista Recortado Eliminación de Caras Proyección Transformación del Dispositivo 3-D Iluminación Rasterization / Scan Conversion Display Modelado/Renderizado - CPU/GPU Aplicación Geometría (Vertices) Raster (Fragmentos) Image input Scena 3D output MODELADO Recorrido de la Escena Interacción con la Escena Animación 4
APIs Gráficas Pricipales APIs: OpenGL D3D (DirectX) Qué proporcionan: Implementa toda la parte de renderizado Más eficiente: extensiones hardware Portable a otros SO (en el caso de OpenGL) Versiones para diferente hardware (ES) Sobre estas APIs se montan otras de más alto nivel: PLIB, SDL, OSG, FaceFX Motores de Videojuegos: Nebula (O-D), Unreal Eng (D) ID Tech Eng (Quake) (O) Evolución de las GPU 1. GPU con pipeline fijo. 2. Dos procesadores programables (Vertices/Pixeles). 3. Stream configurable de GPU (NVIDIA GeForce 8800) Evolución del Hardware-Software gráfico Las APIs han evolucionado, aceptando lenguajes de Shaders: 1. Programación Cg (NVIDIA) 2. HLSL 3. GLSL 4. OpenCL, CUDA 5
Niveles de Abstracción de la programación de GPUs APIS Gráficas APIS Gráficas Programación de GPUs: APIs (Azul, Cg (Verde) 6
OpenGL OpenGL es la interfaz software del hardware gráfico para desarrollar aplicaciones 2D y 3D: Programación a medio-nivel Intuitivo (unas 120 funciones con sintaxis sencilla) Preparado para la Red (servidor-cliente) Pipe-Line gobernado por una Maquina de Estados Portable A nivel SO (UNIX, Linux, Windows, MacOs, ) A nivel HW (Computadores, Consolas, Móviles ) A nivel de Lenguajes (C, C++, Fortran, Ada, Java) Librerías OGL Librerías de OpenGL: GL: Librería OpenGL (gl.h, opengl32.dll). Implementa el núcleo de OpenGL, es muy básica, trabaja a muy bajo nivel y no gestiona eventos ni ventanas. GLU: OpenGL Utility Library (glu.h, glu32.dll). Librería que nos proporciona rutinas de más alto nivel. Conexión sistema nativo: GLX WGL Librerías de Utilidades: GLUT: API multiplataforma que facilita una funcionalidad para el manejo de ventanas e interacción por medio de teclado y ratón. GLUI: Interfaz de usuario basada en GLUT; proporciona elementos de control tales como botones, cajas de selección y spinners. 7
Ventana OpenGL con GLUT Crear la ventana OpenGL utilizando GLUT. #include <GL/glut.h> void renderscene(void) { glclear(gl_color_buffer_bit); glbegin(gl_triangles); glvertex3f(-0.5,-0.5,0.0); glvertex3f(0.5,0.0,0.0); glvertex3f(0.0,0.5,0.0); glend(); glflush(); } void main(int argc, char **argv) { glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGBA); glutinitwindowposition(100,100); glutinitwindowsize(320,320); glutcreatewindow("3d Tech- GLUT Tutorial"); glutdisplayfunc(renderscene); glutmainloop(); // Bucle infinito, gestionar los eventos y callbacks } http://www.xmission.com/~nate/glut.html http://www.lighthouse3d.com/opengl/glut/ Ejemplo sobre API de Windows Múltiples ejemplos con diferentes S.O. en http://nehe.gamedev.net La gestión de ventanas se realizaría con la API de WINDOWS #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> Necesitamos: // Header File For Windows // Header File For The OpenGL32 Library // Header File For The GLu32 Library HDC hdc=null; // Private GDI Device Context HGLRC hrc=null; // Permanent Rendering Context HWND hwnd=null; // Holds Our Window Handle HINSTANCE hinstance; // Holds The Instance Of The Application 8
Ejemplo sobre API de Windows bool CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag){ if (!RegisterClass(&wc)) // Attempt to register the window class if (!(hwnd = CreateWindowEx(dwExStyle ), // Create the window static PIXELFORMATDESCRIPTOR pfd = // pfd tells windows how we want things to be if (!(hdc = GetDC(hWnd))) KillGLWindow(); // Did we get a device context? if (!(PixelFormat = ChoosePixelFormat(hDC,&pfd))) KillGLWindow(); // A matching pixel format? if(!setpixelformat(hdc,pixelformat,&pfd)) KillGLWindow(); // Are we able to set the PFD? if (!(hrc = wglcreatecontext(hdc))) KillGLWindow(); // Are we able to get a rendering context? if(!wglmakecurrent(hdc,hrc)) KillGLWindow(); // Try to activate the rendering context ShowWindow(hWnd,SW_SHOW); // Show the window SetForegroundWindow(hWnd); // Slightly higher priority SetFocus(hWnd); // Sets keyboard focus to the window ReSizeGLScene(width, height); // Set up our perspective GL screen if (!InitGL()) KillGLWindow(); // Initialize our newly created GL window } DirectX version DirectX 1.0 Logo Operating system Date released September 30, 1995 DirectX 2.0 DirectX 3.0 Windows 95and NT 4.0 Windows NT 4.0 SP3 June 5, 1996 September 15, 1996 DirectX 6.0 DirectX 7.0 Windows NT 4.0 Windows 2000, ME August 7, 1998 September 22, 1999 DirectX 8.0 September 30, 2000 DirectX 9.0 DirectX 9.0c Windows Server 2003 Windows XP December 24, 2002 Bimonthly from 2005-08 DirectX 10.0 DirectX 11.0 Especificaciones. WindowsVista. Noviembre2006 (Especif. DirectX11, 2008) Agosto 2008 9
Componentes Direct-X Dos APIs gráficas DirectX (unificado en las últimas versiones): DirectDraw (obsoleta): para gráficos 2D (Raster Graphics) Direct3D (D3D): para gráficos 3D DirectInput: Procesa datos de keyboard, mouse, joystick, game controllers DirectPlay: Maneja las comunicaciones por red DirectSound: Reproducción y grabado de sonido Waveform DirectSound3D (DS3D): Reproducción de sonido 3D. DirectMusic: Reproducción de Soundtracks de DirectMusic Producer DirectX Media: DirectAnimation, DirectShow, DirectX Video Acceleration, soporta codificadores y decodificadores,. Direct3D Direct3D: API gráfica de bajo nivel con aceleración 3D del hardware. Entre Direct3D y el dispositivo gráfico se encuentra el HAL (Capa Abstracción Hardware), implementado por el fabricante Librerías básicas: D3D: Es el núclo de Direct3D D3DX: provee funcionales adicionales. Line Drawing Support in D3DX (Direct3D 9) Mesh Support in D3DX (Direct3D 9) Math Function Support in D3DX (Direct3D 9) Texture Support in D3DX (Direct3D 9) 10
Crear una Ventana con un dispositivo D3D Creamos una ventana Windows INT WINAPI WinMain( HINSTANCE hinst, HINSTANCE, LPSTR, INT ) { // Register the window class. WNDCLASSEX wc = { sizeof(wndclassex), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,"D3D Tutorial", NULL }; RegisterClassEx( &wc ); // Create the application's window. HWND hwnd = CreateWindow( "Direct3D Tutorial", "Direct3D Tutorial 01: CreateDevice",WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hinstance, NULL ); Creamos el interfaz if( NULL == ( g_pd3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )return E_FAIL; Creamos el Disp.Renderizado D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.windowed = TRUE; d3dpp.swapeffect = D3DSWAPEFFECT_DISCARD; d3dpp.backbufferformat = D3DFMT_UNKNOWN; if( FAILED( g_pd3d->createdevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3ddevice ) ) ) Liberar al salir VOID Cleanup() {if( g_pd3ddevice!= NULL) g_pd3ddevice->release(); if( g_pd3d!= NULL) g_pd3d->release(); } OpenGL vs DirectX Portabilidad: Direct3D es para la familia de Microsoft's Windows, incluyendo versiones empotradas para Xbox y Sega's Dreamcast. OpenGL dispone de implementaciones para Microsoft Windows, UNIX, Mac OS X, Linux y PlayStation 3. OpenGL es la librería primaria para iphone, Android (plataforma de móviles) y Symbian OS. Variantes de OpenGL funcionan sobre Nintendo GameCube and Wii, Nintendo DS y PSP. Mercado: DirectX ha ocupado un mayor porcentaje en el mercado de los videojuegos. OpenGL ha suplido históricamente el mercado profesional de gráficos. 11
OpenGL vs DirectX Modo de funcionamiento: D3D esta diseñado como un interfaz de hardware gráfico 3D, espera que la aplicación dirija el hardware. OpenGL es un sistema de renderizado 3D, que puede ser acelerado por hardware. OpenGL gestiona la aceleración hardware. Programacíón: Programación básica: más fácil OpenGL Aprovechar el Hardware: más fácil DirectX Programación de Drivers: más fácil DirectX Actualizaciones: Extensiones OpenGL para nuevas capacidades hardware. DirectX nuevas versiones adaptadas a las nuevas capacidades hardware. API Wars : El bajo rendimiento de OpenGL vs D3D sobre plataformas Windows se debe a la implementación realizada por Microsoft (SIGGRAPH). 12