Tutorial OpenGL

Embed Size (px)

Citation preview

DEPARTAMENTO DECINCIASE X A T A SET E C N O L O G I A PROJETO ORENTADO EM COMPUTAAO ORIENTAO DA MONOGRAFIA: PROF. MARCELO F. PORTO COORDENAO DA DISCIPLINA: PROF. MAGALI MARIA DE ARAJO BARROSO 2003 BELO HORZONTE TUTORAL DE UTLZAAO DE OPENGL Marcionilio Barbosa 8obrinho CURSO DE CINCIA DA COMPUTAO Marcionilio Barbosa 8obrinho Tutorial de Utilizao de OpenGL Monografiaapresentadacomo requisitoparcialdoTrabalhode ConclusodoCursodeCinciada ComputaodoDepartamentode Cincias Exatas e Tecnologia. Centro Universitario de Belo Horizonte Belo Horizonte 2003 Departamento de Cincias Exatas e Tecnologia Ficha de Aprovao A monografia intitulada Tutorial de Utilizao de OpenGL de autoria de MarcionlioBarbosaSobrinho,alunodoCursodeCinciadaComputao- UNI-BH, apresentada em 11 de dezembro de 2003, recebeu aprovao da Banca Examinadora constituda pelos professores: ______________________________________ Prof. Marcelo F. Porto, orientador ______________________________________ Prof. Brulio R. G. M. Couto

