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
Download

05-GraphicsPipeline - HPC