Computação Gráfica Pipeline Gráfico António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 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 Os comandos (geometria ou pixels) podem ser compilados numa display list Estes comandos são armazenados de forma eficiente e enviados para o pipeline sempre que a display list é executada. DI-UM Computação Gráfica 08/09 3 Evaluators 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. DI-UM Computação Gráfica 08/09 4 Operações por vértice Transformações geométricas e projecção no espaço do êcran. Iluminação (cálculo da cor do vértice) Coordenadas de textura DI-UM Computação Gráfica 08/09 5 Montagem das primitivas View Frustrum clipping. Back face culling, depth evaluation and perspective division Output: Primitivas geométricas transformadas com info sobre cor e coordenadas de texturas para cada vértice DI-UM Computação Gráfica 08/09 6 Operações por pixel Transformação de formatos, transformações aplicadas às texturas Leituras do frame buffer. DI-UM Computação Gráfica 08/09 7 Montagem de texturas Texture objects. Muti-texturing. Essencialmente, optimizações ao armazenamento e acesso (read/write) a texturas DI-UM Computação Gráfica 08/09 8 Rasterização 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) DI-UM Computação Gráfica 08/09 9 Operações por fragmento 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. DI-UM Computação Gráfica 08/09 10 Redundância Iluminação View Frustrum & Back face culling Raster Texturização Alpha & Z Test • 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 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 Definição do frustrum gluPerspective(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 DI-UM Computação Gráfica 08/09 13 View Frustrum Culling • Determinar os 6 planos que definem o frustrum: 1. 2. Determinar os 8 pontos que constituem os cantos do frustrum 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 fc = p + d * farDist uHf2 = up * Hfar/2 rHf2 = right * Wfar/2 ftl = fc + (uHf2) - (rHf2) ftr = fc + (uHf2) + (rHf2) fbl = fc - (uHf2) - (rHf2) fbr = fc - (uHf2) + (rHf2) DI-UM Computação Gráfica 08/09 nc = p + d * nearDist uHn2 = up * Hnear/2 rHn2 = right * Wnear/2 ntl = nc + (uHn2) - (rHn2) ntr = nc + (uHn2) + (rHn2) nbl = nc - (uHn2) - (rHn2) nbr = nc - (uHn2) + (rHn2) 15 View Frustrum Culling • 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 Distância negativa Distância positiva • No caso do view frustrum extraímos as equações dos 6 planos de forma a que a normal aponte para dentro do frustrum DI-UM Computação Gráfica 08/09 16 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) 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 DI-UM Computação Gráfica 08/09 19 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 Referências • OpenGL Reference Manual, OpenGL Architecture Review Board. • OpenGL Programming Guide (The Red Book) • www.lighthouse3d.com DI-UM Computação Gráfica 08/09 24