"No h nada melhor que alcanar uma meta. E no h nada pior que fazer s isso, no prosseguir." Amyr Klink 1 ndice ndice de tabelas e figuras .................................................................................................................. 3 Introduo............................................................................................................................................ 5 HISTRICO......................................................................................................................................... 9 Captulo 1 - O que OpenGL ........................................................................................................... 13 1.1 - OpenGL como mquina de estados..................................................................................... 14 1.2 - O Pipeline do OpenGL ....................................................................................................... 14 1.2.1 - Listas de Exposio ...................................................................................................... 14 1.2.2 - Avaliadores.................................................................................................................... 15 1.2.3 - Operaes por vrtices ................................................................................................. 15 1.2.4 - Montagem de Primitivas................................................................................................ 15 1.2.5 - Operaes de Pixels ..................................................................................................... 16 1.2.6 - Montagem de Texturas ................................................................................................. 16 1.2.7 - Rasterizao.................................................................................................................. 16 1.2.8 - Operaes fragmentadas.............................................................................................. 17 1.3 - Funes grficas do OPENGL ............................................................................................. 17 Captulo 2 - Ambiente OpenGL para desenvolvimento .................................................................... 20 2.1 - Instalao do OPENGL ........................................................................................................ 20 2.2 - Instalao do GLUT.............................................................................................................. 20 2.2.1 -Instalando o GLUT no Borland C++ Builder 5 no ambiente Windows......................... 20 2.2.2 - Instalando o GLUT no MS Visual C++.......................................................................... 21 2.2.3 - Instalando o GLUT no DEV-C++................................................................................... 22 2.3 - Sintaxe de Comandos do OpenGL....................................................................................... 22 2.4 - Estrutura Bsica de Programas OpenGL............................................................................. 24 2.4.1 - Rotinas de Callback ...................................................................................................... 26 2.4.2 - Exemplo de um programa OpenGL .............................................................................. 27 Captulo 3 - Criao de Primitivas..................................................................................................... 29 3.1 - Pontos................................................................................................................................... 29 3.2 - Linhas ................................................................................................................................... 29 3.3 - Polgonos.............................................................................................................................. 30 3.4 - Desenhando Primitivas......................................................................................................... 30 3.5 - Programa exemplo ............................................................................................................... 32 Captulo 4 - Cores ............................................................................................................................. 36 4.1 - Percepo de cores pelo olho humano................................................................................ 36 4.2 - Cores no Computador .......................................................................................................... 37 4.3 - Cores no OpenGL................................................................................................................. 38 4.3.1 - Escolhendo entre RGBA e ndice de Cores.................................................................. 39 4.3.2 - Definindo o Modo de cores ........................................................................................... 39 4.3.3 - Exemplo da utilizao de cores..................................................................................... 42 Captulo 5 - Transformaes............................................................................................................. 45 5.1 - Transformao de Objetos ................................................................................................... 46 5.1.1 - Exemplo de Transformao de Objetos........................................................................ 48 5.2 - Transformao de Visualizao ........................................................................................... 50 5.2.1 - Exemplo de Transformao de Visualizao................................................................ 51 5.3 - Transformao de Projeo ................................................................................................. 52 5.3.1 - Projeo Perspectiva .................................................................................................... 52 5.3.2 - Projeo Ortogrfica...................................................................................................... 55 5.4 - Transformao de Viewport.................................................................................................. 56 Captulo 6 - Formas 3D..................................................................................................................... 57 6.1 - Exemplo de Forma 3D.......................................................................................................... 58 6.2 - Formas 3D pr-definidas no GLUT....................................................................................... 60 6.2.1 - Esfera : .......................................................................................................................... 61 6.2.2 - Cubo.............................................................................................................................. 61 6.2.3 - Cone.............................................................................................................................. 62 6.2.4 - Toroide .......................................................................................................................... 62 6.2.5 - Dodecaedro................................................................................................................... 63 6.2.6 - Octaedro........................................................................................................................ 63 2 6.2.7 - Tetraedro....................................................................................................................... 64 6.2.8 - Icosaedro....................................................................................................................... 64 6.2.9 - Teapot ........................................................................................................................... 65 6.3 - Exemplo de Formas 3D, Transformaes e Animao no OpenGL.................................... 66 Captulo 7 - Modelos de Iluminao.................................................................................................. 70 7.1 - Como o OpenGL simula as Luzes........................................................................................ 70 7.2 - Cores de Materiais................................................................................................................ 72 7.3 - Adicionando luzes a uma cena............................................................................................. 73 7.3.1 - Definio dos vetores normais...................................................................................... 73 7.3.2 - Criao, seleo e posicionamento de luzes................................................................ 73 7.3.3 - Exemplo de criao e posicionamento de luzes ........................................................... 75 7.3.4 - Criao e seleo de modelo de iluminao ................................................................ 77 7.3.5 - Propriedades de materiais ............................................................................................ 78 7.3.6 - Exemplo de propriedades dos materiais....................................................................... 79 Captulo 8 - Modelagem hierrquica ................................................................................................. 84 8.1 - Pilhas de Matrizes ................................................................................................................ 84 8.2 - Display Lists (Listas de Exibio) ......................................................................................... 85 8.3 - Listas de visualizao hierrquicas ...................................................................................... 86 8.4 - Exemplo de Lista de visualizao......................................................................................... 87 Captulo 9 - Texturas......................................................................................................................... 91 9.1 - Aplicao de Texturas no OpenGL....................................................................................... 91 9.1.1 - Especificao de textura ............................................................................................... 93 9.1.2 - Aplicao de Filtros ....................................................................................................... 95 9.1.3 - Objetos de Textura........................................................................................................ 97 9.1.4 - Funes de Texturas..................................................................................................... 99 9.1.5 - Atribuio de coordenadas s Texturas...................................................................... 101 9.1.6 - Gerao automtica de coordenadas ......................................................................... 102 9.2 - Carga de texturas atravs de arquivos............................................................................... 105 9.2.1 - Exemplode carga de texturas Arquivo .RAW......................................................... 107 9.2.2 - Exemplode carga de texturas Arquivo .BMP ......................................................... 113 9.2.3 - Exemplode carga de texturas Arquivo .JPG.......................................................... 119 Captulo 10 - Sombra Planar........................................................................................................... 125 10.1 - Calculando a Sombra de um objeto............................................................................. 125 10.2 - Exemplo de Sombra Planar ......................................................................................... 127 Captulo 11 - Blending..................................................................................................................... 135 11.1 - Comandos Opengl........................................................................................................ 136 11.2 - Exemplo de Blending ................................................................................................... 137 Concluso........................................................................................................................................ 142 Referncias bibliogrficas ............................................................................................................... 143 3 ndice de tabelas e figuras Figura 1. Processamento de dados pelo OpenGL.................................................................................................................14 Figura 2. Sintaxe de comandos OpenGL ..............................................................................................................................23 Tabela 1. Sufixo de comandos OpenGL................................................................................................................................24 Figura 3. Execuo do Exemplo 1.........................................................................................................................................28 Tabela 2. Tipos de primitivas ................................................................................................................................................31 Figura 4. Tipos de primitivas .................................................................................................................................................32 Figura 5. GL_POINTS...........................................................................................................................................................32 Figura 6. GL_LINES..............................................................................................................................................................33 Figura 7. GL_LINE_STRIP....................................................................................................................................................33 Figura 8. GL_LINE_LOOP ....................................................................................................................................................33 Figura 9. GL_TRIANGLES....................................................................................................................................................34 Figura 10. GL_TRIANGLE_STRIP........................................................................................................................................34 Figura 11. GL_TRIANGLE_FAN...........................................................................................................................................34 Figura 12. GL_QUADS .........................................................................................................................................................35 Figura 13. GL_QUADS_STRIP.............................................................................................................................................35 Figura 14. GL_POLYGON ....................................................................................................................................................35 Figura 15. Percepo de cores pelo olho humano ................................................................................................................37 Figura 16. Simulao de cores no computador .....................................................................................................................38 Tabela 3. Modos de cores.....................................................................................................................................................41 Tabela 4. Faixa de valores para converso de cores ............................................................................................................42 Figura 17. Comparao de transformaes : mquina..........................................................................................................45 Figura 18. Rotao ...............................................................................................................................................................46 Figura 19. Translao...........................................................................................................................................................47 Figura 20. Escala..................................................................................................................................................................47 Figura 21. Frustrum..............................................................................................................................................................53 Figura 22. Projeo perspectiva............................................................................................................................................54 Figura 23. Projeo ortogrfica.............................................................................................................................................55 Figura 24. Percepo tri-dimensional pelo olho humano.......................................................................................................57 Figura 25. Esfera wire-frame.................................................................................................................................................60 Figura 26. Cubo glGlutWireCube .......................................................................................................................................61 Figura 27. Cone - glutWireCone............................................................................................................................................62 Figura 28. Toroide - glutWireTorus........................................................................................................................................63 Figura 29. Dodecaedro glutWireDecahedron .....................................................................................................................63 Figura 30. Octaedro - glutWireOctahedron............................................................................................................................64 Figura 31. Tetraedro - glutWireTetrahedron ..........................................................................................................................64 Figura 32. Icosaedro - glutWireIcosahedron..........................................................................................................................65 Figura 33. Teapot - glutWireTeapot.......................................................................................................................................66 Figura 34. Imagem gerada pelo Exemplo 6 Animao e Formas 3D..................................................................................69 Figura 35. Iluminao ambiente............................................................................................................................................71 Figura 36. Fonte de luz difusa...............................................................................................................................................71 Figura 37. Luz especular.......................................................................................................................................................72 Tabela 5. Caracterstica da luz para a funo glLightfv .........................................................................................................75 Figura 38. Movimentao de luzes........................................................................................................................................77 Tabela 6. Valores para o modelo de iluminao - glLightModel.............................................................................................78 Tabela 7. Propriedades possveis para os materiais glMaterial*.........................................................................................79 Figura 39. Exemplo 7 Propriedades de Materiais...............................................................................................................83 Figura 40. Exemplo 8 Listas de visualizao......................................................................................................................90 Tabela 8. Modo de armazenamento de pixels no OpenGL - glPixelStorei .............................................................................93 Tabela 9. Filtros de texturas..................................................................................................................................................96 Tabela 10. Frmulas de aplicao de texturas glTexEnv* ................................................................................................100 Figura 41. Exemplo de Gerao automtica de coordenadas de texturas...........................................................................104 Figura 42. Exemplo 9 Cargas de texturas atravs de arquivos RAW................................................................................112 Figura 43. Exemplo 10 Cargas de texturas atravs de arquivos BMP..............................................................................118 Figura 44. Exemplo 11 Cargas de texturas atravs de arquivos JPG...............................................................................124 Figura 45. Sombra planar ...................................................................................................................................................125 Figura 46. Exemplo 12 Sombra planar .............................................................................................................................134 Figura 47. Processamento do blend .................................................................................................................................135 Tabela 11. Faixa de valores para a funo Blend - glBlendFunc.......................................................................................136 Figura 48. Exemplo 13 Blending ......................................................................................................................................140 4 PARTEI- INTRODUO 5 Introduo OOpenGLaproveita-sedosrecursosdisponibilizadospelosdiversos hardwaresgrficosexistentes.TododesenvolvimentofeitoatravsdestaAPI independente inclusive de linguagem de programao, podendo um objeto grfico ser desenvolvido em OpenGL puro, ou seja, livre das bibliotecas particulares de cadalinguagemdeprogramao,devendoparatalsomenteseguirasregras semnticaselxicasdalinguagemescolhida,semalteraodasfunes padronizadas do OpenGL. Por se tratar de uma biblioteca de funes, independente de plataforma e altamenteutilizadatantonomeioacadmicoquantonomeioprofissional,para desenvolvimentoeaplicaesemcomputaogrficaedevidoexistnciade poucosreferenciaisdepesquisadeOpenGL,disponveisnalnguaportuguesa este tema foi escolhido para pesquisa e desenvolvimento. Opresentetrabalhotemporobjetivoodesenvolvimentodeumtutorial apresentandoasfuncionalidadesdoOpenGLbemcomoautilizaodesuas bibliotecasdedesenvolvimento(GLUT:OpenGLUtilityToolKit)efuncionalidades da mesma, alm da apresentao do embasamento terico desta API. Visando a construogradativadoconhecimentodaferramentaporpartedoleitor, utilizando-se para tal, exemplos simples das funcionalidades do OpenGL. Estapresenteobraestdivididaem3partesdistintas:Introduo, Desenvolvimento e Concluso. Naprimeirapartesoapresentadososobjetivoseasjustificativasde escolhadotema,almdefazerumbreverelatodoscaptulossubseqentes contidos no desenvolvimento da presente obra. Apartededesenvolvimentofoisubdivididaem11captulosondeso tratados alm dos conceitos pr-liminares, conceitos mais avanados do OpenGL. 6 Existe uma breve introduo sobre a evoluo da computao grfica at a criao da API de desenvolvimento : OpenGL. Ocaptulo1fazaconceituaodoOpenGLalmdeapresentarsuas principais caractersticas tericas. Ocaptulo2ensinacomoconfigurarosdiversosambientesde desenvolvimento para utilizao das bibliotecas de desenvolvimento do OpenGL. Naseqnciaosdemaiscaptulosirotratarassuntosdecomputao grficacomoauxliodoOpenGLeestopostadosdeformaapropiciaruma construo deconhecimentogradativapor partedoleitor.Osmesmosseguema seguinte disposio de assuntos :-Captulo3-CriaodePrimitivas,quedescrevecomoconstruiras primitivas bsicas com a utilizao do OpenGL : pontos, polgonos, tringulos etc.;- Captulo4 - Cores : Alm de apresentar como a cor percebida pelo olho humano, tambm apresenta a formao de cores atravs do computador e como estas cores so tratadas pelo OpenGL. - Captulo5 - Transformaes : Apresenta as transformaes necessrias paraconstruodeumadeterminadacena,abordando:rotao,translao, escala; alm das transformaes de perspectiva e transformaes ortogrficas. - Captulo 6 -Formas 3D : Descreve as formas 3D suportadas e definidas no OpenGL. - Captulo 7 - Modelos de Iluminao : Apresenta os modelos de iluminao suportados, alm de apresentar as propriedades dos materiais no OpenGL. - Captulo 8 - Modelagem hierrquica : Descreve as formas de modelagem hierrquicas suportadas pelo OpenGL. - Captulo 9 - Texturas : Descreve as vrias formas de aplicao de texturas emumdeterminadoobjeto,almapresentarumabibliotecaauxiliarpara mapeamento de figuras no formato JPEG. -Captulo10-SombraPlanar:Descreveospassosparacriaode sombrasplanaresdeobjetos,baseadosemumafontedeluzeumplanode referncia. -Captulo11Blending:DescreveautilizaodoefeitoBlendingpara criao de efeitos de transparncia em objetos. 7 A terceira parte da desta obra apresenta a concluso do trabalho. 8 PARTEII- DESENVOLVIMENTO 9 HISTRICO AComputaoGrficaestpresenteemtodasasreas,desdeosmais inconseqentesjoguinhoseletrnicosatoprojetodosmaismodernos equipamentos para viagens espaciais, passando tambm pela publicidade, com as mais incrveis vinhetas eletrnicas e pela medicina onde a criao de imagens de rgosinternosdocorpohumanopossibilitamodiagnsticodemalesqueem outros tempos somente seria possvel com intervenes cirrgicas complicadas e comprometedoras. Parece existir consenso entre os pesquisadores da histria da Computao Grfica de que o primeiro computador a possuir recursos grficos de visualizao dedadosnumricosfoio"WhirlwindI"(furaco),desenvolvidopeloMIT.Este equipamentofoidesenvolvido,em1950,comfinalidadesacadmicasetambm possivelmentemilitares,poislogoemseguidaocomandodedefesaareados EUAdesenvolveuumsistemademonitoramentoecontroledevos(SAGE- Semi-AutomaticGroundEnviroment)queconvertiaasinformaescapturadas peloradaremimagememumtuboderaioscatdicos(napocaumainveno recente) no qual o usurio podia apontar com uma caneta tica. Ocorre que nesta poca os computadores eram orientados para fazer clculos pesados para fsicos eprojetistasdemsseisnosendoprpriosparaodesenvolvimentoda Computao Grfica. Em1962,surgiuumadasmaisimportantespublicaesdeComputao Grfica de todos os tempos, a tese do Dr. Ivan Sutherland ("Sketchpad - A Man-Machine Graphical Communication System"), propunha uma forma de inteno muitosemelhanteaoquehojechamadosdeinterfacesWIMPWindow-Icon-Menu-Pointer. Estapublicaochamouaatenodasindstriasautomobilsticase aeroespaciaisamericanas.Osconceitosdeestruturaodedadosbemcomoo ncleodanoodeComputaoGrficainterativalevouaGeneralMotorsa desenvolveroprecursordosprimeirosprogramasdeC.A.D.Logoemseguida 10 diversasoutrasgrandescorporaesamericanasseguiramesteexemplosendo que no final da dcada de 60 praticamente todas as indstrias automobilsticas e aeroespaciais faziam uso de softwares de CAD Doisfatores,entretanto,foramfundamentaisparaodesenvolvimentoda Computao Grfica tal como a conhecemos hoje: a)O desenvolvimento da tecnologia de circuitos integrados durante a dcadade70quepermitiuobarateamentoeaconseqente popularizao das mquinas; b)Ofimdaidiadequeosfabricantesdecomputadoresdevem fornecerapenasamquinaeosistemaoperacionalequeos usuriosdevemescreverseusprpriosaplicativos.Apopularizao dosaplicativosprontoseintegrados(planilhas,editoresdetexto, editoresgrficos,processadoresdeimagem,bancosdedados,etc) permitiramapopularizaodaComputaoGrficanamedidaem quepossibilitaramqueousuriocomumsemconhecimentoou tempoparadesenvolveraplicativosgrficos(nemsempreto simplesdeseremprogramados)pudesseutilizarasfacilidadesda mesma.Comaevoluodacomputaogrficafez-senecessriaaexistnciade bibliotecascomputacionaisquesuportassemodesenvolvimentodosaplicativos grficostantooscriadospelasindstriasdesoftwarescomoosdesenvolvidos pelo prprio usurio. Foi nos anos 70 que ocorreram os primeiros pacotes grficos e as primeiras confernciasdoSIGGRAPH(SpecialInterestGrouponGraphics).Foiproposta porumcomitessencialmenteNorteAmericanodoACMSIGRAPH,em1977,a primeirapadronizaogrficacomooCoreGraphicsSystem,conhecidocomo CORE.Oobjetivoerapropor,paraasaplicaesem2De3D,umpadro contendoumconjuntodefunesgrficasque,nasuautilizaono dependessem dos equipamentos grficos envolvidos na aplicao. No ponto final dadcadade70,foiformuladoumoutropadrodegrficos,chamadoGKS (Graphic Kernel System), que deveria adaptar-se melhor grande diversidade dos 11 equipamentosgrficosedasaplicaespotenciais,atravsdaintroduoda noodeestaodetrabalho.OGKSfoiadotadopelaISO(International Standards Organization) como norma internacional em 1985. A introduo da GKS comopadrointernacionalrepresentouumavano,apesarde,nasuaverso atualelenopossibilitasseoaproveitamentodecertosrecursosdisponveisem novos equipamentos grficos. A proposta em estudo pela ISO de um padro GKS para aplicaes grficas em 3D, deveria contribuir para expandir a sua aceitao. Aonveldepadronizaogrfica,umapropostafoifeitapelaANSI(American NationalStandardInstitute).Tratava-sedoPHIGS(ProgrammersHierarchical Interctive),quecobriaosaspectosdemodelagemdeobjetosporhierarquias (pontosnoabordadospeloGKS),assimcomoosaspectosgrficosem3D.A partir dos anos 80,comachegadadosmicrosedosseusaperfeioamentosconstantes,as aplicaes da Computao Grfica deixaram de ser reservadas aos especialistas. Padresgrficos,comooGKS(GraphicalKernelSystem)eoPHIGS (ProgrammersHierarchicalInteractiveGraphicsSystem),tiveramimportante papelnadcadade80,inclusiveajudandoaestabeleceroconceitodeusode padresmesmoforadareagrfica,tendosidoimplementadosemdiversas plataformas.NenhumadestasAPI's(ApplicationProgrammingInterface),no entanto,conseguiutergrandeaceitao(Segal,1994).Ainterfacedestinadaa aplicaesgrficas2Dou3Ddevesatisfazerdiversoscritrioscomo,por exemplo,serimplementvelemplataformascomcapacidadesdistintassem comprometer o desempenho grfico do hardware e sem sacrificar o controle sobre as operaes de hardware. (Segal, 1997) Atualmente,aOpenGL(GLsignificaGraphicsLibrary)umaAPIe grandeutilizaonodesenvolvimentoeaplicaesemcomputaogrfica.Este padro o sucessor da biblioteca grfica conhecida como IRIS GL, desenvolvida pelaSiliconGraphicscomoumainterfacegrficaindependentedehardware (Kilgard,1994).AmaioriadasfuncionalidadesdaIRISGLfoiremovidaou reescritanaOpenGLeasrotinaseossmbolosforamrenomeadosparaevitar 12 conflitos(todososnomescomeamcomglouGL_).Namesmapoca,foi formadooOpenGLArchitectureReviewBoard,umconsrcioindependenteque administra o uso da OpenGL, formado por diversas empresas da rea. OpenGL uma interface que disponibiliza um controle simples e direto sobre um conjunto de rotinas,permitindoaoprogramadorespecificarosobjetoseasoperaes necessrias para a produo de imagens grficas de alta qualidade. Para tanto, a OpenGLfuncionacomoumamquinadeestados,ondeocontroledevrios atributosrealizadoatravsdeumconjuntodevariveisdeestadoque inicialmente possuem valores default, podendo ser alterados caso seja necessrio. Por exemplo, todo objeto ser traado com a mesma cor at que seja definido um novovalorparaestavarivel.Porserumpadrodestinadosomente renderizao (Segal, 1997), a OpenGL pode ser utilizada em qualquer sistema de janelas(porexemplo,XWindowSystemouMSWindows),aproveitando-sedos recursos disponibilizados pelos diversos hardwares grficos existentes. 13 Captulo 1 - O que OpenGL OpenGLumainterfacedesoftwareparadispositivosdehardware.Esta interface consiste em cerca de 150 comandos distintosusados para especificar os objetoseoperaesnecessriasparaproduziraplicativostridimensionais interativos. OpenGLfoidesenvolvidocomfuncionalidadesindependentesdeinterface de hardware para ser implementado em mltiplas plataformas de hardware. DiantedasfuncionalidadesprovidaspeloOpenGL,talbibliotecatemse tornadoumpadroamplamenteadotadonaindstriadedesenvolvimentode aplicaes. Este fato tem sido encorajado tambm pela facilidade de aprendizado, pelaestabilidadedasrotinas,pelaboadocumentaodisponvel[Neider2000]e pelosresultadosvisuaisconsistentesparaqualquersistemadeexibio concordante com este padro. As especificaes do OpenGL no descrevem as interaes entre OpenGL e o sistema de janelas utilizado (Windows, X Window etc). Assim, tarefas comuns emumaaplicao,taiscomocriarjanelasgrficas,gerenciareventos provenientesdemouseeteclados,eapresentaodemenusficamacargode bibliotecasprpriasdecadasistemaoperacional.Nestetrabalhoserutilizadaa biblioteca GLUT (OpenGL ToolKit) para gerenciamento de janelas. Desdesuaintroduoem1992,OpenGLtransformou-senumpadro extensamente utilizado pelas indstrias.OpenGL promove a inovao e acelera o desenvolvimentodeaplicaesincorporandoumgrandeconjuntodefunesde render,detexturas,deefeitosespeciais,edeoutraspoderosasfunesde visualizao. 14 1.1- OpenGL como mquina de estados OpenGLumamquinadeestados.Todososestadosoumodos habilitadosnasaplicaestmefeitoenquantoosmesmosestiveremligadosou forem modificados. Todas as caractersticas do OpenGL, configurveis atravs de variveistaiscomo:cores,posies,caractersticadeluzes,propriedadesde materiais, objetos que esto sendo desenhados, projees e transformaes. 1.2- O Pipeline do OpenGL AmaiorpartedasimplementaesdoOpenGLtemumaordemde operaesaseremexecutadas.Umasriedeestgiosdeprocessoschamamo pipeline de renderizao do OpenGL. O diagrama seguinte mostra como o OpenGL, obtm e processa os dados. Figura 1. Processamento de dados pelo OpenGL 1.2.1 - Listas de Exposio Todososdadosdescrevemumageometriaoupixels,podemser conservados em uma lista da exposio para uso corrente ou serem usados mais tarde.(Aalternativaalmdemanterdadosemumalistadeexposio processarosdadosimediatamente(tambmconhecidocomomodoimediato)) 15 Quandoumalistadaexposioexecutada,osdadosretidossoenviadosda lista apenas como se fossem enviados pela aplicao no modo imediato. 1.2.2 - Avaliadores Todasasprimitivasgeomtricassoeventualmentedescritasporvrtices.Ascurvaseassuperfciesparamtricaspodeminicialmenteserdescritaspelos pontosdecontroleepelasfunespolinomiaischamadasfunesbase.Os avaliadores fornecem um mtodo para derivar os vrtices usados para representar asuperfciedospontosdecontrole.Omtodoomapeamento polinomial,que podeproduziranormaldesuperfcie,ascoordenadasdatextura,ascores,e valores de coordenadas espaciais dos pontos de controle. 1.2.3 - Operaes por vrtices Paradadosdosvrtices,estseguidado"oestgiodasoperaespor vrtices",queconverteosvrticesemprimitivas.Algunsdadosdovrtice(por exemplo, coordenadas espaciais) so transformados em matrizes4 x 4 de pontos flutuantes.Ascoordenadasespaciaissoprojetadasdeumaposionomundo 3D a uma posio na tela. Se as caractersticas avanadas estiverem habilitadas permitidas,esteestgiomesmomaisocupado.Setexturizaoforusada,as coordenadasdatexturapodemsergeradasetransformadasaqui.Seasluzes foremhabilitadas,osclculosdaluzseroexecutadosusandoosvrtices transformados, a normal da superfcie, a posio da fonte de luz, as propriedades de materiais, e a outras informaes de luzes para produzir um valor da cor. 1.2.4 - Montagem de Primitivas Clipping,uma parteimportantedamontagem deprimitivas,a eliminao departesdageometriaquesaem foradeumapartedoespao, definidoporum plano.O clipping do ponto simplesmente passa ou rejeita vrtices;o clipping da linha ou do polgono pode adicionar novos vrtices , dependendo de como a linha ouopolgonosointerligados.Emalgunscasos,istoseguidopeladivisoda perspectiva,aqualfazcomqueosobjetosgeomtricosdistantespareammais 16 perto.Ento as operaes do viewport e da profundidade (coordenada de z) so aplicadas. 1.2.5 - Operaes de Pixels Enquanto os dados geomtricos pegam um caminho atravs do pipeline de renderizaodoOpenGL.,dadosdepixelstomamumarotadiferente.Osdados de Pixels em umamatriz na memria do sistema so empacotados e em seguida escalados,inclinadoseprocessadosporummapadepixels.Osresultadosso escritosnamemriadatexturaouemitidosumaetapaderasterizao.Seos dadosdopixelforemlidosdoframebuffer,operaesdetransfernciadepixels (escala,polarizao,mapeamento,clamping)soexecutadas.Entoestes resultados so empacotados em um formato apropriado e retornados a uma matriz de memria do sistema. 1.2.6 - Montagem de Texturas UmaaplicaoOpenGLpodeaplicarimagensdetexturasemobjetos geomtricos,paratornarestesmaisrealsticos.Sediversasimagensdetextura foremusadas,asmesmasdeverosercolocadasemobjetosdemodoquese possafacilmentecomutarentreelas.AlgumasexceesdoOpenGLpodemter recursosespeciaisparaacelerarodesempenho dastexturas.Se existirmemria especialdisponvel,osobjetosdetexturapodemterprioridadedecontroledo recurso limitado de memria. 1.2.7 - Rasterizao Rasterizaoaconversodedadosgeomtricosedopixelem fragmentos. Cada quadrado do fragmento corresponde a um pixel no framebuffer. Osstipplesdalinha edo polgono,larguradalinha,tamanhodoponto, modelo desombra,eosclculosdacoberturaparasuportaroantialiasingsofeitos considerando a conexo dos vrticesem linhas ou os pixels internos. Os valores da cor e da profundidade so atribudos para cada quadrado do fragmento. 17 1.2.8 - Operaes fragmentadas Antesqueosvaloresestejamarmazenadosrealmentenoframebuffer,uma sriedeoperaes,quepodemsealteraroumesmojogarsairforados fragmentos,soexecutadas.Todasestasoperaespodemserhabilitadasou desabilitadas. A primeira operao que pode ser encontrada o texturing, onde umtexel(elementodatextura)geradonamemriadatexturaparacada fragmentoeaplicadoaofragmento.Entoosclculosdofogpodemser aplicados seguidos pelo teste scissor, pelo teste do alfa, pelo teste do estncil, e pelo testedo buffer deprofundidade(obufferdeprofundidade para aremoo de faces ocultas da superfcie). Ento, blending, operao lgica de dithering, e mascaramentopor um bitmask podem ser executadas.1.3- Funes grficas do OPENGL Bufferdeacumulao:Trata-sedeumbuffernoqualmltiplosframes renderizados,podemsercompostosparaproduzirumanicaimagem.Usado paraefeitostaiscomoaprofundidadedecampo,blurdemovimento,edeanti-aliasing da cena. AlfaBlending:Provmecanismosparacriarobjetostransparentes.Usandoa informaoalfa,umobjetopodeserdefinidocomoalgototalmentetransparente at algo totalmente opaco. Anti-aliasing:Ummtododerenderizaoutilizadoparasuavizarlinhase curvas. Esta tcnica calcula a mdia da cor dos pixels junto linha. Tem o efeito visual de suavizar a transio dos pixels na linha e daqueles junto linha, assim fornecendo uma aparncia mais suave. ModoColor-Index:BufferdeCoresquearmazenandicesdecoresdas componentesvermelhas, verdes, azuis, e alfa das cores (RGBA). 18 Display Lists : Uma lista nomeada de comandos de OpenGL. Os ndices de um Displaylistpodemserpr-processadosepodemconseqentementeexecutar maiseficientementedoqueomesmoconjuntodecomandosdoOpenGL executados no modo imediato. Double buffering : Usado parafornecer uma animao suave dosobjetos. Cada cena sucessiva de um objeto em movimento pode ser construda em background ounobufferinvisveleentoapresentado.Istopermitequesomenteas imagens completas sejam sempre apresentadas na tela. FeedBack:UmmodoondeOpenGLretornarainformaogeomtrica processada (cores, posies do pixel, e assim por diante) aplicao. GouraudShading:Interpolaosuavedascoresatravsdeumsegmentode polgonooudelinha.Ascoressoatribudasemvrticeselinearmente interpoladas atravs da primitiva para produzir uma variao relativamente suave na cor. Modo Imediato : A execuo de comandos OpenGL quando eles so chamados, possui resultado melhor do que os Display Lists. Iluminaoesombreamentodemateriais:Ahabilidadedecomputar exatamenteacordealgumpontodadoaspropriedadesmateriaisparaa superfcie. Operaes de pixel : Armazena, transforma, traa e processa aumento e reduo de imagens. Executorespolinomiais:ParasuportarasNURBS(non-uniformrationalB-splines). 19 Primitivas:Umponto,umalinha,umpolgono,umbitmap,ouumaimagem. Primitivas da rasterizao : bitmaps e retngulos de pixels ModoRGBA:Buffersdecoresarmazenamcomponentesvermelhos,verdes, azuis, e alfa da cor. Seleo e colheita : Trata-se de um modo no qual o OpenGL determina se certa primitiva identificada do grficos renderizada em uma regio no buffer de frame. Planos do estncil : Um buffer que usado para mascarar pixels individuais no buffer de frame de cores. MapeamentodeTexturas:Oprocesso deaplicarumaimagem aumaprimitivagrfica. Esta tcnica usada para gerar o realismo nas imagens. Transformaes :A habilidade de mudar a rotao, o tamanho, e a perspectiva de um objeto no espao 3D coordenado. Z-buffering:OZ-bufferusadoparaverificarseumaporodeumobjeto maisprximadateladoqueoutra.importantenaremoodesuperfcie escondida. 20 Captulo 2- Ambiente OpenGL para desenvolvimento 2.1- Instalao do OPENGL AsbibliotecasdoOpenGLsodistribudascomopartedossistemas operacionaisdaMicrosoft,pormasmesmaspodemserbaixadasnositeoficial doOpenGL:http://www.opengl.org.Estasbibliotecastambmestodisponveis emoutrossistemasoperacionaisporpadro,taiscomo,MacOSeUnixSolaris, alm de estarem disponveis no Linux. 2.2- Instalao do GLUT O GLUT um conjunto de ferramentas para escrita de programas OpenGL, independentedosistemadejanelas.Eleimplementaumsistemadejanelas simplesatravsdesuaAPI,paraosprogramasOpenGL.GLUTprovumaAPI portvel,oquepermitequeprogramastrabalhemtantoemambientesbaseados em WIN32 quanto X11. O GLUT suporta : - Janelas mltiplas para renderizao OpenGl - Resposta a eventos baseados em Callback de funes - Uma rotina idle e timers - Criao de menus pop-up simples - Suporte pra bitmaps e fontes - Uma miscelnea de funes para gerenciamento de janelas. 2.2.1 -Instalando o GLUT no Borland C++ Builder 5 no ambiente Windows OsarquivosdeinstalaodoGLUTpoderoserobtidosem http://www.opengl.org/developers/documentation/glut/index.html 21 1Baixeoarquivodolinkacimaedescompacte-osemumapasta temporria 2 Copie os arquivos glut.dll e glut32.dlla pasta c:\windows\system32 ou uma pasta que esteja no caminho do sistema operacional, no PATH. 3 Copie os arquivos glut*.lib para \lib 4 Copie o arquivo glut.h para < diretrio de Borland C Builder >\include\gl 5ComoosarquivosoriginaissodesenvolvidosparaMicrosoftVisual C++ voc dever executar os seguintes comandos dentro da pasta \lib, localizada dentro do diretrio de instalao do Borland C++ :- implib glut.lib c:\windows\system32 - implib glut32.lib c:\windows\system\glut32.dll

