antónio ramires fernandes & luís paulo santos - computação gráfica 08/09 computação...

24
tónio Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08 tónio Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08 Computação Gráfica Pipeline Gráfico

Upload: internet

Post on 17-Apr-2015

106 views

Category:

Documents


1 download

TRANSCRIPT

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

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

Page 2: Antó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

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

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.

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

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.

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

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

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

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

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

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.

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

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

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

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)

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

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.

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

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

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

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

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

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

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

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

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

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)

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

• 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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