240 likes | 316 Views
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:. Display Lists. Os comandos (geometria ou pixels) podem ser compilados numa display list
E N D
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
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
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
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
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
Operações por pixel Transformação de formatos, transformações aplicadas às texturasLeituras do frame buffer. DI-UM Computação Gráfica 08/09
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
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
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
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 Iluminação View Frustrum & Back face culling Raster Texturização Alpha & Z Test DI-UM Computação Gráfica 08/09
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
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) * nearDistWnear = Hnear * ratio Hfar = 2 * tan(fov / 2) * farDistWfar = Hfar * ratio DI-UM Computação Gráfica 08/09
View Frustrum Culling • Determinar os 6 planos que definem o frustrum: • 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
View Frustrum Culling fc = p + d * farDist nc = p + d * nearDist uHf2 = up * Hfar/2 uHn2 = up * Hnear/2 rHf2 = right * Wfar/2 rHn2 = right * Wnear/2 ftl = 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) DI-UM Computação Gráfica 08/09
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 • No caso do viewfrustrum extraímos as equações dos 6 planos de forma a que a normal aponte para dentro do frustrum Distância negativa Distância positiva DI-UM Computação Gráfica 08/09
View Frustrum Culling • Pontos: • Um ponto está dentro do frustrum se a sua distância for positiva a todos os 6 planos intpointInFrustum(Vec3 &p) { intresult = 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
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
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
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
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
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
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
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