Obs.: Normalmente podero ocorrer problemas no momento da compilao / linkedio de um programaOpenGL, com o Borland C++, porm isto se deve ao fatodainstalaodomesmotersidofeitanocaminho\Arquivosde programas\Borland\CBuilder5,existeumpequenobug.Pararesoluodeste problemainstaleoCBuildereumdiretriotipoC:\BC5quefuncionar corretamente. 2.2.2 - Instalando o GLUT no MS Visual C++ ComoestaAPIfoidesenvolvidanoprprioMSVisualC++,no necessrianenhumaconversodamesmaparafuncionamento.Porm necessrioainstalaodamesma.Assimeladeverserbaixadadositehttp://www.opengl.org/developers/documentation/glut/index . 1 Descompacte os arquivos em um diretrio temporrio. 2 Copie os arquivos glut.dll e glut32.dlla pasta c:\windows\system32 ou uma pasta que esteja no caminho do sistema operacional, no PATH. 3 Copie os arquivos glut*.lib para \lib 4Copieoarquivoglut.hpara\include\gl 22 5Quandoforcompilarumprogramadeveroseremincludasas seguintes bibliotecas na opo de linkedio do programa :opengl32.lib, glu32.lib, glut32.lib. 2.2.3 - Instalando o GLUT no DEV-C++ O Dev-C++ um ambiente de desenvolvimento integradopara a linguagem deprogramaoC/C++.OcompiladorDev-C++,quedsuporteacompiladores baseadosnoGCC(GNUCompilerCollection),podeserobtidoem http://www.bloodshed.net/devcpp.html. A verso mais atual do Dev-C++(4.9.8 ou superior) j inclui as bibliotecas doGLUTporpadrodevendoapenasteropasso2executado.Paraverses anteriores siga os seguintes passos : 1.Faa o download do arquivo glut-devc.zip e descompacte o mesmo;2.Movaoarquivoglut.hparaapastaGLdoDevC++(C:\Dev-C++\Include\GL);3.Movaosarquivosglut32.defelibglut.aparaapastaLibdoDevC++ (C:\Dev-C++\Lib);4.Movaoarquivoglut32.dllparaamesmapastaondeseencontramos arquivos opengl32.dll e glu32.dll;2.3- Sintaxe de Comandos do OpenGL OscomandosdaAPIOpenGLobedecemaumpadrobemdefinidopara especificaodosnomesde funeseconstantes. Todososcomandos utilizam-sedoprefixoglemletrasminsculas.Similarmente,OpenGLdefineconstantes com as iniciais GL_, em letras maisculas, e usa um underscore para separar as palavras ( Ex. GL_COLOR_BUFFER_BIT ). Emalgumasfunesalgumasseqnciasdecaracteresextrasaparecem, como sufixo, no nome destas funes (Ex. glColor3f e glVertex3f). verdade que aparteColordocomandoglColor3f()nosuficienteparadefinirocomando comoumconjuntodecorescorrentes.Particularmente,aparte3dosufixo 23 indica que trs argumentos so necessrios; outra verso de Color necessita de 4argumentos.Ofdosufixoindicaqueosargumentossodotiponmerosde pontoflutuante.Atravsdestasdefiniesparadiferentestiposdeformatos permitido ao OpenGL aceitar dados no seu prprio formato definido. Figura 2.Sintaxe de comandos OpenGL AlgunscomandosOpenGLaceitamat8tiposdiferentesdeargumentos. Asletrasusadascomosufixo,como dito anteriormente,irodeterminarotipode dados correspondente padronizao ISO para implementao em linguagem C. Sufixos de comandos e tipos de dados para argumentos SufixoTipo de DadosTipo correspondente na linguagem CDefinio de tipo para OpenGL bInteiro de 8 bitsSigned charGLbyte sInteiro de 16 bitsShortGLshort iInteiro de 32 bitsInt ou longGLint,GLsizei fPonto flutuante de 32 bitsFloatGLfloat,GLclampf 24 dPonto flutuante de 64 bitsdoubleGLdouble,GLclampd ubInteiro no sinalizado de 8 bitsUnsigned charGLubyte,GLboolean usInteiro no sinalizado de 16 bitsUnsigned shortGLushort uiInteiro no sinalizado de 32 bitsUnsigned int ou unsigned longGLuint,GLenum,GLbitfield Tabela 1. Sufixo de comandos OpenGL 2.4- Estrutura Bsica de Programas OpenGL UmprogramaOpenGLdeveconterummnimoderequisitosparasua perfeita execuo. Normalmente alguns passos devem ser seguidos para criao destes programas. Estes passos so: declarao dos arquivos de header para o OpenGL; configurar e abrir a janela; inicializar os estados no OpenGL; registrar as funes de callback; renderizao; redimensionamento; entradas : teclado, mouse, etc.; entrar no loop de processamento de eventos. O programa exemplo abaixo ir ilustrar estes passos #include #include void main( int argc, char** argv ) { int mode = GLUT_DOUBLE | GLUT_RGB; glutInitDisplayMode( mode ); glutInitWindowSize(400,350); glutInitWindowPosition(10,10); glutCreateWindow( argv[0] ); init(); glutDisplayFunc( display ); glutReshapeFunc( resize ); glutKeyboardFunc( key ); 25 glutIdleFunc( idle ); glutMainLoop(); } Osarquivosdeheadercontmasrotinasedeclaraesnecessriaspara utilizao do OpenGL/GLUT com a linguagem c/c++. AsfunesglutInitDisplayMode()eglutCreateWindow()compemopasso deconfiguraodajanela.Omododajanelaqueargumentoparaa funo glutInitDisplayMode(),indica a criao de uma janela double-buffered (GLUT_DOUBLE)comomododecoresRGBA(GLUT_RGB).Oprimeiro significa que os comandos de desenho so executados para criar uma cena foradatelaparadepois,rapidamente,coloc-lanaview(oujanelade visualizao).Estemtodogeralmenteutilizadoparaproduzirefeitosde animao. O modo de cores RGBA significa que as cores so especificadas atravsdofornecimentodeintensidadesdoscomponentesred,greene blue separadas.A funo glutCreateWindow() cria a janela com base nos parmetrosdefinidosnasfunesglutInitWindowSize(tamanhodajanela empixels)eglutInitWindowPosition(coordenadasparacriaodajanela). Esta janela conter o nome especificado em seu parmetro de entrada. Em seguida chamada a rotina init(), a qual contm a primeira inicializao doprograma.Nestemomentoseroinicializadosquaisquerestados OpenGL, que sero executados na execuo do programa. Oprximopassoseroregistrodasfunesdecallback,queestaro sendo utilizadas na execuo do programa. Finalmenteoprogramairentraremumprocessodeloop,oqual interpreta os eventos e chamadas das rotinas especificadas como callback. 26 2.4.1 - Rotinas de Callback Asfunesdecallbacksoaquelasexecutadasquandoqualquerevento ocorrenosistema,taiscomo:redimensionamentodejanelaodesenhoda mesma,entradasdeusuriosatravsdeteclado,mouse,ououtrodispositivode entrada,eocorrnciadeanimaes.Assimodesenvolvedorpodeassociaruma ao especifica ocorrncia de determinado evento. GLUToferecesuporteamuitosdiferentestiposdeaesdecallback includo : oglutDisplayFunc()chamadaquandoumpixelnajanelanecessita ser atualizado. oglutReshapeFunc() chamado quando a janela redimensionada. oglutKeyboardFunc()chamadaquandoumatecladoteclado pressionada. oglutMouseFunc() chamada quandoo usurio pressiona um boto do mouse. oglutMotionFunc()-chamadaquandoousuriomovimentaomouse enquanto mantm um boto do mesmo pressionado. oglutPassiveMouseFunc()chamadoquandoomouse movimentado, independente do estado dos botes. oglutIdleFunc() uma funo de callback chamada quando nada est acontecendo. Muito til para animaes. 27 2.4.2 - Exemplo de um programa OpenGL Este exemplo simples, apenas desenha um quadrado na tela. /* Exemplo1.c - Marcionlio Barbosa Sobrinho * Programa simples que apresenta o desenho de um quadrado * Objetivo : Demonstrar funes de gerenciamento de*janelas e funes de callback * Referncia do Cdigo: OpenGL Programming Guide - RedBook */ #include #include #include void display(void) { /* Limpa o Buffer de Pixels */ glClear (GL_COLOR_BUFFER_BIT);

