Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
TÓPICOS AVANÇADOS DECOMPUTAÇÃ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é-definidasvoid glutBitmapCharacter(void *font, int character);int glutBitmapWidth(GLUTbitmapFont font, int character);
• Modo Vectorial (stroke)
01-03-2007 2
• Modo Vectorial (stroke)
– Suporta transformações
– Existem também fontes pré-definidasvoid glutStrokeCharacter(void *font, int character);int glutStrokeWidth(GLUTstrokeFont font, int character);
• Texto é bidimensional
– Pode ser ancorado através de glRasterPos...( GLdouble x, GLdouble y)
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
01-03-2007 3
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
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
01-03-2007 4
– 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()
Modo de Rendering Selecção
• Modo GL_SELECT
– 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
01-03-2007 5
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);
Modo de Rendering Feedback
• Modo GL_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
01-03-2007 6
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);
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
01-03-2007 7
• 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
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);
01-03-2007 8
– 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!
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!)
01-03-2007 9
– 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!
Composição de Pixels
• Composição (blending)
– 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 formaglDrawBuffer(GL_BACK);
01-03-2007 10
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)
Sombras
• O papel das 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
01-03-2007 11
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
Sombras e Fonte de Luz
• Porque existem sombras?
– 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
01-03-2007 12
bloqueios do trajecto da luz e gera vários tipos de descontinuidades
na superfície dos objectos
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
01-03-2007 13
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
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 é
01-03-2007 14
• Com o chão em z=0, a transformação homogénea é
sendo (xl,yl,zl) as coordenadas da fonte de luz
1 0 0 00 1 0 0-xl/zl -yl/zl 0 00 0 0 1
Algoritmos de Geração de Sombra
• Volumes de Sombra
– Volume espacial gerado pela silhueta de um objecto
01-03-2007 15
Algoritmos de Geração de Sombra
• Geração de Sombras
– 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
01-03-2007 16
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
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
01-03-2007 17
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
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
01-03-2007 18
• 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!)
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
01-03-2007 20
+
Sombras projectivas
www.dei.isep.ipp.pt/compgraf/opengl/etc/shadow.zip
Texturas
• Conceito de Textura
– 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)
01-03-2007 21
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
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)
01-03-2007 22
complexo e raramente usado (excepto em casos particulares)
T(u)
T(u,v)
T(u,v,w)
(xw,yw,zw) (xs,ys)
Espaço textura Espaço objecto Espaço ecrã
Texturas em OpenGL
• Mapas de textura
– 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
01-03-2007 23
– 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)
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
01-03-2007 24
– 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
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
01-03-2007 25
• 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
Texturas em OpenGL
• Textura 2D
– Terreno composto de
malha triangular
– Textura definida por
ficheiro de imagem
01-03-2007 26
ficheiro de imagem
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);
01-03-2007 27
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
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
01-03-2007 28
• 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
Texturas em OpenGL
• Uso de billboards
– 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
01-03-2007 29
• Criar dois vectores a partir dessa matriz
Vx = (mat[0], mat[4], mat[8]);
Vy = (mat[1], mat[5], mat[9]);
• O plano definido por Vx e Vy é paralelo ao plano de visualização e um
quadrilátero nesse plano obtém-se da forma
PA = PT + ((-Vx - Vy) * Size);
PB = PT + ((Vx - Vy) * Size);
PC = PT + ((Vx + Vy) * Size);
PD = PT + ((-Vx + Vy) * Size);
Texturas em OpenGL
• Sistema de Partículas
– As partículas representadas por
texturas com billboard estão
sempre alinhadas com o ecrã
– As outras partículas nunca
01-03-2007 30
– As outras partículas nunca
estão alinhadas com o ecrã
www.dei.isep.ipp.pt/compgraf/opengl/etc/billboard.zip
Textura com billboard
Textura sem billboard
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
01-03-2007 31
– 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!
Texturas em OpenGL
• Texturas algorítmicas
– Mapas de textura gerados por
forma algorítmica
– Geradas pela aplicação
• Pré-processamento
01-03-2007 32
• 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
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 OPCIONAL
01-03-2007 33
– 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
Técnicas Multipasso - Exemplo
01-03-2007 34