Prof. Fernando V. Paulovich 25 de abril de SCC Computação Gráca

Documentos relacionados
Rendering de Polígonos. Determinação de Superfícies Visíveis. Back Face Culling. Back Face Culling. Back Face Culling. Back Face Culling.

Sumário. Traçado de Retas. Antialiasing e OpenGL. 1 Introdução. 2 Conversão Segmento de Reta. 3 Algoritmo DDA. 4 Algoritmo de Bresenham

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

Prof. Fernando V. Paulovich 12 de março de SCC Computação Gráca

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

Conversão Matricial. Prof. Fernando V. Paulovich 20 de maio de SCC Computação Gráca

use um cast para byte, como, por exemplo, gl.glcolor3ub((byte)0, (byte)0, (byte)255);

Prof. Fernando V. Paulovich 3 de agosto de SCC Computação Gráca

Prof. Fernando V. Paulovich 18 de maio de SCC Computação Gráca

Prof. Fernando V. Paulovich 16 de maio de SCC Computação Gráca

Viewing 3D. SCC Computação Gráfica. Prof. Fernando V. Paulovich

Determinação de Superfícies Visíveis

Preenchimento de Polígonos

Introdução ao Processamento e Síntese de imagens -Linhas e superfícies escondidas

Visibilidade. Licenciatura em Engenharia Informática e de Computadores Computação Gráfica. Edward Angel, Cap. 7 Apontamentos CG

Thanks to Isabel Harb Manssour Marcelo Cohen

Determinação da Visibilidade

Pipeline de Visualização 3D

Sumário. Introdução Câmera sintética Window-to-Viewport Exercício. 29-May-13 Leandro Tonietto!2

Prof. Fernando V. Paulovich 25 de julho de SCC Programação Orientada a Objetos

Visibilidade. Antonio L. Bajuelos Departamento de Matemática Universidade de Aveiro

Prof. Fernando V. Paulovich 26 de maio de 2015

// Solução possível para o efólio-a. import javax.media.opengl.glu.glu; import com.sun.opengl.util.glut;

// Solução possível para o efólio-a. import java.util.random; import javax.media.opengl.glu.glu; import com.sun.opengl.util.glut;

JAVA APLICAÇÕES GRÁFICAS Propriedades Utilizadas: Font size Animation FACULDADE DE TECNOLOGIA SENAC PELOTAS

Segunda Prova 20 de junho de DURAÇÃO DA PROVA: 90m

OpenGL. Soraia Musse

R: 2) Temos que A = MB sendo que M é a Matriz de Transformação Universal. Tendo ainda que:

Algoritmos de Visibilidade. Computação Gráfica Visibilidade. Backface Culling. Outras abordagens. Renato Ferreira

Computação Gráfica - 09

Objetos definidos no seu próprio sistema de coordenadas

Transformações 3D. Soraia Raupp Musse

António Costa. Paulo Roma Cavalcanti

Visualização Interativa de Modelos Massivos de Engenharia na Indústria de Petróleo com o Algoritmo de Voxels Distantes

3D no OpenGL. Visualização e Transformações Perspectiva. Transformações do Modelview. Processo

Computação Gráfica. Visao Computacional. Visão Huma na e Compuacional

Introdução à Computação Gráfica. Claudio Esperança Paulo Roma Cavalcanti

Transformações 3D. Soraia Raupp Musse

Computação Gráfica e Processamento de Imagens. - Sistemas 3D (conceitos básicos) Prof. Julio Arakaki

Remoção de Superfícies Escondidas

INF 1366 Computação Gráfica Interativa. Anti-Aliasing; Eliminação de Superfícies Escondidas. Alberto B. Raposo

Computação Gráfica II

Computação Gráfica - OpenGl 02

Computação Gráfica - 09

Realismo Visual. Aula 11 UFF

Computação Gráfica II

2 Técnicas e Trabalhos Relacionados

Recorte. Licenciatura em Engenharia Informática e de Computadores Computação Gráfica. Edward Angel, Cap. 7 Apontamentos CG

Introdução à Computação Gráfica Visibilidade. Claudio Esperança Paulo Roma Cavalcanti

Computação Gráfica II

Resumo. Ray Tracing. Introdução. Ray Casting Básico. Idéia

Atribuições: Valores, Ponteiros e Referências

Computação Gráfica. Representação e Modelagem

Interfaces e Classes Internas

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO CURSO: CIÊNCIAS DA COMPUTAÇÃO

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Primeira Prova 25 de abril de DURAÇÃO DA PROVA: 90m

Computação Gráfica - 12

1 Para expressar um ponto intermediário em função dos pontos extremos, precisamos