// Define a cor padro como branco glColor3f (1.0, 1.0, 1.0);

/* desenha um simples retngulo com as coordenadas * (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); /* Inicia o processo de desenho atravs dos dados bufferizados */ glFlush (); } void init (void) { /* Seleciona a cor de fundo para limpeza da tela */ glClearColor (0.0, 0.0, 0.0, 0.0);

/* inicializa os valores de visualizao */ glMatrixMode(GL_PROJECTION); /* Faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformao acumulada)*/ glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } /* Cria a janela */ int main(int argc, char** argv) {

/* Estabelece o modo de exibio a ser utilizado pela janela a ser criada neste caso utiliza-se de um buffer simples, ou seja, a apresentao ser imediata execuo Define o modo de cores como RGBA */ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

/* 28 Determina o tamanho em pixels da janela a ser criada */ glutInitWindowSize (250, 250);

/* Estabelece a posio inicial para criao da janela */ glutInitWindowPosition (100, 100);

/* Cria uma janela com base nos parmetros especificados nas funesglutInitWindowSize e glutInitWindowPosition com o nome de ttulo especificado em seu argumento */ glutCreateWindow ("Exemplo 1");

/*Especifica os parmetros inicias para as variveisde estado do OpenGL */ init ();

// Associa a funo display como uma funo de callback glutDisplayFunc(display);

/* Inicia a execuo do programa OpenGL. O programa ir executar num loop infinito devendo o desenvolvedor especificar as condies de sada do mesmo atravs de interrupes no prprio programa ou atravs de comandos de mouse ou teclado como funes de callback */ glutMainLoop(); return 0; } Figura 3.Execuo do Exemplo 1 29 Captulo 3 - Criao de Primitivas. Todas as primitivas geomtricas, no OpenGL, so eventualmente descritas em termos de seus vrtices coordenadas que definem os pontos, pontos finais e segmentosdelinhas,oucantosdepolgonososquaissocoordenadas homogneas [Mason Woo]. Coordenadas homogneas so da forma( x, y, z, w ). Dependendodecomoosvrticesestoorganizados,OpenGLpoderenderizare mostrar qualquer primitiva. O OpenGL apresenta apenas 10 tipos de primitivas distintas, porm com a devidaorganizaodestasprimitivaspossvelacriaodeestruturasmais complexas. 3.1- Pontos Um ponto representado por um conjunto de nmeros de pontos flutuantes chamadosvertex.Todosclculosinternosso feitoscomoseos vrticesfossem tridimensionais. Vrtices especificados por um usurio como bidimensional (isto , somentecomascoordenadasxey)tmacoordenadazatribudacomo0pelo OpenGL. ComodescritoanteriormenteoOpenGLtrabalhacomcoordenadas homogneasdegeometriaprojetivatridimensiona.Entoparaclculosinternos, todososvrticessorepresentadoscomquatrocoordenadasdeponto-flutuante (x,y, z, w). Se w diferente de zero, estas coordenadas correspondem a pontos tridimensionais Euclidianos (x/w, y/w, z/w).[Woo 1997].3.2- Linhas Em OpenGL, o termo linha refere-se a segmento de linha; no , portanto, a versomatemticaqueestendeparaoinfinitoemambasasdirees.Existem formas fceis para especificar uma serie conecta de segmentos de linhas, ou uma sriefechadadesegmentos.Emtodososcasos,portanto,aslinhasque constituem a srie conectada, so especificadas nos termos dos seus vrtices at seus pontos finais.. 30 3.3- Polgonos Polgonos so reas fechadas por um loop simples de segmentos de linhas, onde os segmentos de linhas so especificados por vrtices e seus pontos finais. Polgonos so tipicamente desenhados com os pixels do seu interior preenchidos, mas tambm podem ser desenhados como no preenchidos ou como um conjunto de pontos.[Woo 1997] Nogeral,polgonospodemsercomplicados,entoOpenGLfazalgumas restriesnoqueconstituiestaprimitiva.Primeiramente,asbordasdeum polgono OpenGL no podem cruzar-se (Matematicamente deve ser um polgono simples).Segundo,ospolgonosdeOpenGLdevemserconvexos,significando quenopodemterrecortes.Indicadaprecisamente,umaregioconvexase dadoquaisquerdoispontosnointerior,alinhasegmentoqueosuneestiver tambm no interior.[Woo 1997] A razo para as limitaes de OpenGL em tipos vlidos de polgonos que maissimplesfornecerrapidamenteumhardwarederenderizaodepolgono paraessaclasserestritadospolgonos.Ospolgonossimplespodemser renderizadosrapidamente.Outroscasossodifceisdedetectarrapidamente. Assimparaodesempenhomximo,OpenGLsupequeospolgonosso simples.[Woo 1997]3.4- Desenhando PrimitivasNoOpenGLtodosobjetosgeomtricossodescritoscomoumjogo ordenado de vrtices. Para tal operao utilizada a funo glVertex*() .[Woo 99]. (onde*representaoparmetrorelativoaonmerodecomponentesetiposde dados a serem utilizados no desenho. Conforme descrito no captulo anterior.) Exemplo : glVertex2s(2, 3); glVertex3d(0.0, 0.0, 3.1415926535898); glVertex4f(2.3, 1.0, -2.2, 2.0); GLdouble dvect[3] = {5.0, 9.0, 1992.0}; glVertex3dv(dvect); 31 Umavezqueosvrticesestoespecificados,necessriodizerao OpenGLquetipodeprimitivasercriada.Paraqueistoaconteanecessrio queaespecificaodosvrticesestejamentreopardecomandosglBegin()e glEnd().OparmetrodocomandoglBegin()serotipodaprimitivaaser desenhada. Os tipos possveis para parmetro so : Valor do parmetroSignificado GL_POINTSPontos Individuais GL_LINES Pares de vrtices interpretados como segmentos de linha individuais GL_LINE_STRIPSrie de segmentos de linha conectadosGL_LINE_LOOP Como o anterior, pormcom um segmento adicionado entre ltimo e primeiro vrtices GL_TRIANGLESTriplos vrtices interpretados como tringulos GL_TRIANGLE_STRIPFaixas de tringulos unidas GL_TRIANGLE_FANLeque de tringulos unidos GL_QUADS Qudruplo de vrtices interpretadoscomo polgonos de quatro lados GL_QUAD_STRIPFaixa quadrilateral unidaGL_POLYGONLimite de um polgono simples, convexo Tabela 2. Tipos de primitivas O comando glEnd() marca o fim de uma lista de dados de vrtices. A figura abaixo mostra o exemplo desenhado de todas as primitivas acima : 32 Figura 4.Tipos de primitivas 3.5- Programa exemploNeste exemplo sero utilizados todos os tipos de primitivas suportadas pelo OpenGL. A base dos programas ser o programa exemplo do tpico 2.4.2 - Exemplo de um programa OpenGL. A funo display() dever ter a poro de cdigo relativa ao desenho da primitiva alterada para tratamento de cada tipo. GL_POINTS glBegin(GL_POINTS); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); Figura 5.GL_POINTS 33 GL_LINES glBegin(GL_LINES); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glEnd(); Figura 6.GL_LINES GL_LINE_STRIP glBegin(GL_LINE_STRIP); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.30, 0.45, 0.0); glEnd(); Figura 7.GL_LINE_STRIP GL_LINE_LOOP glBegin(GL_LINE_LOOP); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.30, 0.45, 0.0); glEnd(); Figura 8.GL_LINE_LOOP 34 GL_TRIANGLES glBegin(GL_TRIANGLES); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.30, 0.45, 0.0); glEnd(); Figura 9.GL_TRIANGLES GL_TRIANGLE_STRIP glBegin(GL_TRIANGLE_STRIP); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.30, 0.45, 0.0); glVertex3f (0.45, 0.12, 0.0); glEnd(); Figura 10.GL_TRIANGLE_STRIP GL_TRIANGLE_FAN glBegin(GL_TRIANGLE_FAN); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.30, 0.45, 0.0); glVertex3f (0.45, 0.12, 0.0); glEnd(); Figura 11.GL_TRIANGLE_FAN 35 GL_QUADS glBegin(GL_QUADS); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); Figura 12.GL_QUADS GL_QUADS_STRIP glBegin(GL_QUAD_STRIP); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); Figura 13. GL_QUADS_STRIP GL_POLYGON glBegin(GL_POLYGON); glVertex3f( 0.10, 0.10 ,0.0 ); glVertex3f( 0.10, 0.30,0.0); glVertex3f( 0.40, 0.30,0.0); glVertex3f( 0.60, 0.30,0.0); glVertex3f( 0.40, 0.10,0.0); glEnd(); Figura 14. GL_POLYGON 36 Captulo 4 - Cores Cor simplesmente um comprimento de onda de luz que visvel ao olho humano. Fisicamente a luz composta de ftons pequenas partculas de luz, cada umaviajandoaolongodoseuprpriocaminho,ecadaumavibrandoemsua prpriafreqncia(oucomprimentodeonda,ouenergia).Umfton completamente caracterizado por sua posio, direo e freqncia . Ftons com comprimentoderondasquepercorremaproximadamente390nanmetros(nm) (violeta)e720nm(vermelho)cobremoespectrodecoresvisveis,formandoas coresdoarco-ris(violeta,ndigo,azul,verde,amarelo,laranjaevermelho). Entretanto,osolhoshumanospercebemalmdascoresdoarco-risrosa, dourado , por exemplo. 4.1- Percepo de cores pelo olho humano Oolhohumanopercebeascoresquandocertasclulasnaretina (chamadas clulas cone, ou somente cones) se tornam excitadas depois de serem atingidas por ftons. Os trs diferentes tipos de clulas cone respondem melhor a trscomprimentosdeondasdeluzdiferentes:umtipodeclulaconeresponde melhoraluzvermelha,umtipoparaoverde,eoutroparaoazul.Quandouma determinadamisturadeftonsentra noolho,asclulasconenaretinaregistram grausdiferentesdeexcitaoquedependedosseustipos,eseumamisturade diferentes ftons entra, pode acontecer a excitao dos trs tipos de cone em um mesmo grau, sua cor ser indistinguvel na primeira mistura. 37 Figura 15. Percepo de cores pelo olho humano 4.2- Cores no Computador Ummonitordecomputadoremulaascoresvisveisiluminandopixelscom umacombinaodevermelho,verde,eluzazul(tambmchamadoRGB)em proporesqueexcitamosconessensveisao:vermelho,verdeeconeazulna retinadetalmodoquecompatibilizaosnveisde excitaogeradospela mistura de fton que se est tentando emular. Paraexibirumacorespecifica,omonitorenviacertasquantiasdeluz vermelha,verdeeazulparaadequadamenteestimularostiposdiferentesde clulasconedoolhohumano.Ummonitorcoloridopodeenviardiferentes proporesdevermelho,verde,eazulparacadapixel,eoolhovmilhesde cores ou assim define os pontos de luz, cada um com sua prpria cor. 38 Figura 16. Simulao de cores no computador 4.3- Cores no OpenGL No OpenGL possvel trabalhar com cores de dois modos diferente : Modo RGBA e Modo de ndice de Cores. Antesdaexecuodeumprogramaomododeexibiodecoresdever ser definido como RGBA ou ndice de Cores. Uma vez que o modo de exibio inicializado,nopodersermodificado.Comooprogramaexecutaumacor(ou umndicedecoresouumvalordeRGBA)determinadoemumabasede vrticesparacadaprimitivageomtrica.Estacorouumacorespecificada explicitamente para um vrtice ou, se a iluminao est habilitada, determinada pelainteraodasmatrizesdetransformaocomasnormaisdasuperfciee outras propriedades dos materiais. 39 4.3.1 - Escolhendo entre RGBA e ndice de Cores Por prover maior flexibilidade que o modo de ndice de Cores, normalmente o mododecoresutilizadooRGBA.PormomododendicedeCorespodeser escolhido nos seguintes casos : No caso de se estar portando uma aplicao existente que j utilize ndice de Cores Se houver apenas um pequeno nmero de bitplanes disponveis, o modo RGBApodeproduzirsombrasdecores.Exemplosehouverapenas8 bitplanes, no modo RBGA, s existiro 3 partes para o vermelho, 3 para o verdee2paraoazul.Assimexistiro8sombrasdevermelhoeverdee somente 4 sombras de azul. provvel que os gradientes entre as sombras no apresentem perfeio . Este modo pode ser muito til em efeitos como, animaes de mapeamento de cores e desenho de camadas. 4.3.2 - Definindo o Modo de cores O comando para definio do modo de cores : void glutInitDisplayMode(unsigned int mode); O modo dever ser um ou mais da seguinte tabela : Modo Descrio GLUT_RGBA Seleodo modo RGBA para a janela. Se nem o parmetro GLUT_RGBA ou GLUT_INDEX forem definidos ele ser o padro GLUT_RGBApelido para o GLUT_RGBA 40 GLUT_INDEX Modo de ndice de Cores. A especificaodeste modo anula o modo GLUT_RGBA se este tambm for especificado como modo GLUT_SINGLE Seleciona apenas um buffer para janela. Este o valor padro se nem GLUT_DOUBLE ou GLUT_SINGLE forem especificados. GLUT_DOUBLE Seleciona dois buffers para a janela. Sobrepe o GLIT_SINGLE se especificado GLUT_ACCUM Ativa o modo de acumulao de buffer para a janela GLUT_ALPHA Ativa a componente ALFA de cor para a janela GLUT_DEPTH Ativa o buffer de profundidade para a janela GLUT_STENCIL Ativa o buffer de estncil GLUT_MULTISAMPLE Selecione uma janela com opode multisampling. Se multisampling no est disponvel, uma janela de non-multisampling ser escolhida automaticamente GLUT_STEREO Seleo de uma janela no modo estreo GLUT_LUMINANCE Selecione uma janela com um modelo de cores de Luminancia. Este modo prov a funcionalidade do RGBA de OpenGL, mas os componentes verdes e azuis no so mantidos no frame buffer. Ao invs disso o componente vermelho de cada pixel convertido para um ndice entre zero e glutGet (GLUT_WINDOW_COLORMAP_SIZE)-1 e observado em um mapa de cores por janela para determinar a cor de pixels dentro da janela. O colormap inicial de janelas de GLUT_LUMINANCE inicializado para 41 ser uma escala de cinza linear, mas pode ser modificado com as rotinas de colormap da GLUT Tabela 3. Modos de cores Paraespecificaracoremumdeterminadovrticeocomandoaserutilizadoo seguinte : glColor*(), onde o * representa o sufixo do nmero de coordenadas, o tipo dedadoseovetor.(Osparmetrospoderovariardeacordocomaquantidade decoordenadas,eotipodosmesmosdeacordocomotipoespecificadono sufixo.) Afaixadevaloresdecoresrepresentadaporvaloresdepontoflutuante quevariamde0a1,eestaafaixadevaloresquepodeserarmazenadano framebuffer. OOpenGLfazaconversodostiposdedadosparavaloresdeponto flutuante.Atabelaabaixoapresentaasfaixasdevaloresparaosparmetrosdas cores,paracadatipoderepresentaodedadosdosparmetros,eovalor mximo e mnimo da converso interna do OpenGL : SufixoTipo de Dado Valor MnimoValor mnimo para mapeamento Valor Mximo Valor mximo para mapeamento B Inteiro de 1 byte -128-1.01271.0 sInteiro de 2 bytes -32768-1.0327671.0 iInteiro de 4 bytes -2147483648-1.021484836471.0 ubInteiro no sinalizado de 1 byte 00.02551.0 usInteiro no sinalizado de 2 bytes 00.0655351.0 Ui Inteiro no sinalizado de 00.042949672951.0 42 4 bytes Tabela 4. Faixa de valores para converso de cores 4.3.3 - Exemplo da utilizao de cores /* Exemplo2.c - Marcionlio Barbosa Sobrinho * Programa simples que apresenta o desenho de um quadrado com variao de cores nos vertices * Objetivo : Demonstrar a utilizao de cores nos objetos * Referncia do Cdigo: OpenGL Programming Guide - RedBook */ #include #include #include GLfloat vermelho; GLfloat verde; GLfloat azul; void display(void) { /* Limpa o Buffer de Pixels */ glClear (GL_COLOR_BUFFER_BIT);

