TÓPICOS AVANÇADOS DE COMPUTAÇÃO GRÁFICA Computação Gráfica Licenciatura em Engenharia Informática António Costa / DEI-ISEP
Desenho de Texto Modo Matriz de Pixels (bitmap) Não suporta transformações Existem algumas fontes pré-definidas void glutbitmapcharacter(void *font, int character); int glutbitmapwidth(glutbitmapfont font, int character); Modo Vectorial (stroke) Suporta transformações Existem também fontes pré-definidas void glutstrokecharacter(void *font, int character); int glutstrokewidth(glutstrokefont font, int character); Texto é bidimensional Pode ser ancorado através de glrasterpos...( GLdouble x, GLdouble y) 01-03-2007 2
Framebuffers auxiliares Framebuffers Auxiliares Alfa: matriz de células de cor para tratamento de transparência e translucência Stencil: matriz de células conjunto de bits usada para operações de máscara, detecção de interior, etc Acumulação: matriz de células de cor RGB usado para acumular várias imagens e efectuar operações de combinação, anti-aliasing, etc Usos diversos Técnicas multipasso (renderings sucessivos), etc 01-03-2007 3
Modos de Rendering Modos de Rendering Modo GL_RENDER - as primitivas gráficas dão origem a fragmentos de pixels no framebuffer Modo GL_SELECT - devolve uma lista de objectos afectados pela projecção de visualização, sem mexer no framebuffer - função glselectbuffer() Modo GL_FEEDBACK - devolve informação dos objectos afectados pela projecção, sem mexer no framebuffer - função glfeedbackbuffer() 01-03-2007 4
Modo GL_SELECT Modo de Rendering Selecção Define-se um buffer de selecção Faz-se um rendering usando uma projecção Obtém-se o número de objectos que estão ou intersectam o volume de visualização e informações no buffer (profundidade, lista ordenada de objectos, etc) A aplicação analisa o buffer para determinar qual o objecto que lhe interessa... GLuint buffer[buf_size]; GLint hits; glselectbuffer (BUF_SIZE, buffer); glrendermode(gl_select); /* desenho de objectos */ hits = glrendermode(gl_render); 01-03-2007 5
Modo GL_FEEDBACK Modo de Rendering Feedback Define-se um buffer de feedback Faz-se um rendering usando uma projecção Obtém-se o número de objectos que estão ou intersectam o volume de visualização e informações sobre cada objecto no buffer (tipo de objecto, número de vértices, cores, coordenadas, etc) A aplicação analisa o buffer... GLuint buffer[buf_size]; GLint hits; glfeedbackbuffer (BUF_SIZE, GL_3D, buffer); glrendermode(gl_feedback); /* desenho de objectos */ hits = glrendermode(gl_render); 01-03-2007 6
Uso dos Modos de Selecção Modo GL_RENDER Visualização convencional de imagem Modo GL_SELECT Usado para fazer selecção de objecto(s) Define-se uma projecção ortográfica em torno do cursor Obtém-se a lista de objectos por trás do cursor Escolhe-se um deles (aquele que está mais próximo) Modo GL_FEEDBACK Usado para exportar informação da cena Geração de ficheiros da cena (imagem, Postscript, etc) Ficheiro geneps.c no site da disciplina 01-03-2007 7
Tratamento de Anti-aliasing Redução do anti-aliasing em linhas Através dos seguintes comandos: glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); glenable(gl_line_smooth); glhint(gl_line_smooth_hint, GL_NICEST); O efeito é misturar a nova cor com a cor anterior do pixel Redução do anti-aliasing em polígonos Através dos seguintes comandos: glenable(gl_blend); glblendfunc(gl_src_alpha_saturate, GL_ONE); glenable(gl_polygon_smooth); glhint(gl_polygon_smooth_hint, GL_NICEST); Os objectos devem ser desenhados ordenados de longe para perto! 01-03-2007 8
Tratamento de Anti-aliasing Redução através do buffer de acumulação Esta técnica é a melhor e mais demorada A cena é ligeiramente deslocada no espaço de ecrã e vários renderings são acumulados no buffer de acumulação Troca-se aliasing por ruído (o olho humano não detecta tão bem!) void frustum_jitter(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far, GLdouble xoff, GLdouble yoff) { GLfloat scalex, scaley; GLint viewport[4]; glgetintegerv(gl_viewport, viewport); scalex = (right - left)/viewport[2]; scaley = (top - bottom)/viewport[3]; glfrustum(left - xoff * scalex, right - xoff * scalex, top - yoff * scaley, bottom - yoff * scaley, near, far); } Quanto mais amostras se usar melhor é o resultado! 01-03-2007 9
Composição (blending) Composição de Pixels Ferramentas de transparência, composição, pintura e outros efeitos Também se usa para desenho de objectos sem aliasing A composição de n imagens efectua-se da seguinte forma gldrawbuffer(gl_back); glreadbuffer(gl_back); glclear(color_buffer_bit); render_scene(1); glaccum(gl_load, 1/n); ; render_scene(n); glaccum(gl_load, 1/n); Efeitos complexos gerados por composição Motion blur (movimento desfocado) Sombras suaves Profundidade de campo (zonas de imagem focadas) 01-03-2007 10
O papel das sombras Sombras Uma das técnicas possíveis para melhorar a percepção espacial de cenas 3D Sombras simples podem ser usadas para remover a impressão de objectos flutuantes As sombras variam muito em função do contexto de iluminação da cena Arestas de sombra nítidas ou difusas Zonas de umbra e/ou penumbra Podem ser geradas através de reflexão (luzes de tipo secundário) - conceito de iluminação global 01-03-2007 11
Porque existem sombras? Sombras e Fonte de Luz Há emissão de luz em áreas ou volumes pequenos Há emissão de luz segundo direcções muito coerentes A visibilidade das fontes de luz varia abruptamente devido a bloqueios do trajecto da luz e gera vários tipos de descontinuidades na superfície dos objectos 01-03-2007 12
Sombras em Computação Gráfica Aspectos a ter em conta Não há sombras se a fonte de luz coincide com o ponto de observação Se a fonte de luz é pontual não há zonas de penumbra geradas por essa fonte Uma fonte de luz não-pontual (linear ou área) pode ser aproximada por um conjunto de luzes pontuais devidamente espaçadas Em cenas estáticas as sombras e/ou penumbras podem ser calculadas previamente e não dependem do ponto de observação Em cenas com objectos dinâmicos as sombras e/ou penumbras têm de ser recalculadas para cada imagem a visualizar 01-03-2007 13
Método de Sombras Simples no Chão Cenas com um chão poligonal plano Correcto apenas em cenas com objectos afastados entre si de modo a não se sombrearem mutuamente Projectam-se os objectos no plano do chão Com o chão em z=0, a transformação homogénea é 1 0 0 0 0 1 0 0 -x l /z l -y l /z l 0 0 0 0 0 1 sendo (x l,y l,z l ) as coordenadas da fonte de luz 01-03-2007 14
Algoritmos de Geração de Sombra Volumes de Sombra Volume espacial gerado pela silhueta de um objecto 01-03-2007 15
Geração de Sombras Algoritmos de Geração de Sombra Algoritmo shadow z-buffer Usa um z-buffer para cada fonte de luz Em pré-processamento, faz-se o rendering da posição da fonte de luz e guarda-se a informação de distância do z-buffer de cada fonte de luz No rendering a partir do ponto de observação, o ponto (x,y,z) associado ao pixel é mapeado no z-buffer da fonte de luz a fim de saber se está sombreado Pode ser acelerado através de hardware gráfico 01-03-2007 16
Sombras em OpenGL Método do chão 1. Fazer o rendering normal da cena 2. Fazer a matriz modelview igual à identidade e em seguida chamar glscalef (1.0,1.0,0.0) 3. Posicionar e orientar o objecto que gera sombra 4. Definir o contexto OpenGL para a cor de sombra 5. Fazer o rendering do objecto que gera sombra Aspectos práticos a ter em conta Desligar o teste de profundidade (depth test) Elevar ligeiramente o chão na geração da sombra 01-03-2007 17
Sombras em OpenGL Vantagens do método do chão Pode ser aplicado a superfícies planas tipo paredes Em aplicações muito dinâmicas pode ser uma solução adequada Limitações do método do chão Só funciona bem com superfícies planas como chão A cor da sombra é uma versão comprimida das cores do objecto que gera a sombra e não do objecto chão As normais do objecto que gera a sombra ficam igualmente comprimidas e podem dar origem a artefactos de rendering A qualidade das sombras não é grande (evitar ver as sombras!) 01-03-2007 18
Sombras em OpenGL Método dos volumes de sombra Trata as sombras geradas como objectos poliédricos Um buffer auxiliar (stencil) é usado para determinar a intersecção entre o objecto e o volume de sombra 01-03-2007 19
Sombras em OpenGL + Sombras projectivas www.dei.isep.ipp.pt/compgraf/opengl/etc/shadow.zip 01-03-2007 20
Conceito de Textura Texturas Meio de obter detalhe visual nas superfícies através de alterações de cor ou propriedades ópticas (reflexão difusa ou especular, etc) Necessita de uma parametrização local da superfície à volta de um ponto: sistema de coordenadas de textura (mapeamento) Variantes no mapeamento de texturas Manipulação de cor (vulgo decalque) Mapeamento de ambiente envolvente (reflexão simulada) Perturbação da normal (bump mapping) Uso de texturas permite obter elevada qualidade visual evitando a modelação complicada de pormenores geométricos 01-03-2007 21
Texturas Formas de mapeamento de texturas O espaço textura pode ser uni/bi/tridimensional A forma mais vulgar é bidimensional (imagens decalcadas) O mapeamento de espaço ecrã para espaço textura é muito complexo e raramente usado (excepto em casos particulares) T(u) T(u,v) T(u,v,w) (x w,y w,z w ) (x s,y s ) Espaço textura Espaço objecto Espaço ecrã 01-03-2007 22
Mapas de textura Texturas em OpenGL 1D e 2D com dimensões potências de 2! As coordenadas de texturas são associadas aos vértices geométricos dos objectos e variam entre 0 e 1 O acesso ao mapa de textura é feito através dessas coordenadas e cada elemento do mapa designa-se texel Quando estão fora de [0..1] pode usar-se um dos métodos CLAMP - as coordenadas são limitadas a [0 1] a textura dos bordos repete-se fora da região unitária REPEAT - as coordenadas são ajustadas a [0 1] a textura repete-se nas direcções principais (tiling) 01-03-2007 23
Texturas em OpenGL Filtragem de texturas Justifica-se quando Um pixel contém muitos texels (zoom ao longe) Um texel aparece em muitos pixels (zoom ao perto) Se não houver filtragem resulta Ruído nos pixels e perda de informação visual (zoom ao longe) Visualização óbvia dos texels como quadrados (zoom ao perto) Existem vários métodos de filtragem Amostragem ao ponto - escolhe-se o texel mais próximo Interpolação linear de 4 texels - bom para zoom ao perto Mipmapping (textura em várias escalas) - bom para zoom ao longe 01-03-2007 24
Texturas em OpenGL Aplicação da textura O processo que determina a cor final do pixel em função dos valores inicial e da textura é a texture environment function gltexenv() MODULATE - multiplica o valor do texel pelo valor do pixel DECAL - faz uma mistura alfa entre os valores do texel e do pixel BLEND - usa a textura para misturar o valor do texel e um valor de cor REPLACE - substitui o valor do pixel pelo valor do texel A definição automática de níveis sucessivos de uma textura (mipmaps) faz-se através da função glubuild2dmipmaps() O nível de detalhe apropriado à visualização da textura determina qual dos mipmaps vai ser usado no mapeamento Produz geralmente os melhores resultados 01-03-2007 25
Textura 2D Terreno composto de malha triangular Textura definida por ficheiro de imagem Texturas em OpenGL 01-03-2007 26
Texturas em OpenGL Mapeamento de imagem /* rotina de inicialização */ read_jpeg_file("texture.jpg",&tex,&width,&height,&bpp); glenable(gl_texture_2d); gltexenvi(gl_texture_env,gl_texture_env_mode,gl_decal); glhint(gl_perspective_correction_hint,gl_nicest); glgentextures(2,texobj); glbindtexture(gl_texture_2d,texobj[0]); glteximage2d(gl_texture_2d,0,3,width,height,0,gl_rgb, GL_UNSIGNED_BYTE, tex); gltexparameteri(gl_texture_2d,gl_texture_min_filter,gl_nearest); gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_nearest); gltexparameteri(gl_texture_2d,gl_texture_wrap_s,gl_repeat); gltexparameteri(gl_texture_2d,gl_texture_wrap_t,gl_repeat); /* rotina de desenho */ glbindtexture(gl_texture_2d,texobj[0]); glbegin(gl_polygon); gltexcoord2f(0.0,0.0); glvertex2f(-1.0,-1.0); gltexcoord2f(1.0,0.0); glvertex2f( 1.0,-1.0); gltexcoord2f(1.0,1.0); glvertex2f( 1.0,1.0); gltexcoord2f(0.0,1.0); glvertex2f(-1.0,1.0); glend(); www.dei.isep.ipp.pt/compgraf/opengl/etc/texdemo.zip 01-03-2007 27
Texturas em OpenGL Billboards Técnica que substitui geometria complexa por geometria simples com mapeamento de textura de modo a obter-se realismo e rapidez A geometria simplificada tem de estar orientada para a câmara Rotação dinâmica do billboard em função da câmara Em objectos cilíndricos a operação é fácil Muito usada em jogos para objectos distantes Vários escalas de texturas nos billboards Ao perto usa-se geometria realista Vantajosa quando existe muita memória para mapeamento de texturas 01-03-2007 28
Uso de billboards Texturas em OpenGL Alinhamento dos billboards em relação à câmara Obter a matriz de visualização MODELVIEW glgetfloatv(gl_modelview_matrix, mat); Criar dois vectores a partir dessa matriz V x = (mat[0], mat[4], mat[8]); V y = (mat[1], mat[5], mat[9]); O plano definido por V x e V y é paralelo ao plano de visualização e um quadrilátero nesse plano obtém-se da forma P A = P T + ((-V x - V y ) * Size); P B = P T + ((V x - V y ) * Size); P C = P T + ((V x + V y ) * Size); P D = P T + ((-V x + V y ) * Size); 01-03-2007 29
Sistema de Partículas As partículas representadas por texturas com billboard estão sempre alinhadas com o ecrã As outras partículas nunca estão alinhadas com o ecrã Texturas em OpenGL Textura com billboard Textura sem billboard www.dei.isep.ipp.pt/compgraf/opengl/etc/billboard.zip 01-03-2007 30
Texturas OpenGL Texturas 3D Extensão lógica de textura 2D O texel bidimensional transforma-se num texel cúbico O acesso ao valor do texel faz-se através de três coordenadas (s,r,t) O uso de texturas 3D é apropriado para Modelar materiais sólidos heterogéneos (granito, mármore, etc) Obter texturas 2D animadas Obter billboards dinâmicos (dependentes da altura da câmara, etc) Criar texturas algorítmicas baseadas em funções de ruído para simular fenómenos tais como fogo, fumo, nuvens, materiais heterogéneos, etc Os requisitos de memória tendem a ser elevados! 01-03-2007 31
Texturas em OpenGL Texturas algorítmicas Mapas de textura gerados por forma algorítmica Geradas pela aplicação Pré-processamento Durante a execução Podem ser usados para controlar diversos efeitos Cor Opacidade Especularidade www.dei.isep.ipp.pt/compgraf/opengl/etc/ptex.zip 01-03-2007 32
Técnicas Multipasso Técnicas Multipasso Permitem obter uma imagem em qualquer plataforma A qualidade é maior quando o hardware é mais sofisticado Rendering Multipasso no jogo QUAKE III Passos 1-4: acumulação de texturas bump map Passo 5: iluminação difusa Passo 6: texturas de base com componente especular Passo 7: iluminação especular Passo 8: iluminação emissiva Passo 9: efeitos atmosféricos/volumétricos Passo 10: efeitos de flash no ecrã OPCIONAL OPCIONAL OPCIONAL OPCIONAL OPCIONAL 01-03-2007 33
Técnicas Multipasso - Exemplo 01-03-2007 34