António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica...
Transcript of António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica...
António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09
Computação Gráfica
Pipeline Gráfico
Pipeline Gráfico
• A ordem das operações no OpenGL pode ser vista como seguindo a ordem representada pelo pipeline abaixo:
DI-UM Computação Gráfica 08/09 2
Display Lists
DI-UM Computação Gráfica 08/09 3
Os comandos (geometria ou pixels) podem ser compilados numa display listEstes comandos são armazenados de forma eficiente e enviados para o pipeline sempre que a display list é executada.
Evaluators
DI-UM Computação Gráfica 08/09 4
Toda a geometria deve ser descrita usando vértices. Curvas e superfícies paramétricas, que são inicialmente descritas usando pontos de controlo e funções base, são convertidas em representações baseadas em vértices pelos evaluators.
Operações por vértice
DI-UM Computação Gráfica 08/09 5
Transformações geométricas e projecção no espaço do êcran.Iluminação (cálculo da cor do vértice)Coordenadas de textura
Montagem das primitivas
DI-UM Computação Gráfica 08/09 6
View Frustrum clipping.Back face culling, depth evaluation and perspective divisionOutput: Primitivas geométricas transformadas com info sobre cor e coordenadas de texturas para cada vértice
Operações por pixel
DI-UM Computação Gráfica 08/09 7
Transformação de formatos, transformações aplicadas às texturasLeituras do frame buffer.
Montagem de texturas
DI-UM Computação Gráfica 08/09 8
Texture objects.Muti-texturing.Essencialmente, optimizações ao armazenamento e acesso (read/write) a texturas
Rasterização
DI-UM Computação Gráfica 08/09 9
Conversão das primitivas geométricas em fragmentos.Cada fragmento corresponde a um pixel no frame buffer.Cálculo dos fragmentos correspondentes ao interior de um polígono.Cálculo cor, profundidade e coord. de textura por fragmento (interpolação)
Operações por fragmento
DI-UM Computação Gráfica 08/09 10
Aplicação de um texel a cada fragmento. Cálculo de nevoeiro (fog).Alpha-test e depth-buffer test (remoção de superfícies ocludidas)Blending, dithering and masking.Escrita final no frame buffer.
Redundância
• Todos os vértices são iluminados, antes de ser feito qualquer tipo de culling
• Todas as primitivas que passam o teste de culling dão origem a fragmentos e todos os fragmentos recebem uma cor, coordenadas de textura e um texel antes do teste do Z-buffer
Corolário:• São processados muitos vértices e fragmentos que
acabarão por não ser visíveis
DI-UM Computação Gráfica 08/09 11
Iluminação RasterView Frustrum
&Back face culling
Texturização Alpha & ZTest
View Frustrum Culling
• Detectar, por software (i.e., no CPU), quais as primitivas geométricas que não são visíveis por não pertencerem ao campo de visão da câmara
DI-UM Computação Gráfica 08/09 12
View Frustrum Culling
• Determinar a forma do frustrum
DI-UM Computação Gráfica 08/09 13
Definição do frustrumgluPerspective(fov, ratio, nearDist, farDist);gluLookAt(px,py,pz, lx,ly,lz, ux,uy,uz)
Hnear = 2 * tan(fov / 2) * nearDist Wnear = Hnear * ratio
Hfar = 2 * tan(fov / 2) * farDist Wfar = Hfar * ratio
View Frustrum Culling
• Determinar os 6 planos que definem o frustrum:1. Determinar os 8 pontos que constituem os cantos do frustrum2. Extrair as 6 equações do plano
(Nota: as normais devem apontar para dentro do frustrum)
DI-UM Computação Gráfica 08/09 14
View Frustrum Culling
DI-UM Computação Gráfica 08/09 15
fc = p + d * farDist nc = p + d * nearDist uHf2 = up * Hfar/2 uHn2 = up * Hnear/2 rHf2 = right * Wfar/2 rHn2 = right * Wnear/2ftl = fc + (uHf2) - (rHf2) ntl = nc + (uHn2) - (rHn2) ftr = fc + (uHf2) + (rHf2) ntr = nc + (uHn2) + (rHn2) fbl = fc - (uHf2) - (rHf2) nbl = nc - (uHn2) - (rHn2) fbr = fc - (uHf2) + (rHf2) nbr = nc - (uHn2) + (rHn2)
• Uma vez determinados os planos podemos testar se as primitivas geométricas estão dentro ou fora do frustrum
• Utilizamos a distância com sinal para determinar de que lado do plano está um ponto:– Se a distância é positiva encontra-se do lado para o qual a normal aponta– Se é negativa então encontra-se do outro lado
• No caso do view frustrum extraímos as equações dos 6 planos de forma a que a normal aponte para dentro do frustrum
View Frustrum Culling
DI-UM Computação Gráfica 08/09 16
Distância positiva
Distância negativa
View Frustrum Culling
• Pontos:– Um ponto está dentro do frustrum se a sua distância for
positiva a todos os 6 planos
int pointInFrustum(Vec3 &p) {
int result = INSIDE;
for(int i=0; i < 6; i++) {
if (pl[i].distance(p) < 0)
return OUTSIDE; }
return(result);
}
DI-UM Computação Gráfica 08/09 17
View Frustrum Culling
• Objectos– Testar se TODOS os vértices de TODOS os polígonos
que constituem um objecto estão fora do frustrum não é suficiente para garantir que o objecto está totalmente fora do frustrum
– De qualquer forma, testar todos os vértices poderia levar mais tempo do que deixar ser o sistema gráfico a fazer o clipping
DI-UM Computação Gráfica 08/09 18
View Frustrum Culling
• Objectos– Uma alternativa é calcular um volume elementar que
contenha toda a geometria do objecto e testar se este volume está dentro do frustrum
– Volumes elementares: esferas e Axis Aligned Boxes (AAB)
DI-UM Computação Gráfica 08/09 19
Dependendo da forma do objecto o volume pode ser mais ou menos eficaz, isto é, ser considerado dentro do frustrum sem que nenhum triângulo aí contido esteja efectivamente dentro do frustrum
View Frustrum Culling
• Esferas– A esfera está fora do frustrum se o seu centro está do lado
errado de pelo menos um dos planos e o raio é menor que a distância do centro ao plano
int sphereInFrustum(Vec3 &p, float radius) {
float distance;
int result = INSIDE;
for(int i=0; i < 6; i++) {
distance = pl[i].distance(p);
if (distance < -radius) return OUTSIDE;
}
return(result);
}
DI-UM Computação Gráfica 08/09 20
View Frustrum Culling
• AAB– Uma AAB pode ter todos os vértices fora do frustrum e
ainda assim pertencer ao frustrum
DI-UM Computação Gráfica 08/09 21
View Frustrum Culling
• AAB– Solução: Rejeitar uma AAB apenas se todos os seus
vértices estão do lado errado do mesmo plano!– Esta abordagem leva a aceitar algumas AAB que não
pertencem ao frustrum
DI-UM Computação Gráfica 08/09 22
View Frustrum Culling
• Hierarquia de Volumes– Para cenas complexas pode-se justificar utilizar hierarquias:
se uma AAB de nível mais elevado não pertence ao frustrum, então não se justifica testar as interiores
DI-UM Computação Gráfica 08/09 23
DI-UM Computação Gráfica 08/09 24
Referências
• OpenGL Reference Manual, OpenGL Architecture Review Board.
• OpenGL Programming Guide (The Red Book)
• www.lighthouse3d.com