Tutorial Opengl

download Tutorial Opengl

of 57

Transcript of Tutorial Opengl

Una aproximacion aOpenGLJulian Dorado de la CalleAlberto Jaspe Villanueva21 Introduccion........................................................................................................... 41.1 Que es OpenGL?............................................................................................ 41.2 OpenGL como una maquina de estados........................................................ 41.3 El Pipeline de renderizado de OpenGL......................................................... 51.4 Escribir codigo basado en OpenGL............................................................... 61.4.1 Sintaxis .................................................................................................... 61.4.2 Animacion ............................................................................................... 71.4.3 Libreras relacionadas con OpenGL........................................................ 81.5 Pretensiones de estos apuntes ......................................................................... 92 El "Hello World" de OpenCL............................................................................. 12.1 Requesitos del sistema................................................................................... 102.1.1 Hardware ............................................................................................... 102.1.2 SoItware................................................................................................. 102.2 La OpenGL Utility Toolkit (GLUT) ............................................................ 102.3 ~Hello World................................................................................................ 112.3.1 Codigo ................................................................................................... 112.3.2 Analisis del codigo ................................................................................ 123 Dibujando en 3D.................................................................................................. 183.1 Definicion de un lienzo en 3D....................................................................... 183.2 El punto en 3D: el vertice.............................................................................. 193.3 Las primitivas ................................................................................................ 203.3.1 Dibuio de puntos (GLPOINTS)........................................................... 203.3.1.1 Aiuste del tamano del punto........................................................ 213.3.2 Dibuio de lneas (GLLINES)............................................................... 213.3.3 Dibuio de polgonos .............................................................................. 233.3.3.1 Triangulos (GLTRIANGLES)................................................... 243.3.3.2 Cuadrados (GLQUADS) ........................................................... 263.4 Construccion de objetos solidos mediante polgonos ................................. 263.4.1 Color de relleno ..................................................................................... 263.4.2 Modelo de sombreado ........................................................................... 273.4.3 Eliminacion de las caras ocultas............................................................ 284 Moviendonos por nuestro espacio 3D: transformaciones de coordenadas....... 324.1 Coordenadas oculares ................................................................................... 3234.2 Transformaciones .......................................................................................... 334.2.1 El modelador ......................................................................................... 334.2.1.1 TransIormaciones del observador................................................ 334.2.1.2 TransIormaciones del modelo ..................................................... 344.2.1.3 Dualidad del modelador............................................................... 344.2.2 TransIormaciones de la proyeccion....................................................... 354.2.3 TransIormaciones de la vista................................................................. 354.3 Matrices .......................................................................................................... 354.3.1 El canal de transIormaciones................................................................. 354.3.2 La matriz del modelador........................................................................ 364.3.2.1 Translacion .................................................................................. 364.3.2.2 Rotacion....................................................................................... 374.3.2.3 Escalado....................................................................................... 374.3.2.4 La matriz identidad...................................................................... 384.3.2.5 Las pilas de matrices.................................................................... 394.3.3 La matriz de proyeccion ........................................................................ 404.3.3.1 Proyecciones ortograIicas............................................................ 404.3.3.2 Proyecciones perspectivas ........................................................... 414.4 Ejemplo: una escena simple.......................................................................... 444.4.1 Codigo ................................................................................................... 444.4.2 Analisis del codigo ................................................................................ 4841Introduccion1.1 Que es OpenGL?OpenGL (ogl en adelante) es la interIaz soItware de hardware graIico. Es un motor 3D cuyas rutinas estan integradas en tarietas graIicas 3D. Ogl posee todas las caractersticas necesarias para la representacion mediante computadoras de escenas 3D modeladas con polgonos.desdeelpintadomasbasicodetriangulos.hastaelmapeadodetexturas. iluminacion o NURBS.La compana que desarrolla esta librera es Sillicon Graphics Inc (SGI). en pro de hacer unestandarenlarepresentacion3Dgratuitoyconcodigoabierto(open source).Esta basadoensuspropiosOSylenguaiesIRIS.deIormaqueesperIectamenteportablea otroslenguaies.EntreellosC.C.etcylaslibrerasdinamicaspermitenusarlosin problema en Visual Basic. Visual Fortran. Java. etc.Oglsoportahardware3D.yesaltamenterecomendableposeerestetipodehardware graIico. Si no se tiene disposicion de el. las rutinas de representacion correran por soIt. en vez de hard. decrementando en gran medida su velocidad.1.2 OpenGL como una maquina de estadosOglesunamaquinadeestados.CuandoseactivanoconIiguranvariosestadosdela maquina.suseIectosperduraranhastaqueseandesactivados.Poreiemplo.sielcolor parapintarpolgonosseponeablanco.todoslospolgonossepintarandeestecolor hastacambiarelestadodeesavariable.ExistenotrosestadosqueIuncionancomo booleanos (on o oII. 0 o 1). Estos se activa mediante las Iunciones glEnable y glDisable. Veremos eiemplos practicos en los proximos captulos.TodoslosestadostienenunvalorpordeIecto.ytambienalgunaIuncionconlaque conseguirsuvaloractual.Estaspuedensermasgenerales.deltipoglGetDoublev()o glIsEnabled(). o mas especiIicas. como glGetLight() o glGetError().51.3 El Pipeline de renderizado de OpenGLLamayorpartedelasimplementacionesdeoglsiguenunmismoordenensus operaciones.unaseriedeplataIormasdeproceso.queensuconiuntocreanloquese suele llamar el 'OpenGL Rendering Pipeline.El siguiente diagrama (Ilustracion 1.1) describe el Iuncionamiento del pipeline:Ilustracion 1.1 Enestediagramasepuedeapreciarelordendeoperacionesquesigueelpipelinepara renderizar.Porunladotenemosel'vertexdata.quedescribelosobietosdenuestra escena.yporelotro.el'pxeldata.quedescribelaspropiedadesdelaescenaquese aplican sobre la imagen tal y como se representa en el buIIer. Ambas se pueden guardar 6enuna'displaylist.queesunconiuntodeoperacionesqueseguardanparaser eiecutadas en cualquier momento.Sobreel'vertexdatasepuedenaplicar'evaluators.paradescribircurvaso superIiciesparametrizadasmediantepuntosdecontrol.Luegoseaplicaranlas'per-vertex operations. queconvierten los vertices en primitivas. Aqu es donde se aplican las transIormaciones geometricas como rotaciones. translaciones. etc.. por cada vertice. En la seccion de 'primittive assembly. se hace clipping de lo que queda Iuera del plano de proyeccion. entre otros.Porlapartede'pxeldata.tenemoslas'pxel operations .Aqulospxelesson desempaquetadosdesdealgunarraydelsistema(comoelIramebuIIer)ytratados (escalados.etc.).Luego.siestamostratandocontexturas.sepreparanenlaseccion 'texture assembly.Ambos caminos convergen en la 'Rasterization. donde son convertidos en Iragmentos. CadaIragmentoseraunpxeldelIramebuIIer.Aquesdondesetieneencuentael modelo de sombreado. la anchura de las lneas. o el antialiassing.Enlaultimaetapa.las'per-Iragmetoperations.esdondesepreparanlostexels (elementos de texturas) para ser aplicados a cada pxel. la Iog (niebla). el z-buIIering. el blending. etc. Todas estas operaciones desembocan en el IramebuIIer. donde obtenemos el render Iinal.1.4 Escribir codigo basado en OpenGL1.4.1 SintaxisTodaslasIuncionesdeoglcomienzanconelpreIiio'glylasconstantescon'GL. Como eiemplos. la Iuncion glClearColor() y la constante GLCOLORBUFFERBIT.EnmuchasdelasIunciones.apareceunsuIiiocompuestopordosdgitos.unaciIray una letra. como por eiemplo glColor3I() o glVertex3i(). La ciIra simboliza el numero de parametros que se le deben pasar a la Iuncion. y la letra el tipo de estos parametros.En ogl existen 8 tipos distintos de datos. de una Iorma muy parecida a los tipos de datos de C o C. Ademas. ogl viene con sus propias deIiniciones de estos datos (typedeI en C). Los tipos de datos:7SuIiio Tipo de dato CorrespondeenCal tipo...DeIinicionenogldel tipob Entero 8-bits signed char GLbyte s Entero 16-bits short GLshorti Entero 32-bits int o long GLint, GLsizeif Punto flotante 32-bitsfloatGLfloat, GLclampfd Punto flotante 6+-bitsdouble GLdouble, GLclampdub Entero sin signo 8-bitsunsigned char GLubyte, GLbooleanus Entero sin signo 16-bitsunsigned short GLushortui Entero sin signo 32-bitsunsigned int GLuint,GLenum, GLbitfield1.4.2 AnimacionEsmuyimportantedentrodelosgraIicosencomputacionlacapacidaddeconseguir movimientoapartirdeunasecuenciadeIotogramaso'Irames.Laanimaciones Iundamentalparaunsimuladordevuelo.unaaplicaciondemecanicaindustrialoun iuego.Enelmomentoenqueeloiohumanopercibemasde24Iramesenunsegundo.el cerebrolointerpretacomomovimientoreal.Enestemomento.cualquierproyector convencional es capaz de alcanzar Irecuencias de 60 Irames/s o mas. Evidentemente. 60 Ips (Irames por segundo) sera mas suave (y. por tanto. mas real) que 30 Ips.LaclaveparaquelaanimacionIuncioneesquecadaIrameestecompleto(haya terminadoderenderizar)cuandoseamostradoporpantalla.Supongamosquenuestro algoritmo (en pseudocodigo) para la animacion es el siguiente:abre_ventana();for (i=0; i< ultimo_frame; !++) {borra_ventana();8dibuja_frame(i);espera_hasta_la_1/2+_parte_de_segundo();}Si el borrado de pantalla y el dibuiado del Irame tardan mas de 1/24 de segundo. antes de que se pueda dibuiar el siguiente. el borrado ya se habra producido. Esto causara un parpadeo en la pantalla puesto que no hay una sincronizacion en los tiempos.Parasolucionaresteproblema.oglnospermiteusarlaclasicatecnicadeldoble-buIIering:lasimagenesrenderizadassevancolocandoenelprimerbuIIer.ycuando termina el renderizado. se vuelca al segundo buIIer. que es el que se dibuia en pantalla. Asnuncaveremosunaimagencortada.solventandoelproblemadelparpadeo.El algoritmo quedara:abre_ventana();for (i=0; i< ultimo_frame; !++) {borra_ventana();dibuja_frame(i);swap_buffers();}La cantidad de Ips siempre quedara limitada por el reIresco de nuestro monitor. Aunque OpenGLseacapazderenderizar100Iramesenunsegundo.sielperiIericoutilizado (monitor.canon)solonosalcanzalos60hz..esdecir.las60imagenesporsegundo. aproximadamente 40 Irames renderizados se perderan. 1.4.3 Libreras relacionadas con OpenGLOpenGLcontieneunconiuntodepoderososperoprimitivoscomandos.amuybaio nivel. Ademas laapertura de una ventana en el sistemagraIico que utilicemos (win32. X11.etc.)dondepintarnoentraenla||||deOpenGL.Poresolassiguienteslibreras son muy utilizadas en la programacion de aplicaciones de ogl:OpenGLUtilityLibrary(GLU):contienebastantesrutinasqueusanoglabaionivel pararealizartareascomotransIormacionesdematricesparatenerunaorientacion especiIica. subdivision de polgonos. etc.GLXyWGL:GLXdasoporteparamaquinasqueutilicenXWindowsSystem.para inicializar una ventana. etc. WGL seria el equivalente para sistemas MicrosoIt.OpenGL Utility Toolkit (GLUT): es un sistema de ventanas. escrito por Mark Kilgard. que seria independiente del sistema usado. dandonos Iunciones tipo abrirventana(). 91.5 Pretensiones de estos apuntesEste'tutorialdeoglpretendeensenarallectora'aprenderOpenGL.OglesunAPI muy extenso. con gran cantidad de Iunciones. estados. etc. Aqu se intentaran asentar las bases de la programacion con el API de ogl. la dinamica con la que se debe empezar a escribir codigo para una aplicacion graIica que utilice ogl.LoseiemplosquesemuestranduranteestaguaestanescritosutilizandoC.porserel lenguaie mas utilizado actualmente en este tipo de aplicaciones. ademas de ser el codigo 'nativodeOpenGL.TambienseutilizanlaslibrerasGLUyGLUT.queseran explicadas mas adelante.Sepresuponenunaseriedeconocimientosmatematicos.comosoneltratamientocon matrices. o la manera de hallar los vectores normales a una superIicie. Se pretende que esta gua iunto con una buena reIerencia (como el RedBook. citado en la bibliograIa) sea suIiciente para comenzar con el mundo 3D.Estos apuntes contendran los siguientes captulos:El primero. esta introduccion.El segundo. un eiemplo practico para empezar a analizar la dinamica con la que se va a trabaiar. El tercero. aprenderemos a dibuiar en tres dimensiones.Elcuarto.nosempezaremosamoverpornuestroentorno3Dgraciasalas transIormaciones matriciales.El quinto. donde aprenderemos a usar los colores. materiales. iluminacion y sombreado.Elsexto.veremosunaaproximacionalastecnicasde'blendingymapeadode texturas. yel septimo. sobre las 'display list y otras caractersticas utiles de OpenGL.102EI "HeIIo WorId" de OpenGL2.1 Requesitos del sistema2.1.1 HardwareEnrealidad.elAPIdeoglestapensadoparatrabaiarbaioelrespaldodeunhardware capazderealizarlasoperacionesnecesariasparaelrenderizado.perosinosedispone deesehardware.estasoperacionessecalcularanpormediodeunsoItwarecontrala CPUdelsistema.Asquelosrequerimientoshardwaresonescasos.aunquecuanto mayor sea las capacidades de la maquina. mayor sera el rendimiento de las aplicaciones ogl.2.1.2 SoftwareParaestosapuntes.supondremoslautilizaciondeunsistemaUnix.conXWindows System.Concretamente.sistemalinuxconX11.LalibreraMesa3D.esunclonde OpenGL gratuito. y que nos vale perIectamente al ser compatible al 100 con OpenGL. Se puede baiar de http://mesa3d.sourceIorge.netLo segundo que necesitaremos sera la librera GLUT. que podemos baiar directamente de SGI. La direccion es http://reality.sgi.com/opengl/glut3/glut3.htmlConestodeberasersuIicienteparaempezaradesarrollaraplicacionesoglsin problema.2.2 La OpenGL Utility Toolkit (GLUT)Como ya se ha mencionado. la librera glut esta disenada para no tener preocupaciones con respecto al sistema de ventanas. incluyendo Iunciones del tipo abreventana(). que nosocultanlacompleiidaddelibrerasamasbaionivelcomolaGLX.Peroademas GLUT nos oIrece toda una dinamica de programacion de aplicaciones ogl. gracias a la deIiniciondeIuncionescallback.UnaIuncioncallbackserallamadacadavezquese produzcaunevento.comolapulsaciondeunatecla.elreescaladodelaventanaoel mismo idle. Cuando utilizamos esta librera. le damos el control del Iluio del programa 11aglut.deIormaqueeiecutaracodigodediIerentesIuncionesdependiendodelestado actual del programa (idle. el raton cambia de posicion. etc.).2.3 'Hello World"2.3.1 CodigoLo que podra considerarse la aplicacion mas sencilla utilizando OpenGL se presenta en estaseccion.Elsiguientecodigoabreunaventanaydibuiadentrounpolgono (triangulo en este caso) blanco.#include void reshape(int width, int height){glviewport(0, 0, width, height);glNatrixNode(GL_PROJECT!ON);glLoad!dentity();glOrtho(-1, 1, -1, 1, -1, 1);glNatrixNode(GL_NODELv!EW);}void display(){glClear(GL_COLOR_BUFFER_B!T);glColor3f(1,1,1);glLoad!dentity();glBegin(GL_TR!ANGLES);glvertex3f(-1,-1,0);glvertex3f(1,-1,0);glvertex3f(0,1,0);glEnd();glFlush();}12void init(){glClearColor(0,0,0,0);}int main(int argc, char **argv){glut!nit(8argc, argv);glut!nitDisplayNode(GLUT_S!NGLE ] GLUT_RGB);glut!nitWindowPosition(50, 50);glut!nitWindowSize(500, 500);glutCreateWindow("Hello OpenGL");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutNainLoop();return 0;}Para compilar este codigo:gcc -lglut -lGLU -lGL hello.c -o hello2.3.2 AnalisisdelcodigoLaestructuradeunclasicoprogramasobreGLUTeslaqueseapreciaenelhello.c. Analicemos la Iuncion main():glut!nit(8argc, argv);EstaIuncioneslaqueinicializalaGLUT.ynegociaconelsistemadeventanaspara abrir una. Los parametros deben ser los mismos argc y argv sin modiIicar de la main(). Glut entiende una serie de parametros que pueden ser pasados por lnea de comandos.glut!nitDisplayNode(GLUT_S!NGLE ] GLUT_RGB);13DeIine el modo en el que debe dibuiar en la ventana. Los parametros. como gran parte delasIuncionesqueiremosviendo.sedeIinenconIlagsomascarasdebits.Eneste casoenconcreto.GLUTSINGLEindicaquesedebeusarunsolobuIIery GLUTRGB el tipo de modelo de color con el que se dibuiara.glut!nitWindowPosition(50, 50);Posicionxeydelaesquinasuperiorizquierdadelanuevaventana.conrespectoal escritorio en el que se trabaie.glut!nitWindowSize(500, 500);El ancho y alto de la nueva ventana.glutCreateWindow("Hello OpenGL");EstaIuncioneslaquepropiamentecrealaventana.yelparametroeselnombredela misma.init();EnestaIuncionquehemosdeIinidonosotros.activamosydeIinimosunaseriede estados de ogl. antes de pasar el control del programa a la GLUT.glutDisplayFunc(display);Aqu se deIine el primer callback. La Iuncion pasada como parametro sera llamada cada vezqueGLUTdetermineoportunoquelaventanadebeserredibuiada.comoal maximizarse. poner otras ventanas por encima o sacarlas. etc.glutReshapeFunc(reshape);AqudeIinimosotrocallback.enestecasoparasaberquehacecuandolaventanaes explcitamente reescalada. Esta accion aIecta en principio directamente al render. puesto queseestacambiandoeltamanodelplanodeproyeccion.PoresoenestaIuncion(en estecasoreshape)sesuelecorregirestodealgunaIorma.Loveremosmeiormas adelante.glutNainLoop();14EstaIuncioncedeelcontroldelIluiodelprogramaalaGLUT.queapartirdeestos "eventos". ira llamando a las Iunciones que han sido pasadas como callbacks.GLUTtienemuchasmasposibilidades.porsupuesto.NosoIreceIuncionesparael maneiodelratonyteclado.ygranIacilidadparalacreaciondemenus.quepermite vincular con un evento como el clic del raton.Contenido de los callbacksAunquenoseaunodeellos.empezaremosanalizandolaIuncioninit().Comoseha comentado.oglpuedeservistacomounamaquinadeestados.Porlotantoantesde empezar a hacer nada. habra que conIigurar alguno de estos estados. En init() podemos apreciar:glClearColor(0,0,0,0);Con esto se deIine el color conel que se borrarael buIIer al hacer unglClear().Los 3 primerosparametrossonlascomponentesR.GyB.siguiendounrangode|0..1|.La ultima es el valor alpha. del que hablaremos mas adelante.Veamos ahora la Iuncion reshape(). Esta Iuncion. al ser pasada a glutReshapeFunc. sera llamada cada vez que se reescale a ventana. La Iuncion siempre debe ser deIinida con el siguiente esqueleto:void rescala(int, int) { ... }Elprimerparametroseraelanchoyelsegundoelalto.despuesdelreescalado.Con estosdosvalorestrabaiaralaIuncioncuando.entiempodeeiecucion.elusuario reescale la ventana.Analicemos ahora el contenido de nuestra Iuncion:glviewport(0, 0, width, height);Esta Iuncion deIine la porcion de ventana donde puede dibuiar ogl. Los parametros son xey.esquinasuperiorizquierdadel"cuadro"dondepuededibuiar(conreIerenciala ventana). y ancho y alto. En este caso coie el width y height. que son los parametros de reshape(). es decir. los datos que acaba de recibir por culpa del reescalado de la ventana.glNatrixNode(GL_PROJECT!ON);15EspeciIicalamatrizactual.Enogllasoperacionesderotacion.translacion.escalado. etc. se realizan a traves de matrices de transIormacion. Dependiendo de lo que estemos tratando.haytrestiposdematriz(quesonlostresposiblesIlagsquepuedellevarde parametrolaIuncion):matrizdeproyeccion(GLPROJECTION).matrizdemodelo (GLMODELVIEW) y matriz de textura (GLTEXTURE). Con esta Iuncion indicamos a cual de estas tres se deben aIectar las operaciones. Concretamente. GLPROJECTION aIecta a las vistas o perspectivas o proyecciones. Todo esto se vera en el captulo 4.glLoad!dentity();Con esto cargamos en el "tipo" de matriz actual la matriz identidad (es como resetear la matriz).glOrtho(-1, 1, -1, 1, -1, 1);glOrtho() deIine una perspectiva ortonormal. Esto quiere decir que lo que veremos sera una proyeccion en uno de los planos deIinidos por los eies. Es como plasmar los obietos enunplano.yluegoobservarelplano.Losparametrossonparadelimitarlazonade trabaio. y son xminima. xmaxima. yminima. ymaxima. zminima. zmaxima. Con estos seis puntos. deIinimos una caia que sera lo que se proyecte. Esta Iuncion se trata mas a Iondo en el captulo 4.glNatrixNode(GL_NODELv!EW);Se vuelve a este tipo de matrices. que aIecta a las primitivas geometricas.YasolonosquedalaIunciondisplay()porver.Comosehadicho.alserpasadaa glutDisplayFunc(). sera llamada cada vez que haya que redibuiar la ventana. La Iuncion debe ser deIinida con el siguiente esqueleto:void dibujar(void) { ... }Analicemos ahora el contenido de la Iuncion en nuestro eiemplo:glClear(GL_COLOR_BUFFER_B!T);BorraunbuIIer.ounacombinaciondevarios.deIinidosporIlags.Enestecaso.el buIIer de los colores loborra(en realidad.cadacomponente RGyB tienen un buIIer distinto. pero aqu los trata como el mismo). Para borrarlos utiliza el color que ha sido 16previamentedeIinidoeninit()medianteglClearColor().enestecaso.el(0.0.0.0)es decir. negro. La composicion de colores se vera en el captulo 5.glColor3f(1,1,1);Selecciona el color actual con el que dibuiar. Parametros R G y B. rango |0..1|. as que estamos ante el color blanco.glLoad!dentity();Carga la matriz identidad.glBegin(GL_TR!ANGLES); glvertex3f(-1,-1,0); glvertex3f(1,-1,0); glvertex3f(0,1,0);glEnd();Analizamostodaestaparteentera.porIormarunaestructura.glBegin()comienzauna secuencia de vertices con los que seconstruiranprimitivas. El tipo de primitivas viene dadoporelparametrodeglBegin().enestecasoGLTRIANGLES.Alhabertres vertices dentro de la estructura. esta deIiniendo un triangulo. glEnd() simplemente cierra la estructura. Los posibles parametros de glBegin. y la manera de construir primitivas se veran mas adelante. en proximo captulo.glFlush();Dependiendodelhardware.controladores.etc..oglguardaloscomandoscomo peticiones en pila. para optimizar el rendimiento. El comando glFlush causa la eiecucion de cualquier comando en espera.El resultado Iinal se puede ver en la ilustracion 2.1.17Ilustracion 2.1 183Dibujando en 3DEl dibuio 3D en OpenGL se basa en la composicion de pequenos elementos. con los que vamos construyendo la escena deseada. Estos elementos se llaman primitivas. Todas las primitivasdeoglsonobietosdeunaodosdimensiones.abarcandodesdepuntos simples a lneas o polgonos compleios. Las primitivas se componen de vertices. que no sonmasquepuntos3D.Enestecaptulosepretendepresentarlasherramientas necesariasparadibuiarobietosen3DapartirdeestasIormasmassencillas.Paraello necesitamosdeshacernosdelamentalidaden2DdelacomputaciongraIicaclasicay deIinir el nuevo espacio de trabaio. ya en 3D.3.1Definicion de un lienzo en 3DLaIlustracion3.1muestrauneiedecoordenadasinmersoenunvolumende visualizacionsencillo.queutilizaremosparadeIiniryexplicarelespacioenelque vamosatrabaiar.Estevolumensecorresponderaconunaperspectivaortonormal. comolaquehemosdeIinidoenelcapituloanteriorhaciendounallamadaaglOrtho(). ComopuedeobservarseenlaIigura.paraelpuntodevistaeleiedelasxserahorizontal.ycreceradeizquierdaaderecha;eleiey.vertical.ycreciendodeabaio haciaarriba;y.porultimo.eleiez.queseraeldeproIundidad.yquecrecerahacia nuestrasespaldas.es decir. cuanto mas leios de la camara este el punto.menor sera su coordenadaz.EnelsiguientecaptuloseabordaraestetemaconmayorproIundidad. cuando deIinamos las transIormaciones sobre el espacio.Ilustracion 3.1 193.2El punto en 3D: el verticeLos vertices (puntos 3D) son el denominador comun en cualquiera de las primitivas de OpenGL.ConellossedeIinenpuntos.lneasypolgonos.LaIuncionquedeIine verticesesglVertex.ypuedetomardedosacuatroparametrosdecualquiertipo numerico. Por eiemplo. la siguiente lnea de codigo deIine un vertice en el punto (10. 5. 3).glvertex3f(10.0f, 5.0f, 3.0f);EstepuntosemuestraenlaIlustracion3.2.Aquhemosdecididorepresentarlas coordenadascomovaloresencomaIlotante.ycontresargumentos.x.yyz. respectivamente.Ilustracion 3.2 Ahoradebemosaprenderadarlesentidoaestosvertices.quepuedensertantola esquina de un cubo como el extremo de una lnea.203.3 Las primitivasUna primitiva es simplemente la interpretacion de un coniunto de vertices. dibuiados de unamaneraespecIicaenpantalla.Haydiezprimitivasdistintasenogl.peroenestos apuntesexplicaremossolamentelasmasimportantes:puntos(GLPOINTS).lneas (GLLINES).triangulos(GLTRIANGLES)ycuadrados(GLQUADS). ComentaremostambienlasprimitivasGLLINESSTRIP.GLTRIANGLESTRIPy GLQUADSTRIP.utilizadasparadeIinir'tirasdelneas.triangulosydecuadrados respectivamente.ParacrearprimitivasenoglseutilizanlasIuncionesglBeginyglEnd.Lasintaxisde estas Iunciones sigue el siguiente modelo:glBegin(); glvertex(...); glvertex(...); ... glvertex(...);glEnd();Puede observarse que glBegin y glEnd actuan como llaves ('' y '}) de las primitivas. por eso es comun anadirle tabulados a las glVertex contenidos entre ellas. El parametro deglBeingtipodeprimitiva~esdeltipoglEnum(deIinidoporOpenGL).yserael Ilag con el nombre de la primitiva (GLPOINTS. GLQUADS. etc.).3.3.1 Dibujo de puntos (GL_POINTS)Eslamassimpledelasprimitivasdeogl:lospuntos.Paracomenzar.veamosel siguiente codigo:glBegin(GL_PO!NTS);glvertex3f(0.0f, 0.0f, 0.0f);glvertex3f(10.0f, 10.0f, 10.0f);glEnd();ElparametropasadoaglBeginesGLPOINTS.conlocualinterpretalosvertices contenidos en el bloqueglBeing-glEnd como puntos. Aqu se dibuiaran dos puntos. en (0. 0. 0) y en (10. 10. 10). Como podemos ver. podemos listar multiples primitivas entre 21llamadasmientrasqueseanparaelmismotipodeprimitiva.Elsiguientecodigo dibuiaraexactamentelomismo.peroinvertiramuchomastiempoenhacerlo. decelerando considerablemente la velocidad de nuestra aplicacion:glBegin(GL_PO!NTS);glvertex3f(0.0f, 0.0f, 0.0f);glEnd();glBegin(GL_PO!NTS);glvertex3f(10.0f, 10.0f, 10.0f);glEnd();3.3.1.1Ajuste del tamano del puntoCuandodibuiamosunpunto.eltamanopordeIectoesdeunpixel.Podemoscambiar esteanchoconlaIuncionglPointSize.quellevacomoparametrounIlotanteconel tamanoaproximadoenpixelsdelpuntodibuiado.Sinembargo.noestapermitido cualquier tamano. Para conocer el rango de tamanos soportadosy el paso (incremento) de estos. podemos usar la Iuncion glGetFloat. que devuelve el valor de alguna medida o variableinternadeOpenGL.llamadas'variablesdeestado.quepuedadepender directamentedelamaquinaodelaimplementaciondeogl.As.elsiguientecodigo conseguira estos valores:Glfloat rango|2|;Glfloat incremento;glGetFloatv(GL_PO!NT_S!ZE_RANGE, rango);glGetFloatv(GL_PO!NT_S!ZE_GRANULAR!TY, 8incremento);Por eiemplo la implementacion OpenGL de MicroSoIt permite tamanos de punto de 0.5 a10.0.conunincrementoopasode0.125.EspeciIicaruntamanoderangoincorrecto nocausaraunerror.sinoquelamaquinaOpenGLusaraeltamanocorrectomas aproximado al deIinido por el usuario.3.3.2 Dibujo de lneas (GL_LINES)22En el dibuiado de puntos. la sintaxis era muy comoda: cada vertice es un punto. En las lneaslosverticessecuentanporpareias.denotandopuntoinicialypuntoIinaldela lnea. Si especiIicamos un numero impar de vertices. el ultimo de ellos se ignora.El siguiente codigo dibuia una serie de lineas radiales:GLfloat angulo;int i; glBegin(GL_L!NES);for (i=0; i