// Define a cor padro com base nos parametros glColor3f (vermelho, verde, azul);

/* desenha um simples retngulo com as coordenadas * (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); /* Inicia o processo de desenho atravs dos dados bufferizados */ glFlush (); } void init (void) { /* Define os parmetros de cores para obter a cor branca */ vermelho = 1.0; verde = 1.0; azul = 1.0; /* Seleciona a cor de fundo para limpeza da tela */ glClearColor (0.0, 0.0, 0.0, 0.0);

/* inicializa os valores de visualizao */ glMatrixMode(GL_PROJECTION); /* Faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformao acumulada)*/ glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } 43 /* Funo responsvel pelo controle do teclado. Dependendo da tecla pressionada : R,G,B, adiciona uma constante ao valor da mesma e redesenha novamente a cena com aNova cor obtida destes pmetros. Se a telca O for pressionada volta o estado original da imagem. O operador ternrio est comentado por apresentar incompatibilidades Com o compilador Dev-C++, porm no existem incompatibilidades com o Borland C++ Builder nem com MS Visual C++ */ void teclado(unsigned char tecla, int x, int y) { switch (tecla) { case 'R': case 'r':// Incrementa o valor do parmetro da cor Vermelho // (vermelho - 0.1) < 0 ? vermelho = 1 : vermelho -= 0.1; vermelho = vermelho - 0.1; if (vermelho < 0) vermelho = 1; break; case 'G': case 'g':// Incrementa o valor do parmetro da cor Verde // (verde - 0.1 ) < 0 ? verde = 1 : verde -= 0.1; verde = verde - 0.1; if (verde < 0) verde = 1; break; case 'B': case 'b':// Incrementa o valor do parmetro da cor Azul // (azul - 0.1) < 0 ? azul= 1 : azul -= 0.1; azul = azul - 0.1; if (azul < 0) azul = 1; break; case 'O': case 'o': vermelho = 1.0; verde = 1.0; azul = 1.0; break; } glutPostRedisplay(); } /* Funco principal do programa. */ int main(int argc, char** argv) {

/* Estabelece o modo de exibio a ser utilizado pela janela a ser criada neste caso utiliza-se de um buffer simples, ou seja, a apresentao ser imediata execuo Define o modo de cores como RGBA */ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

/* Determina o tamanho em pixels da janela a ser criada */ glutInitWindowSize (250, 250);

/* Estabelece a posio inicial para criao da janela 44 */ glutInitWindowPosition (100, 100);

/* Cria uma janela com base nos parmetros especificados nas funesglutInitWindowSize e glutInitWindowPosition com o nome de ttulo especificado em seu argumento */ glutCreateWindow ("Exemplo 2"); /* Habilita a captura dos eventos de teclado */ glutKeyboardFunc(teclado);

/*Especifica os parmetros inicias para as variveisde estado do OpenGL */ init ();

// Associa a funo display como uma funo de callback glutDisplayFunc(display);

/* Inicia a execuo do programa OpenGL. O programa ir executar num loop infinito devendo o desenvolvedor especificar as condies de sada do mesmo atravs de interrupes no prprio programa ou atravs de comandos de mouse ou teclado como funes de callback */ glutMainLoop(); return 0; } 45 Captulo 5 - Transformaes Oprocessodetransformaoparaproduodeumadeterminadacena anlogo uma fotografia tirada com uma mquina fotogrfica. [ Woo 1997] Ospassosparaaobtenodafototantocomumacmeraquantocomo computador talvez sejam os seguintes : 1.Montarotripeapontaramquinafotogrficacena(transformaode visualizao). 2.Organizaracenaaserfotografadanacomposiodesejada(modelagem de transformao). 3.Escolhadeumalentedemquinafotogrficaouajusteozoom (transformao de projeo). 4.Determinarquograndesera fotografia final-porexemplo,nocasode uma fotografia maior que a cena original (transformao de viewport). Apsestespassosseremexecutados,afotopoderserfeitaouacena poder ser desenhada [ Woo 1997 ]. Figura 17. Comparao de transformaes : mquina fotogrfica x computdador 46 5.1- Transformao de Objetos AstrsrotinasdoOpenGLparamodelartransformaesso:glTranslate* (), glRotate * (), eglScale * (). Estas rotinas transformam um objeto (ousistema de coordenadas) movendo, girando, estirando, encolhendo, ou refletindo. AbibliotecagrficaOpenGLcapazdeexecutartransformaesde translao,escalaerotaoatravsdeumamultiplicaodematrizes.Aidia central destas transformaes em OpenGL que elas podem ser combinadas em uma nica matriz, de tal maneira que vrias transformaes geomtricas possam ser aplicadas atravs de uma nica operao.Rotao : ArotaofeitaatravsdafunoglRotatef(ngulo,x,y,z),quepode receber quatro nmeros float ou double (glRotated) como parmetro. Neste caso, a matriz atual multiplicada por uma matriz de rotao de "ngulo" graus ao redor do eixo definido pelo vetor "x,y,z" no sentido anti-horrio Ex :glRotatef (45.0, 0.0, 0.0, 1.0), Rotaciona um objeto num ngulo de 45 Figura 18. Rotao Translao : A translao feita atravs da funo glTranslatef(Tx, Ty, Tz),que pode receber trs nmeros float ou double (glTranslated) como parmetro. Neste caso, a matriz atual multiplicada por uma matriz de translao baseada nos valores dados. 47 Ex.: Figura 19. Translao Escala : AescalafeitaatravsdafunoglScalef(Ex,Ey,Ez),quepoderecebertrs nmeros float ou double (glScaled) como parmetro. Neste caso, a matriz atual multiplicada por uma matriz de escala baseada nos valores dados. Ex.: Efeito de glScalef(2.0, -0.5, 1.0) Figura 20. Escala 48 5.1.1 - Exemplo de Transformao de Objetos /* Exemplo3.c - Marcionlio Barbosa Sobrinho * Programa que apresenta as transformaes aplicadas a uma primitiva * Objetivo : Demonstrar a utilizao de transformao de objetos * Referncia do Cdigo: OpenGL Programming Guide - RedBook */ #include #include #include GLfloat escala; GLfloat translada; GLfloat rotaciona; void display(void) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* Limpa o Buffer de Pixels */ glClear(GL_COLOR_BUFFER_BIT); /* Estabelece a cor da primitiva */ glColor3f (1.0f,1.0f,1.0f); /* Efetua a operao de translao */ glTranslatef(translada, 0.0f, 0.0f); /* Efetua a operao de escala em Y */ glScalef(1.0f, escala, 1.0f); /* Efetua a operao de rotao em Z */ glRotatef(rotaciona, 0.0f, 0.0f, 1.0f); /* desenha um simples retngulo*/ glBegin(GL_QUADS); glVertex3f (0.025, 0.025, 0.0); glVertex3f (0.075, 0.025, 0.0); glVertex3f (0.075, 0.075, 0.0); glVertex3f (0.025, 0.075, 0.0); glEnd(); /* Inicia o processo de desenho atravs dos dados bufferizados */ glFlush (); } void init (void) { /* Define os parmetros de cores para obter a cor branca */ escala = 1; translada = 0; rotaciona = 0; /* Seleciona a cor de fundo para limpeza da tela */ glClearColor (0.0, 0.0, 0.0, 0.0); /* inicializa os valores de visualizao */ glMatrixMode(GL_PROJECTION); /* Faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformao acumulada) */ glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } /* Funo responsvel pelo controle do teclado. Dependendo da tecla pressionada : R,S,T, ir efetuar respectivamente as operaes de 49 Rotao, Escala e Translao */ void teclado(unsigned char tecla, int x, int y) { switch (tecla) { case 'S': case 's':// Incrementa o valor do parmetro de escala escala = escala + 0.5; break; case 'T': case 't':// Incrementa o valor do parmetro de translacao translada = translada + 0.05; break; case 'R': case 'r':// Incrementa o valor do ngulo de rotao rotaciona = rotaciona - 5.0; break; case 'O': case 'o': translada = 0.0; escala = 1.0; rotaciona = 0; break; } glutPostRedisplay(); } /* Funco principal do programa. */ int main(int argc, char** argv) {

/* Estabelece o modo de exibio a ser utilizado pela janela a ser criada neste caso utiliza-se de um buffer simples, ou seja, a apresentao ser imediata execuo Define o modo de cores como RGBA */ glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

/* Determina o tamanho em pixels da janela a ser criada */ glutInitWindowSize (500, 500);

/* Estabelece a posio inicial para criao da janela */ glutInitWindowPosition (100, 100);

/* Cria uma janela com base nos parmetros especificados nas funesglutInitWindowSize e glutInitWindowPosition com o nome de ttulo especificado em seu argumento */ glutCreateWindow ("Exemplo 3 - Transformaes"); /* Habilita a captura dos eventos de teclado */ glutKeyboardFunc(teclado);

/*Especifica os parmetros inicias para as variveisde estado do OpenGL */ 50 init ();

// Associa a funo display como uma funo de callback glutDisplayFunc(display);

/* Inicia a execuo do programa OpenGL. O programa ir executar num loop infinito devendo o desenvolvedor especificar as condies de sada do mesmo atravs de interrupes no prprio programa ou atravs de comandos de mouse ou teclado como funes de callback */ glutMainLoop(); return 0; } 5.2- Transformao de VisualizaoUma transformao de visualizao muda a posio e orientao do ponto devista.Comoexemplificadopelaanalogiacomamquinafotogrfica,a transformao de visualizao posiciona o trip de mquina fotogrfica e aponta a mquina fotogrfica para o modelo. Damesmamaneiraqueumamquinafotogrficamovidaparaalguma posioegiradaatqueapontenadireodesejada.,transformaesesto geralmentecompostasdetranslaeserotaes.Paraalcanarumacerta composiodecenanaimagemfinaloufotogrficaouoobjetopodeser movimentadoouamquinafotogrfica,nadireooposta.Assim,uma transformao que gira um objeto esquerda equivalente a uma transformao devisoquegiraamquinafotogrficadireita,porexemplo.Oscomandosde transformaodevisodevemserchamadosantesdequalquerexecuode transformaes de modelagem. O comando responsvel por este tipo de transformaes no OpenGL : gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); Estecomandodefineumamatrizdevisoeamultiplicapelamatriz atual. O ponto de vista desejado especificado por eyex, eyey, e eyez. O centerx, centery,eargumentosdecenterzespecificamqualquerpontoaolongodalinha desejada de viso, mas tipicamente eles so algum ponto no centro da cena a ser 51 visualizadaOupx,upy,eargumentosdeupzindicamqualdireoparacima (quer dizer, a direodo fundo para o topo do volume de visualizao). 5.2.1 - Exemplo de Transformao de Visualizao /* Exemplo4.c - Marcionlio Barbosa Sobrinho * Programa que apresenta as transformaes de visualizao em uma cena * Objetivo:Demonstrar a utilizao de transformao de visualizao com o comando glLookAt() * Referncia do Cdigo: OpenGL Programming Guide - RedBook* Example 3-1 : Transformed Cube: cube.c */ #include #include #include GLfloat eyex,eyey,eyez,centrox, centroy, centroz; void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); eyex = 0.0; eyey = 0.0; eyez = 5.0; centrox=0.0; centroy=0.0; centroz=0.0; } void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* clear the matrix */ /* viewing transformation */ gluLookAt (eyex, eyey, eyez, centrox, centroy, centroz, 0.0, 1.0, 0.0); glutWireCube (1.0); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); } /* Controla os eventos de teclado ao se pressionar as teclasx, y ou z os valores do parametro relativo a eye da funo glLookAt sero modificados se as teclas forem x, y ou z entao o valor do centro modificado */ void teclado(unsigned char tecla, int x, int y) { switch (tecla) { case 'x':// Incrementa o valor de eyex eyex = eyex + 0.5; break; case 'y':// Incrementa o valor de eyey eyey = eyey + 0.5; break; case 'z':// Incrementa o valor de eyez 52 eyez = eyez + 0.5; break; case 'X':// Incrementa o valor de centrox centrox = centrox + 0.5; break; case 'Y':// Incrementa o valor de centroy centroy = centroy + 0.5; break; case 'Z':// Incrementa o valor de centroz centroz = centroz + 0.5; break; case 'O': case 'o': eyex = 0.0; eyey = 0.0; eyez = 5.0; centrox=0.0; centroy=0.0; centroz=0.0; break; } glutPostRedisplay(); } /*Programa principal */ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow ("Exemplo 4 - Visualizao de Transformao"); glutKeyboardFunc(teclado); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } 5.3- Transformao de Projeo Opropsitodatransformaodeprojeodefinirumvolumede visualizao,queusadodedoismodos.Ovolumedevisualizaodetermina comoumobjetoprojetadosobreatela(querdizer,usandoperspectivaou projeoortogrfica),edefinequaissoosobjetosouporesdeobjetosque sero cortados da imagem final. 5.3.1 - Projeo Perspectiva A caracterstica principal da projeo de perspectiva a seguinte : quanto maislongeumobjetoestdamquinafotogrfica,menoraparecenaimagem final.Istoaconteceporqueovolumedevisualizaoparaaprojeode 53 perspectiva um frustum de uma pirmide (uma pirmide sem o topo ).Objetos que so mais prximos do ponto de vista aparecem maiores porque eles ocupam proporcionalmentequantiamaiordovolumedevisodoqueosqueestomais distantes.Estemtododeprojeocomumenteusadoparaanimaovisual,simulao, e qualquer outra aplicao que exigealgum grau de realismo porque semelhante forma de visualizao do olho humano (ou uma mquina fotogrfica) . Figura 21. Frustrum O comando para definir um frustum : void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); Estecomandocriaumamatrizparaumfrustumdevisoperspectivae multiplicapelamatrizatual.Ofrustumdovolumedevisodefinidopelos parmetros:(left,botton,-near)e(right,top,-near)pelascoordenadas(x,y,z) especfica do cantoinferior esquerdo e canto de superior-direito do prximo plano de recorte; near e far do as distncias do ponto de vista para o near e far do plano de recorte. Elessempre devem ser positivos. 54 Embora seja fcil entender conceitualmente, glFrustum () no intuitivo para seu uso.Normalmente em OpenGL a funo gluPerspective () utilizada. Esta rotina cria um volume de viso da mesma forma que glFrustum () faz, mas especificao feita de um modo diferente. Figura 22. Projeo perspectiva A sintaxe do comando : void gluPerspective(GLdouble fovy, GLdouble aspect,GLdouble near, GLdouble far); Estecomandocriaumamatrizparaumfrustumdevisoperspectiva simtricaemultiplicapelamatrizatual.fovyongulodocampodevisono planodex-z;seuvalordeveestarentre[0.0,180.0].aspectoarelaode aspectodo frustum,sualarguradivididaporsuaaltura.nearefarsodistncias entreopontodevistaeosplanosdecorte,aolongodoz-eixonegativo.Eles devemsempre ser positivos. 55 5.3.2 - Projeo Ortogrfica Naprojeoortogrfica,ovolumedevisoumparaleleppedo retangular,oumaisinformalmente,umacaixa.Diferentementedaprojeode perspectiva,otamanhodovolumedevisono,assimadistnciadamquina fotogrficanoafetacomootamanhodoobjeto.Estetipodeprojeousado para aplicaes como criar plantas arquitetnicas e projetos CAD , onde crucial manter os tamanhos atuais de objetos e ngulos entre eles da mesma forma como eles sero projetados. Figura 23. Projeo ortogrfica O comando para criar uma viso ortografica paralela : void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far); Estecomandocriaumamatrizparaumvolumedevisoparaleloortogrficoe multiplica a pela matriz atual. (left, botton, -near) e (right, top, -near) so ospontos prximosaoplanodecortequetraadonocantoinferioresquerdoecanto superiordireitodajaneladevisualizao,respectivamente.Ambosnearefarpodem ser positivos ou negativos. 56 O exemplo 5.1.1 apresenta este tipo de projeo. 5.4- Transformao de Viewport Recordando a analogia feita com a mquinafotogrfica, a transformao de viewportcorrespondefaseondeotamanhodafotografiadesenvolvida escolhido.Oviewportaregioretangulardajanelaondeaimagemdesenhada.Oviewportmedidoemcoordenadasdejanelaquerefletema posio relativa de pixels na tela do canto inferior esquerdo da janela. O sistema de janela, no OpenGL, responsvel por abrir uma janela na tela. Porm,pordeixardeexistiroviewportfixadoaoretngulodepixelinteiroda janela que aberta. O comando glViewport () usado para escolher uma regio dedesenhomenor;porexemplo,podesubdividirajanela,criarumefeitode dividir-tela para vises mltiplas na mesma janela. Sintaxe do comando : void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); Define um retngulo de pixel na janela na qual a imagem final desenhada. Oparmetro(x,y)especificaocantoinferior-esquerdodoviewport,elargurae altura so o tamanho do retngulo do viewport .Os valores de viewport iniciaispor padroso(0,0,winWidth,winHeight),ondewinWidthewinHeightsoo tamanho da janela.. (Caso no seja especificado o viewport). 57 Captulo 6 - Formas 3D Formas3Dnocomputadorsoimagensrealmentebi-dimensionais, apresentadasemumateladecomputadorplanaapresentandoumailusode profundidade,ouumatridimenso.Paraverdadeiramenteseverem3D, necessrio que de fato se veja o objeto com ambos os olhos. Figura 24. Percepo tri-dimensional pelo olho humano Cadaolhorecebeumaimagembi-dimensionalquecomosefosseuma fotografia temporria na retina (a parte de trs do olho). Estas duas imagensso ligeiramente diferentes porque elas so recebidas em dois ngulos diferentes (os olhossoespaadosseparadamentedepropsito).Ocrebrocombinaestes, ento imagens ligeiramente diferentes, paraproduzir um nico quadro composto 3D. [Richard Wright 1999] Essencialparaavisualizaoemodelagemtri-dimensionalcomo OpenGL,astransformaestmpapelfundamentalnestetipodevisualizao. AssimconformedescritonoCaptulo5astransformaesnecessriaspara modelagem e visualizao 3D seguem a analogia mquina fotogrfica. 58 As bibliotecas GLU e GLUT possuem uma srie de funes para desenhar primitivas3D,taiscomoesferas,cones,cilindroseteapot,almdepermitira criaodeoutrasformasatravsdoconjuntodeprimitivasdisponveisno OpenGL. 6.1- Exemplo de Forma 3D /* Exemplo5.c - Marcionlio Barbosa Sobrinho * Programa que apresenta uma forma 3D em uma cena * Objetivo:Demonstrar a utilizao de objetos 3D * Referncia do Cdigo: OpenGL Super Bible * Program - teapot.c */ #include #include #include GLfloat angle, fAspect,eyex, eyey, eyez; void init(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); angle=45; eyex = 0.0; eyey = 80.0; eyez = 200.0; } void visao(void) { // Especifica sistema de coordenadas de projeo glMatrixMode(GL_PROJECTION); // Inicializa sistema de coordenadas de projeo glLoadIdentity(); // Especifica a projeo perspectiva gluPerspective(angle,fAspect,0.1,500); // Especifica sistema de coordenadas do modelo glMatrixMode(GL_MODELVIEW); // Inicializa sistema de coordenadas do modelo glLoadIdentity(); // Especifica posio do observador e do alvo gluLookAt(eyex,eyey,eyez, 0,0,0, 0,1,0); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); // Desenha a esfera com a cor corrente (wire-frame) glutWireSphere( 20 , 25 , 25 ); // Executa os comandos OpenGL 59 glutSwapBuffers(); } void reshape (GLsizei w, GLsizei h) { // Para previnir uma diviso por zero if ( h == 0 ) h = 1; // Especifica o tamanho da viewport glViewport(0, 0, w, h); // Calcula a correo de aspecto fAspect = (GLfloat)w/(GLfloat)h; visao(); } /* Controla os eventos de teclado ao se pressionar as teclasX, Y ou Z os valores do parametro relativo a eye da funo glLookAt sero modificados */ void teclado(unsigned char tecla, int x, int y) { switch (tecla) { case 'x': case 'X':// Incrementa o valor de eyex eyex = eyex + 5; break; case 'y': case 'Y':// Incrementa o valor de eyey eyey = eyey + 5; break; case 'Z': case 'z':// Incrementa o valor de eyez eyez = eyez + 5; break; case 'O': case 'o': eyex = 0.0; eyey = 80.0; eyez = 200.0; break; } visao(); glutPostRedisplay(); } void GMouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON) if (state == GLUT_DOWN) {// Zoom-in if (angle >= 10) angle -= 5; } if (button == GLUT_RIGHT_BUTTON) if (state == GLUT_DOWN) {// Zoom-out if (angle Linker, incluir :-ljpeg ). /* Exemplo11.c - Marcionlio Barbosa Sobrinho *Carga de textura atravs de arquivo JPG * Referncia do Cdigo: OpenGL Programming Guide - RedBook * planet.c, movelight.c, material.c * */ #include #include #include #include #include // Como a biblioteca foi compilada // como o compilador C devemos incluir // a seguinte diretiva antes de adicionar // os cabealhos extern "C" { #include #include } static int year = 0, day = 0; int posicaoluz = 0; int tx; GLuinttexture_id[1]; intLoadJPEG ( char *filename ) { // Contm as informaes do arquivo structjpeg_decompress_struct cinfo; structjpeg_error_mgr jerr;GLubyte *linha; // Conter a imagem carregada GLubyte *image;// Tamanho da Imagem int ImageSize; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); // Abre o arquivo, l seu cabealho // e processa a descompresso da mesma FILE *fd_arquivo=fopen(filename, "rb"); jpeg_stdio_src(&cinfo, fd_arquivo); jpeg_read_header(&cinfo, TRUE); 120 jpeg_start_decompress ( &cinfo ); ImageSize = cinfo.image_width * cinfo.image_height * 3; image = (GLubyte *) malloc ( ImageSize ); linha=image; while ( cinfo.output_scanline < cinfo.output_height ) { linha = image + 3 * cinfo.image_width * cinfo.output_scanline; jpeg_read_scanlines ( &cinfo, &linha, 1 ); }

jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);

//Aplicao de filtros para tratamento da imagem//pelo OpenGL glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); // Efetua a gerao da imagem na memria glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, cinfo.image_width, cinfo.image_height,0, GL_RGB, GL_UNSIGNED_BYTE, image); fclose (fd_arquivo); free (image); return 1; } void init(void) { tx=0; /* Cria as matrizes responsveis pelo controle de luzes na cena */ GLfloat ambiente[] = { 0.2, 0.2, 0.2, 1.0 }; GLfloat difusa[] = { 0.7, 0.7, 0.7, 1.0 }; GLfloat especular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat posicao[] = { 0.0, 3.0, 2.0, 0.0 }; GLfloat lmodelo_ambiente[] = { 0.2, 0.2, 0.2, 1.0 }; glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); /* Cria e configura a Luz para a cena */ glLightfv(GL_LIGHT0, GL_AMBIENT, ambiente); glLightfv(GL_LIGHT0, GL_DIFFUSE, difusa); glLightfv(GL_LIGHT0, GL_POSITION, posicao); glLightfv(GL_LIGHT0, GL_SPECULAR, especular); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelo_ambiente); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL);

/* Habilita a Texturizacao. Criacao inicial das texturas. */

glEnable ( GL_TEXTURE_2D ); glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 ); glGenTextures ( 2, texture_id ); glBindTexture ( GL_TEXTURE_2D, texture_id[0] ); LoadJPEG ("imagem1.jpg"); 121 glBindTexture ( GL_TEXTURE_2D, texture_id[1] ); LoadJPEG ("imagem2.jpg");} /* Funo responsvel pelo desenho da esfera. E da aplicao da textura na mesma Nesta funo tambm sero aplicadas as tranformaes necessrias para o efeito desejado. */ void display(void) { /* Variveis para definio da capacidade de brilho do material */ GLfloat semespecular[4]={0.0,0.0,0.0,1.0}; GLfloat especular[] = { 1.0, 1.0, 1.0, 1.0 }; /* Posio da luz */ GLfloat posicao[] = { 0.0, 3.0, 2.0, 0.0 }; /* Limpa o buffer de pixels e determina a cor padro dos objetos. */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); /* Armazena o estado anterior para rotao da posio da luz */ glPushMatrix () ; glRotated ((GLdouble) po