Computação Gráfica - 13

Computaçã. Visão Geral. Sistema Gráfico. Computação Gráfica. Pixels. Sistema Gráfico e o Frame Buffer. Introdução à Computação Gráfica

Introdução Geral a Computação Gráfica. Universidade Católica de Pelotas Curso de Engenharia da Computação Disciplina de Computação Gráfica

Câmara Virtual Simples

Instituto de Computação Bacharelado em Ciência da Computação Disciplina: Computação Gráfica Primeira lista de exercícios

Visibilidade. Apontamentos CG + Edward Angel, Sec Instituto Superior Técnico Computação Gráfica 2009/2010

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Algoritmos, Estruturas de Dados e Tipos Abstratos de Dados (TADs)

Capítulo 3 Primeiros Passos em OpenGL Função Desenha Função Teclado Função Inicializa Programa Principal...

Computação Gráfica. Licenciatura em Engenharia Informática e de Computadores Alameda / Taguspark. Terceiro Teste 19 de Maio de 2012

Computação Gráfica. Licenciatura em Engenharia Informática e de Computadores Alameda/Taguspark. 1º Exame 29 Junho de 2010

Bruno Pereira Evangelista. Pontifícia Universidade Católica de Minas Gerais

O Problema de Visibilidade. Computação Gráfica Recorte. Onde Acontece? O que é Recorte? Renato Ferreira

AdaptiveShadowMaps. Randima Fernando Sebastian Fernandez Kavita Bala Donald P. Greenberg Apresentado por Claudio Esperança

Filas de Prioridade & Heaps

3.1 Linha de Produção Utilizada

Computação Gráfica. Engenharia de Computação. CEFET/RJ campus Petrópolis. Prof. Luis Retondaro. Aula 6. Projeções

Exame de 1ª Época Computação Gráfica

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Computação Gráfica. Agostinho Brito. Departamento de Engenharia da Computação e Automação Universidade Federal do Rio Grande do Norte

Computação Gráfica. Engenharia de Computação. CEFET/RJ campus Petrópolis. Prof. Luis Retondaro. Aula 7. Iluminação

QuadLOD: Uma Estrutura para a Visualização Interativa de Terrenos

Discretização. Licenciatura em Engenharia Informática e de Computadores Computação Gráfica. Edward Angel, Cap. 7 Apontamentos CG

Introdução. 1 Introdução

Computação Gráfica - 11

Survey de técnicas. detalhadas: Análise e Comparação

5 Resultados Experimentais

Algoritmos de Recorte em 2D

Imagem e Gráficos. vetorial ou raster?

DESENHO TÉCNICO II EXERCÍCIOS

Introdução ao Processamento e Síntese de imagens Recorte 2D

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

O que é? Como funciona?

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

Imagem ou Desenhos e Gráficos vetorial ou raster?

Leandro Paganotti Brazil Rosane Minghim Computação Gráfica ICMC USP

Transcrição:

Determinação de Superfícies Visíveis SCC0250 - Computação Gráca Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP) 25 de abril de 2013 1 / 35

Introdução Sumário 1 Introdução 2 3 2 / 35

Introdução Sumário 1 Introdução 2 3 3 / 35

Introdução Introdução Rendering de Polígonos Por eciência, só queremos renderizar as faces poligonais que são visíveis para a câmera Existem diversos algoritmos para detecção de superfícies visíveis (ou eliminação de superfícies ocultas) que variam conforma Complexidade da cena Tipo de objeto desenhado Equipamento disponível etc. 4 / 35

Introdução Classicação dos Algoritmos Os algoritmos existentes podem ser classicados em dois grandes grupos Métodos de espaço do objeto Métodos de espaço do imagem Espaço do Objeto Compara objetos entre si, ou partes de objetos, para determinar a visibilidade Espaço da Imagem Compara pixel por pixel no plano de projeção para determinar a visibilidade 5 / 35

Introdução Classicação dos Algoritmos Discutiremos dois algoritmos para visibilidade Back-face culling Z-buer 6 / 35

Sumário 1 Introdução 2 3 7 / 35

Se faces pertencem a um objeto sólido (um poliedro, por exemplo), não é necessário renderizar as faces de trás (não visíveis) Apenas 3 faces precisam ser traçadas Faces de trás podem ser removidas do pipeline 8 / 35

Nota: processo assume que cena é composta por objetos poliéricos fechados 9 / 35

Como descobrir quais são as faces de trás? 10 / 35

Uma face é uma face de trás (não visível) de um polígono se o ângulo entre o vetor normal à face N e o vetor direção de observação V é menor do que 90 0 V N > 0 11 / 35

