A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Pipeline Gráfico.

Apresentações semelhantes


Apresentação em tema: "António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Pipeline Gráfico."— Transcrição da apresentação:

1 António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Pipeline Gráfico

2 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

3 Display Lists DI-UM Computação Gráfica 08/09 3 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.

4 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.

5 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

6 Montagem das primitivas DI-UM Computação Gráfica 08/09 6 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

7 Operações por pixel DI-UM Computação Gráfica 08/09 7 Transformação de formatos, transformações aplicadas às texturas Leituras do frame buffer.

8 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

9 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)

10 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.

11 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çãoRaster View Frustrum & Back face culling Texturização Alpha & Z Test

12 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

13 View Frustrum Culling Determinar a forma do frustrum DI-UM Computação Gráfica 08/09 13 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

14 View Frustrum Culling Determinar os 6 planos que definem o frustrum: 1.Determinar os 8 pontos que constituem os cantos do frustrum 2.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

15 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/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)

16 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

17 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

18 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

19 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

20 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

21 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

22 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

23 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

24 DI-UM Computação Gráfica 08/09 24 Referências OpenGL Reference Manual, OpenGL Architecture Review Board. OpenGL Programming Guide (The Red Book)


Carregar ppt "António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Pipeline Gráfico."

Apresentações semelhantes


Anúncios Google