Eciente fazer esse teste no sistema de coordenadas de visão Vetor direção de observação paralelo ao eixo z v Assim V = (0, 0, V z), e V N = V z N z Portanto, para fazer o teste V N > 0 basta vericar o sinal da componente z do vetor normal à face 12 / 35

Sumário 1 Introdução 2 3 13 / 35

Muito importante para rendering mais eciente (simplica muito a cena) em geral é o primeiro passo do processo 1 gl.glenable(gl.gl_cull_face); 2 gl.glcullface(gl.gl_back); Com isso, restam apenas os polígonos/faces potencialmente visíveis para a câmera... 14 / 35

Código OpenGL 1 public class BackFaceCulling implements GLEventListener { 2... 3 4 public static void main(string[] args) { 5 //cria o painel e adiciona um ouvinte GL 6 GLJPanel panel = new GLJPanel(); 7 panel.addgleventlistener(new BackFaceCulling()); 8 9 //cria uma janela e adiciona o painel 10 JFrame frame = new JFrame("Aplicação JOGL Simples"); 11 frame.add(panel); 12 frame.setsize(400, 400); 13 frame.setdefaultcloseoperation(jframe.exit_on_close); 14 frame.setlocationrelativeto(null); 15 frame.setvisible(true); 16 } 17 } 15 / 35

Código OpenGL 1 public class BackFaceCulling implements GLEventListener { 2... 3 4 public void display(glautodrawable drawable) { 5 GL gl = drawable.getgl(); 6 7 //limpa o buer 8 gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT); 9 10 //dene que a matrix é a de modelo 11 gl.glmatrixmode(gl.gl_modelview); 12 13 gl.glcolor3f(1.0f, 0.0f, 0.0f); //N. V < 0 (visível) 14 gl.glbegin(gl.gl_triangles); 15 gl.glvertex3f(-2, -2, 0); 16 gl.glvertex3f(2, -2, 0); 17 gl.glvertex3f(0, 2, 0); 18 gl.glend(); 19 20 gl.glcolor3f(0.0f, 1.0f, 0.0f); //N. V > 0 (não visível) 21 gl.glbegin(gl.gl_triangles); 22 gl.glvertex3f(-4, -3, -4); 23 gl.glvertex3f(-3.5f, -1, -4); 24 gl.glvertex3f(-2, -1, -4); 25 gl.glend(); 26 27 //força o desenho das primitivas 28 gl.glflush(); 29 } 30 } 16 / 35

Código OpenGL 1 public class BackFaceCulling implements GLEventListener { 2... 3 4 public void init(glautodrawable drawable) { 5 GL gl = drawable.getgl(); 6 7 gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); //dene a cor de fundo 8 9 gl.glmatrixmode(gl.gl_projection); //dene que a matrix é a de projeção 10 gl.glloadidentity(); //carrega a matrix de identidade 11 gl.glortho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //dene uma projeção ortogonal 12 } 13 } 17 / 35

Código OpenGL 18 / 35

Código OpenGL 1 2 public class BackFaceCulling implements GLEventListener { 3... 4 5 public void init(glautodrawable drawable) { 6 GL gl = drawable.getgl(); 7 8 gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); //dene a cor de fundo 9 10 //ativa remoção de face oculta 11 gl.glenable(gl.gl_cull_face); 12 gl.glcullface(gl.gl_back); 13 14 gl.glmatrixmode(gl.gl_projection); //dene que a matrix é a de projeção 15 gl.glloadidentity(); //carrega a matrix de identidade 16 gl.glortho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //dene uma projeção ortogonal 17 } 18 } 19 / 35

Código OpenGL 20 / 35

Sumário 1 Introdução 2 3 21 / 35

Outro Problema: Faces Ocultas Algumas faces da cena cam ocultas atrás de outras: só queremos desenhar (renderizar) as faces (ou partes delas) realmente visíveis 22 / 35

Solução - Considere que as faces passaram pela transformação de projeção, e tiveram suas coordenadas z armazenadas suponha valores de z normalizados no intervalo 0 a 1 (0 plano near e 1 plano far) Para cada pixel (x, y), queremos traçar a face mais próxima da câmera, i.e., com menor valor de z 23 / 35

Algoritmo usa dois buers Frame Buer: armazena os valores RGB que denem a cor de cada pixel, tipicamente 24 bits, mais 8 bits para transparência (alfa) Z-Buer: para manter informação de profundidade associada a cada pixel, tipicamente 16, 24 ou 32 bits Inicialização Todas posições do z-buer são inicializadas com a maior profundidade depth_buer(x,y) = 1.0 O frame buer inicializado com a cor de fundo da cena frame_buer(x,y) = cor de fundo 24 / 35

A medida em que cada face é renderizada, ou seja, os pixels são determinadas através do algoritmo de scaline 1 //calcula (se necessário) profundidade z para cada pixel projetado (x,y) da face 2 3 if(z < depth(x,y)){ 4 depth_buffer(x,y) = z; 5 frame_buffer(x,y) = cor do pixel; 6 } Note que os valores de profundidade estão normalizados entre 0.0 e 1.0 com o plano de visão na profundidade 0.0 25 / 35

Implementação eciente: o valor de profundidade de um pixel em uma scaline pode ser calculado usando o valor do pixel precedente usando uma única adição Depois de todas as faces processadas, o depth buer contém a profundidade das superfícies visíveis, e o frame buer contém as cores dessas superfícies Cena pronta para ser exibida 26 / 35

Vantagem Simplicidade Desvantagens Quantidade de memória necessária (em um sistema 1280 1024 precisa 1.3mi de posições) Alguns cálculos desnecessários... porque? Precisão limitada para o cálculo de profundidade em cenas complexas pode ser um problema: quantização de valores de profundidade pode introduzir artefatos Placas grácas otimizam operações no z-buer 27 / 35

Sumário 1 Introdução 2 3 28 / 35

Habilitar z-buer 1 gl.glenable (GL.GL_DEPTH_TEST); Ao gerar um novo quadro, o z-buer deve ser limpo 1 gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT) 29 / 35

Código OpenGL 1 public class ZBuffer implements GLEventListener { 2... 3 4 public static void main(string[] args) { 5 //cria o painel e adiciona um ouvinte GL 6 GLJPanel panel = new GLJPanel(); 7 panel.addgleventlistener(new ZBuffer()); 8 9 //cria uma janela e adiciona o painel 10 JFrame frame = new JFrame("Aplicação JOGL Simples"); 11 frame.add(panel); 12 frame.setsize(400, 400); 13 frame.setdefaultcloseoperation(jframe.exit_on_close); 14 frame.setlocationrelativeto(null); 15 frame.setvisible(true); 16 } 17 } 30 / 35

Código OpenGL 1 public class ZBuffer implements GLEventListener { 2 3 public void display(glautodrawable drawable) { 4 GL gl = drawable.getgl(); 5 6 //limpa o buer 7 gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT); 8 9 //dene que a matrix é a de modelo 10 gl.glmatrixmode(gl.gl_modelview); 11 12 //triângulo na frente 13 gl.glcolor3f(1.0f, 0.0f, 0.0f); //N. V < 0 (visível) 14 gl.glbegin(gl.gl_triangles); 15 gl.glvertex3f(-2, -2, 0); 16 gl.glvertex3f(2, -2, 0); 17 gl.glvertex3f(0, 2, 0); 18 gl.glend(); 19 20 //triângulo atrás 21 gl.glcolor3f(0.0f, 0.0f, 1.0f); //N. V < 0 (visível) 22 gl.glbegin(gl.gl_triangles); 23 gl.glvertex3f(0, 0, -2); 24 gl.glvertex3f(4, 0, -2); 25 gl.glvertex3f(2, 4, -2); 26 gl.glend(); 27 28 //força o desenho das primitivas 29 gl.glflush(); 30 } 31 } 31 / 35

Código OpenGL 1 public class ZBuffer implements GLEventListener { 2... 3 4 public void init(glautodrawable drawable) { 5 GL gl = drawable.getgl(); 6 gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); //dene a cor de fundo 7 8 //habilita remoção de faces ocultas 9 gl.glenable(gl.gl_cull_face); 10 gl.glcullface(gl.gl_back); 11 12 gl.glmatrixmode(gl.gl_projection); //dene que a matrix é a de projeção 13 gl.glloadidentity(); //carrega a matrix de identidade 14 gl.glortho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //dene uma projeção ortogonal 15 } 16 } 32 / 35

Código OpenGL 33 / 35

Código OpenGL 1 public class ZBuffer implements GLEventListener { 2... 3 4 public void init(glautodrawable drawable) { 5 GL gl = drawable.getgl(); 6 gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); //dene a cor de fundo 7 8 //habilita o teste de profundidade 9 gl.glenable(gl.gl_depth_test); 10 11 //habilita remoçãop de faces ocultas 12 gl.glenable(gl.gl_cull_face); 13 gl.glcullface(gl.gl_back); 14 15 gl.glmatrixmode(gl.gl_projection); //dene que a matrix é a de projeção 16 gl.glloadidentity(); //carrega a matrix de identidade 17 gl.glortho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //dene uma projeção ortogonal 18 } 19 } 34 / 35

Código OpenGL 35 / 35