Baixe o app para aproveitar ainda mais
Prévia do material em texto
Clipping and Culling Prof. Eduardo Gastal eslgastal@inf.ufrgs.br INF01047 – 2017/1 Culling 2 Frustum culling Backface culling Occlusion culling Objetos que a câmera virtual não vê devem ser descartados Objetos que a câmera virtual não vê devem ser descartados Culling 3 Fora do frustum “Lado de trás” do objeto Objeto escondido por outro em sua frente Clipping Clipping é o processo de “recortar” um objeto, preservando somente as partes de interesse 4 Normalized Device Coordinates (NDC) Clipping Clipping é o processo de “recortar” um objeto, preservando somente as partes de interesse 5 Normalized Device Coordinates (NDC) Fora do volume visível Clipping Clipping é o processo de “recortar” um objeto, preservando somente as partes de interesse 6 Normalized Device Coordinates (NDC) Fora do volume visível Clipping Clipping é o processo de “recortar” um objeto, preservando somente as partes de interesse 7 Normalized Device Coordinates (NDC) Fora do volume visível Clipping Clipping é o processo de “recortar” um objeto, preservando somente as partes de interesse 8 Normalized Device Coordinates (NDC) Fora do volume visível Culling vs Clipping Culling comumente visa evitar processamento desnecessário Descartamos o que não será visto Ocorre tanto no nivel da aplicação como dentro do pipeline gráfico (OpenGL) 9 Culling: Aplicação vs Pipeline 10 Culling: Aplicação vs Pipeline 11 Culling: Aplicação vs Pipeline 12 1. Aplicação descarta geometria que é obviamente não visível. Culling: Aplicação vs Pipeline 13 1. Aplicação descarta geometria que é obviamente não visível. 2. GPU faz o descarte final Culling vs Clipping 14 Culling vs Clipping Clipping comumente visa evitar erros de rendering e limitações técnicas Por exemplo: tentar desenhar um pixel fora da tela irá gerar um erro de acesso à memória do framebuffer, ou pode acabar sobrescrevendo um pixel errado. Portanto, “recortamos” regiões problemáticas Normalmente ocorre somente no nível do pipeline gráfico (OpenGL) 15 Culling vs Clipping Clipping comumente visa evitar erros de rendering e limitações técnicas Por exemplo: tentar desenhar um pixel fora da tela irá gerar um erro de acesso à memória do framebuffer, ou pode acabar sobrescrevendo um pixel errado. Portanto, “recortamos” regiões problemáticas Normalmente ocorre somente no nível do pipeline gráfico (OpenGL) 16 Pipeline Gráfico (Rasterização) 17 Aplicação Rendering Imagem (framebuffer) Transform. Geometria Rasterização Model & View Vertex Shading Projection Clipping Screen Mapping (Viewport) Rendering Culling e Clipping ocorrem durante renderização de primitivas 18 Rendering Culling e Clipping ocorrem durante renderização de primitivas 19 Culling: Fora da região visível. Descartado por inteiro. Rendering Culling e Clipping ocorrem durante renderização de primitivas 20 Culling: Fora da região visível. Descartado por inteiro. Clipping: Intersecta a região visível. Necessário recorte. Perguntas? 21 Backface Culling 22 𝑢 𝑤 𝑣 Camera (Eye) Coord. Backface Culling 23 𝑢 𝑤 𝑣 Camera (Eye) Coord. Backface Culling 24 𝑢 𝑤 𝑣 Camera (Eye) Coord. Como detectar triângulos que estão “de costas” para a câmera? Backface Culling 25 𝑢 𝑤 𝑣 Camera (Eye) Coord. Como detectar triângulos que estão “de costas” para a câmera? 𝑛 Backface Culling 26 𝑢 𝑤 𝑣 Camera (Eye) Coord. Como detectar triângulos que estão “de costas” para a câmera? Descartar (cull) triângulos quando 𝑐 ⋅ 𝑛 𝑛 𝑐 Backface Culling 27 𝑢 𝑤 𝑣 Camera (Eye) Coord. Como detectar triângulos que estão “de costas” para a câmera? Descartar (cull) triângulos quando 𝑐 ⋅ 𝑛 𝑛 < 0 𝑐 Backface Culling 28 𝑢 𝑤 𝑣 Camera (Eye) Coord. Como detectar triângulos que estão “de costas” para a câmera? Descartar (cull) triângulos quando 𝑐 ⋅ 𝑛 𝑛 < 0 𝑐 𝑐 Backface Culling em OpenGL 29 Backface Culling em OpenGL glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glFrontFace(GL_CCW) 30 Backface Culling em OpenGL glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glFrontFace(GL_CCW) 31 GL_BACK GL_FRONT GL_FRONT_AND_BACK Backface Culling em OpenGL glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glFrontFace(GL_CCW) 32 GL_BACK GL_FRONT GL_FRONT_AND_BACK Backface Culling em OpenGL glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glFrontFace(GL_CCW) 33 GL_BACK GL_FRONT GL_FRONT_AND_BACK GL_CW GL_CCW Perguntas? 34 Occlusion Culling (Visibility) 35 Occlusion Culling (Visibility) 36 Como renderizar corretamente objetos escondidos por outros? Algoritmo do Pintor Algoritmo Z-buffer (ou depth buffer) Algoritmo do Pintor 37 Algoritmo do Pintor 38 Algoritmo do Pintor 39 Algoritmo do Pintor 40 Algoritmo do Pintor Desenhar primeiro objetos mais distantes da câmera Necessário ordenação dos polígonos Necessário reordenar ao movimentar a câmera! Ordenação nem sempre é possível... 41 Algoritmo do Pintor Desenhar primeiro objetos mais distantes da câmera Necessário ordenação dos polígonos Necessário reordenar ao movimentar a câmera! Ordenação nem sempre é possível... 42 Algoritmo do Pintor Desenhar primeiro objetos mais distantes da câmera Necessário ordenação dos polígonos Necessário reordenar ao movimentar a câmera! Ordenação nem sempre é possível... 43 Algoritmo do Pintor 44 A B Algoritmo do Pintor 45 A B C Z-buffer (depth buffer) 46 Z-buffer (depth buffer) 47 Posição em profundidade do primeiro triângulo Z-buffer (depth buffer) 48 Posição em profundidade do primeiro triângulo Z-buffer (depth buffer) 49 Posição em profundidade do primeiro triângulo Z-buffer (depth buffer) 50 Posição em profundidade do primeiro triângulo Posição em profundidade do segundo triângulo Z-buffer (depth buffer) 51 Posição em profundidade do primeiro triângulo Posição em profundidade do segundo triângulo Z-buffer (depth buffer) 52 Posição em profundidade do primeiro triângulo Posição em profundidade do segundo triângulo Somente o fragmento mais próximo da câmera se torna um pixel! Z-buffer (depth buffer) - 1974 Disney, Pixar Edwin Catmull Z-buffer (depth buffer) - 1974 Algumas vantagens e desvantagens: Fácil implementação (software e hardware) Funciona para qualquer tipo de objeto Utiliza muita memória (#pixels × bitsperpixel) Depende da precisão desejada para z (bitsperpixel) 𝑝𝑧 = 0.12 vs 𝑞𝑧 = 0.11 Disney, Pixar Edwin Catmull Z-buffer (depth buffer) - 1974 Algumas vantagens e desvantagens: Fácil implementação (software e hardware) Funciona para qualquer tipo de objeto Utiliza muita memória (#pixels × bitsperpixel) Depende da precisão desejada para z (bitsperpixel) 𝑝𝑧 = 0.12 vs 𝑞𝑧 = 0.11 Disney, Pixar Edwin Catmull Z-buffer (depth buffer) - 1974 Algumas vantagens e desvantagens: Fácil implementação (software e hardware) Funciona para qualquer tipo de objeto Utiliza muita memória (#pixels × bitsperpixel) Depende da precisão desejada para z (bitsperpixel) 𝑝𝑧 = 0.12 vs 𝑞𝑧 = 0.11 Disney, Pixar Edwin Catmull Z-buffer Precision: Z-fighting 57 Z-buffer (depth buffer) - 1974 Algumas vantagens e desvantagens: Fácil implementação (software e hardware) Funciona para qualquer tipo de objeto Utiliza muita memória (#pixels × bitsperpixel) Depende da precisão desejada para z (bitsperpixel) 𝑝𝑧 = 0.12 vs 𝑞𝑧 = 0.11 Rasterização: precisa interpolar z de cada vértice para cada pixel Disney, Pixar Edwin Catmull Z-buffer Algorithm 59 for (x,y) in region 𝛼 = 𝑓𝐛𝐜 𝑥, 𝑦 /𝑓𝐛𝐜(𝑎𝑥 , 𝑎𝑦) 𝛽 = 𝑓𝐜𝐚 𝑥, 𝑦 /𝑓𝐜𝐚(𝑏𝑥 , 𝑏𝑦) 𝛾= 𝑓𝐚𝐛 𝑥, 𝑦 /𝑓𝐚𝐛(𝑐𝑥 , 𝑐𝑦) if 𝛼 > 0 and 𝛽 > 0 and 𝛾 > 0 𝐩color = 𝛼𝐚color + 𝛽𝐛color + 𝛾𝐜color draw pixel at (x,y) with color 𝐩color c b a Z-buffer Algorithm 60 for (x,y) in region 𝛼 = 𝑓𝐛𝐜 𝑥, 𝑦 /𝑓𝐛𝐜(𝑎𝑥 , 𝑎𝑦) 𝛽 = 𝑓𝐜𝐚 𝑥, 𝑦 /𝑓𝐜𝐚(𝑏𝑥 , 𝑏𝑦) 𝛾 = 𝑓𝐚𝐛 𝑥, 𝑦 /𝑓𝐚𝐛(𝑐𝑥 , 𝑐𝑦) if 𝛼 > 0 and 𝛽 > 0 and 𝛾 > 0 𝐩color = 𝛼𝐚color + 𝛽𝐛color + 𝛾𝐜color 𝐩z = 𝛼𝐚z + 𝛽𝐛z + 𝛾𝐜z if 𝐩z < zbuffer[x,y] draw pixel at (x,y) with color 𝐩color zbuffer[x,y] = 𝐩z c b a Z-buffer Algorithm 61 for (x,y) in region 𝛼 = 𝑓𝐛𝐜 𝑥, 𝑦 /𝑓𝐛𝐜(𝑎𝑥 , 𝑎𝑦) 𝛽 = 𝑓𝐜𝐚 𝑥, 𝑦 /𝑓𝐜𝐚(𝑏𝑥 , 𝑏𝑦) 𝛾 = 𝑓𝐚𝐛 𝑥, 𝑦 /𝑓𝐚𝐛(𝑐𝑥 , 𝑐𝑦) if 𝛼 > 0 and 𝛽 > 0 and 𝛾 > 0 𝐩color = 𝛼𝐚color + 𝛽𝐛color + 𝛾𝐜color 𝐩z = 𝛼𝐚z + 𝛽𝐛z + 𝛾𝐜z if 𝐩z < zbuffer[x,y] draw pixel at (x,y) with color 𝐩color zbuffer[x,y] = 𝐩z c b a for all (x,y) zbuffer[x,y] = ∞ Z-buffer (depth buffer) - 1974 Algumas vantagens e desvantagens: Fácil implementação (software e hardware) Funciona para qualquer tipo de objeto Utiliza muita memória (#pixels × bitsperpixel) Depende da precisão desejada para z (bitsperpixel) 𝑝𝑧 = 0.12 vs 𝑞𝑧 = 0.11 Rasterização: precisa interpolar z de cada vértice para cada pixel Não funciona diretamente para renderizar objetos transparentes Disney, Pixar Edwin Catmull Z-buffer em OpenGL 63 Z-buffer em OpenGL 64 glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LESS) glClear(GL_DEPTH_BUFFER_BIT) Z-buffer em OpenGL 65 glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LESS) glClear(GL_DEPTH_BUFFER_BIT) GL_LESS GL_GREATER GL_LEQUAL GL_GEQUAL GL_EQUAL GL_NOTEQUAL GL_ALWAYS GL_NEVER Z-buffer em OpenGL 66 glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LESS) glClear(GL_DEPTH_BUFFER_BIT) GL_LESS GL_GREATER GL_LEQUAL GL_GEQUAL GL_EQUAL GL_NOTEQUAL GL_ALWAYS GL_NEVER Importante resetar (“limpar”) o z-buffer sempre que a cena virtual for renderizada novamente: Perguntas? 67 Frustum Culling 68 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum Frustum Culling 69 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum Frustum Culling 70 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum Frustum Culling 71 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum Frustum Culling 72 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum O que acontece com este triângulo se ele for transformado por nossas projeções? Frustum Culling 73 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum O que acontece com este triângulo se ele for transformado por nossas projeções? Frustum Culling 74 𝑢 𝑤 𝑣 Camera (Eye) Coord. Frustum Precisamos descartar objetos fora do frustum da câmera, caso contrário estes poderão ser projetados no plano de imagem pelas matrizes de projeção! O que acontece com este triângulo se ele for transformado por nossas projeções? Frustum Culling 75 𝑧 𝑦 Frustum Frustum Culling 76 𝑧 𝑦 Frustum ✘ ✘ ✘ ✘ Frustum Culling 77 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ ? Frustum Culling 78 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ ? Frustum Culling 79 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Precisa ser recortado! (clipping) Frustum Culling: Pontos 80 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ ✔ ✘ ✘ Frustum Culling: Pontos 81 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Pontos nunca precisam de recorte! ✔ ✘ ✘ Frustum Culling: Pontos 82 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Pontos nunca precisam de recorte! Mas: como testar se um ponto está dentro ou fora do frustum? ✔ ✘ ✘ Frustum Culling: Pontos 83 p Frustum Culling: Pontos 84 p Frustum Culling: Pontos 85 p Frustum Culling: Pontos 86 p Frustum Culling: Pontos Ponto p está dentro do frustum? Mais fácil testar após transformação para NDC! 87 p Frustum Culling: Pontos Ponto p está dentro do frustum? Mais fácil testar após transformação para NDC! 88 p −1 −1 −1 1 1 1 Normalized Device Coordinates (NDC) 𝑀𝑃 (+div.w) p Frustum Culling: Pontos Ponto p está dentro do frustum? Mais fácil testar após transformação para NDC! 89 p −1 −1 −1 1 1 1 Normalized Device Coordinates (NDC) 𝑀𝑃 (+div.w) p −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 Frustum Culling: Pontos 90 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 Frustum Culling: Pontos Ponto p em NDC está dentro do frustum: Note que o ponto só está em NDC após multiplicação por 𝑀𝑃 e divisão por w: 91 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 Frustum Culling: Pontos Ponto p em NDC está dentro do frustum: Note que o ponto só está em NDC após multiplicação por 𝑀𝑃 e divisão por w: 92 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ Frustum Culling: Pontos Ponto p em NDC está dentro do frustum: Note que o ponto só está em NDC após multiplicação por 𝑀𝑃 e divisão por w: 93 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Frustum Culling: Pontos Ponto p em NDC está dentro do frustum: Note que o ponto só está em NDC após multiplicação por 𝑀𝑃 e divisão por w: 94 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Frustum Culling: Pontos Ponto p em NDC está dentro do frustum: Note que o ponto só está em NDC após multiplicação por 𝑀𝑃 e divisão por w: 95 −1 ≤ 𝑝𝑥 ≤ 1 −1 ≤ 𝑝𝑦 ≤ 1 −1 ≤ 𝑝𝑧 ≤ 1 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Teste do OpenGL é válido somente se 𝑤 > 0! Frustum Culling: Pontos 96 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Teste sempre válido. Teste do OpenGL é válido somente se 𝑤 > 0! Frustum Culling: Pontos 97 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Teste sempre válido. Para obter w > 0, usamos −𝑀𝑃 para projeção perspectiva em nosso Lab 2. Teste do OpenGL é válido somente se 𝑤 > 0! Divisão por w 98 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 Divisão por w 99 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 div. w 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 Divisão por w 100 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 div. w −𝑀𝑃𝐩 = −𝑥 −𝑦 −𝑧 −𝑤 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 Divisão por w 101 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 div. w −𝑀𝑃𝐩 = −𝑥 −𝑦 −𝑧 −𝑤 div. w −𝑥/−𝑤 −𝑦/−𝑤 −𝑧/−𝑤 1 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 Divisão por w 102 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 div. w −𝑀𝑃𝐩 = −𝑥 −𝑦 −𝑧 −𝑤 div. w −𝑥/−𝑤 −𝑦/−𝑤 −𝑧/−𝑤 1 = 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 Divisão por w 103 𝑀𝑃𝐩 = 𝑥 𝑦 𝑧 𝑤 div. w −𝑀𝑃𝐩 = −𝑥 −𝑦 −𝑧 −𝑤 div. w −𝑥/−𝑤 −𝑦/−𝑤 −𝑧/−𝑤 1 = 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 𝑥/𝑤 𝑦/𝑤 𝑧/𝑤 1 Frustum Culling: Pontos 104 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 ≡ OpenGL faz este teste. Economiza divisões. Teste sempre válido. Para obter w > 0, usamos −𝑀𝑃 para projeção perspectiva em nosso Lab 2. Teste do OpenGL é válido somente se 𝑤 > 0! From the OpenGL 4.5 spec. 105 Perguntas? 106 Frustum Culling: Linhas 107 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Frustum Culling: Linhas 108 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Linhas precisam de recorte! Frustum Culling: Linhas 109 𝑧 𝑦 Frustum ✘ ✔ ✘ ✘ ✘ Linhas precisam de recorte! Clipping: Linhas 110 Clipping: Linhas Também pode ser feito em NDC Mas: normalmente feito após multiplicação pela matriz de projeção perspectiva e antes da divisão por w. Espaço chamado de “clip space.” Por quê? Divisão porw gera uma singularidade para primitivas que cruzam o plano 𝑧 = 0. 111 Clipping: Linhas Também pode ser feito em NDC Mas: normalmente feito após multiplicação pela matriz de projeção perspectiva e antes da divisão por w. Espaço chamado de “clip space.” Por quê? Divisão por w gera uma singularidade para primitivas que cruzam o plano 𝑧 = 0. 112 Clipping: Linhas Também pode ser feito em NDC Mas: normalmente feito após multiplicação pela matriz de projeção perspectiva e antes da divisão por w. Espaço chamado de “clip space.” Por quê? Divisão por w gera uma singularidade para primitivas que cruzam o plano 𝑧 = 0. 113 Cruzando o plano 𝒛 = 𝟎 114 𝑧 𝑦 𝑧 = 0 Cruzando o plano 𝒛 = 𝟎 115 𝑧 𝑦 𝑧 = 0 Cruzando o plano 𝒛 = 𝟎 116 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 117 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 118 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 119 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 120 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 121 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 122 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 123 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 124 𝑧 𝑦 Divisão por zero! (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 125 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 126 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 127 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 128 𝑧 𝑦 (𝑤 = 0) Wrap-around no infinito! 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 129 𝑧 𝑦 (𝑤 = 0) 𝑧 = 0 plano de projeção Cruzando o plano 𝒛 = 𝟎 130 𝑧 𝑦 O recorte (clipping) desta linha deve ser feito antes da divisão por w, para evitar a singularidade do plano 𝑧 = 0. (𝑤 = 0) Clipping antes da divisão por w 131 Clipping antes da divisão por w 132 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 Após div.w Clipping antes da divisão por w 133 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 Após div.w Antes div.w Clipping antes da divisão por w Note que, para pontos, também fazemos teste do frustum antes da divisão por w A situação é análoga para clipping de linhas e triângulos: feito antes da div.w. 134 −1 ≤ 𝑥/𝑤 ≤ 1 −1 ≤ 𝑦/𝑤 ≤ 1 −1 ≤ 𝑧/𝑤 ≤ 1 −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 Após div.w Antes div.w Perguntas? 135 Clipping: Linhas 136 D a n n y C o h e n Iv a n S u th e rl a n d Clipping: Linhas Algoritmo de Cohen e Sutherland (1967) Descreve uma maneira eficiente para determinar quando uma linha precisará de clipping Descrição extendida para uso deste algoritmo antes da divisão por w por Jim Blinn 137 D a n n y C o h e n Iv a n S u th e rl a n d Clipping: Linhas Algoritmo de Cohen e Sutherland (1967) Descreve uma maneira eficiente para determinar quando uma linha precisará de clipping Descrição extendida para uso deste algoritmo antes da divisão por w por Jim Blinn 138 D a n n y C o h e n Iv a n S u th e rl a n d Blinn, J. F. “A Trip down the Graphics Pipeline: Line Clipping.” IEEE CG&A. 1991. Cohen-Sutherland (1967) 139 Quais destas linhas precisam de recorte? Cohen-Sutherland (1967) 140 Cohen-Sutherland (1967) 141 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX Cohen-Sutherland (1967) 142 XXX1 XXX0 XXX0 XXX1 XXX0 XXX0 XXX1 XXX0 XXX0 Cohen-Sutherland (1967) 143 XX01 XX00 XX10 XX01 XX00 XX10 XX01 XX00 XX10 Cohen-Sutherland (1967) 144 X101 X100 X110 X001 X000 X010 X001 X000 X010 Cohen-Sutherland (1967) 145 0101 0100 0110 0001 0000 0010 1001 1000 1010 Cohen-Sutherland (1967) 146 0101 0100 0110 0001 0000 0010 1001 1000 1010 Cohen-Sutherland (1967) 147 0101 0100 0110 0001 0000 0010 1001 1000 1010 10001001 Cohen-Sutherland (1967) 148 0101 0100 0110 0001 0000 0010 1001 1000 1010 10001001 1000 0001 Cohen-Sutherland (1967) 149 0101 0100 0110 0001 0000 0010 1001 1000 1010 10001001 1000 0001 0001 0000 Cohen-Sutherland (1967) 150 0101 0100 0110 0001 0000 0010 1001 1000 1010 10001001 1000 0001 0001 0000 0000 0000 Cohen-Sutherland (1967) 151 0101 0100 0110 0001 0000 0010 1001 1000 1010 10001001 1000 0001 0001 0000 0000 0000 1000 0010 Cohen-Sutherland (1967) 152 10001001 1000 0001 0001 0000 0000 0000 “outcodes” 1000 0010 Cohen-Sutherland (1967) 153 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1000 0010 Cohen-Sutherland (1967) 154 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0000 1000 0010 Cohen-Sutherland (1967) 155 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0000 0000 1000 0010 Cohen-Sutherland (1967) 156 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0000 0000 1000 0010 0000 Cohen-Sutherland (1967) 157 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0000 0000 0000 1000 0010 0000 Cohen-Sutherland (1967) 158 10001001 1000 0001 0001 0000 0000 0000 “outcodes” Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1000 0000 0000 0000 1000 0010 0000 Cohen-Sutherland (1967) 159 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1000 0010 Cohen-Sutherland (1967) 160 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 Cohen-Sutherland (1967) 161 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 Cohen-Sutherland (1967) 162 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 0000 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 Cohen-Sutherland (1967) 163 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0000 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 Cohen-Sutherland (1967) 164 1000 0001 0001 0000 0000 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0000 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 1010 Cohen-Sutherland (1967) 165 1000 0001 0001 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Cohen-Sutherland (1967) 166 1000 0001 0001 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Cohen-Sutherland (1967) 167 1000 0001 0001 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Qual a vantagem deste algoritmose nem todas as linhas que não precisam de recorte são detectadas? Cohen-Sutherland (1967) 168 1000 0001 0001 0000 Bitwise AND of outcodes is ≠ 0000 ⇒ Linha está fora (descarta) 1001 0001 Bitwise OR of outcodes is = 0000 ⇒ Linha está 100% dentro 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte A grande maioria das linhas normalmente não precisa de recorte, e a grande maioria destas são rapidamente tratadas pelo algoritmo. Perguntas? 169 Recorte de Linhas 170 1000 0001 0001 0000 1001 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Recorte de Linhas 171 1000 0001 0001 0000 1001 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Bitwise OR dos outcodes dizem contra quais planos as linhas devem ser recortadas. Recorte de Linhas 172 1000 0001 0001 0000 1001 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Bitwise OR dos outcodes dizem contra quais planos as linhas devem ser recortadas. Planos? Recorte de Linhas 173 1000 0001 0001 0000 1001 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Bitwise OR dos outcodes dizem contra quais planos as linhas devem ser recortadas. Recorte de Linhas 174 1000 0001 0001 0000 1001 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Bitwise OR dos outcodes dizem contra quais planos as linhas devem ser recortadas. Recorte de Linhas 175 1000 0001 0001 0000 0001 1000 0010 1010 Caso contrário, linha tem chance de necessitar recorte Bitwise OR dos outcodes dizem contra quais planos as linhas devem ser recortadas. 1001 Recorte de Linhas 176 1000 0001 0001 0000 0001 1000 0010 Caso contrário, linha tem chance de necessitar recorte 1001 1010 Recorte é executado contra todos os planos cujo bit está não zero. Recorte de Linhas 177 Recorte de Linhas 178 Recorte de Linhas 179 a b Recorte de Linhas 180 a b 𝑛 p Recorte de Linhas 181 a b 𝑛 p 𝐪 ∈ plano ⇔ Recorte de Linhas 182 a b 𝑛 p (𝐪 − 𝐩) ⋅ 𝑛 = 0𝐪 ∈ plano ⇔ Recorte de Linhas 183 a b 𝑛 p (𝐪 − 𝐩) ⋅ 𝑛 = 0𝐪 ∈ plano ⇔ 𝐪 ∈ linha ⇔ Recorte de Linhas 184 a b 𝑛 p (𝐪 − 𝐩) ⋅ 𝑛 = 0𝐪 ∈ plano ⇔ 𝐪 ∈ linha ⇔ 𝐪 = 𝐚 + 𝑡 𝐛 − 𝐚 Recorte de Linhas 185 a b 𝑛 p (𝐪 − 𝐩) ⋅ 𝑛 = 0𝐪 ∈ plano ⇔ 𝐪 ∈ linha ⇔ 𝐪 = 𝐚 + 𝑡 𝐛 − 𝐚 𝑡 = 𝐩 − 𝐚 ⋅ 𝑛 𝐛 − 𝐚 ⋅ 𝑛 Recorte de Linhas 186 a b 𝑛 p (𝐪 − 𝐩) ⋅ 𝑛 = 0𝐪 ∈ plano ⇔ 𝐪 ∈ linha ⇔ 𝐪 = 𝐚 + 𝑡 𝐛 − 𝐚 𝑡 = 𝐩 − 𝐚 ⋅ 𝑛 𝐛 − 𝐚 ⋅ 𝑛 𝐪 = 𝐚 + 𝑡 𝐛 − 𝐚 Recorte de Linhas 187 1000 0001 0000 0001 1000 0010 Caso contrário, linha tem chance de necessitar recorte 1001 1010 Recorte é executado contra todos os planos cujo bit está não zero. Recorte de Linhas 188 1000 0001 a b 1001 Recorte de Linhas 189 1000 0001 a b 𝐪 1001 Recorte de Linhas 190 1000 0001 S1 S2a b 𝐪 1001 Recorte de Linhas 191 1000 0001 S1 S2 Qual segmento devemos preservar, S1 ou S2? a b 𝐪 1001 Recorte de Linhas 192 1000 0001 S1 S2 Qual segmento devemos preservar, S1 ou S2? a b S2! 𝐪 1001 Recorte de Linhas 193 1000 0001 S1 S2 Qual segmento devemos preservar, S1 ou S2? a b S2! 𝐪 Logo devemos substituir o ponto extremo a por q. 1001 Recorte de Linhas 194 1000 0001 S1 S2 Qual segmento devemos preservar, S1 ou S2? a b S2! 𝐪 Logo devemos substituir o ponto extremo a por q. Como determinar isso algoritmicamente? 1001 Recorte de Linhas 195 1000 0001 S1 S2 Qual segmento devemos preservar, S1 ou S2? a b S2! 𝐪 Logo devemos substituir o ponto extremo a por q. Como determinar isso algoritmicamente? Olhamos para o outcode dos pontos extremos! 1001 1XXX XXX1 Recorte de Linhas 196 1000 a b 1001 Recorte de Linhas 197 a b Recorte de Linhas 198 0000 0001 1000 0010 Caso contrário, linha tem chance de necessitar recorte 1010 Recorte é executado contra todos os planos cujo bit está não zero. Recorte de Linhas 199 1000 0010 1010 1XXX XX1X a b Recorte de Linhas 200 1000 0010 1010 𝐪1XXX XX1X a b Recorte de Linhas 201 00101XXX XX1X a b Recorte de Linhas 202 0010 XX1X a b Recorte de Linhas 203 0010 XX1X a b Não existe mais intersecção com o segundo plano!? Recorte de Linhas 204 0010 XX1X a b Não existe mais intersecção com o segundo plano!? Isso significa que a linha está fora do volume desejado e pode ser descartada! Recorte de Linhas 205 Linhas recortadas e prontas para rasterização! Recorte de Linhas Na prática, temos 6 planos de recorte 206 a b Recorte de Linhas Na prática, temos 6 planos de recorte 207 a Clip Space 𝑀𝑃 (sem div.w) b Recorte de Linhas Na prática, temos 6 planos de recorte 208 a Clip Space 𝑀𝑃 (sem div.w) −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 b Recorte de Linhas Na prática, temos 6 planos de recorte 209 a Clip Space 𝑀𝑃 (sem div.w) −𝑤 ≤ 𝑥 ≤ 𝑤 −𝑤 ≤ 𝑦 ≤ 𝑤 −𝑤 ≤ 𝑧 ≤ 𝑤 b ? Renderizando Linhas 210 a b Renderizando Linhas 1. Aplicar matriz de projeção nos pontos extremos a e b 2. Recortar com algoritmo de Cohen- Sutherland 3. Fazer divisão por w 4. Rasterizar (e.g. Bresenham) 211 a b Renderizando Linhas 1. Aplicar matriz de projeção nos pontos extremos a e b 2. Recortar com algoritmo de Cohen- Sutherland 3. Fazer divisão por w 4. Rasterizar (e.g. Bresenham) 212 a b Renderizando Linhas 1. Aplicar matriz de projeção nos pontos extremos a e b 2. Recortar com algoritmo de Cohen- Sutherland 3. Fazer divisão por w 4. Rasterizar (e.g. Bresenham) 213 a b Perguntas? 214 Recorte de Triângulos 215 Recorte de Triângulos 216 Recorte de Triângulos 217 Recorte de Triângulos 218 Recorte de Triângulos 219 Recorte de Triângulos 220 Recorte de Triângulos 221 Recorte de triângulos é uma operação complexa. Recorte de Triângulos 222 Recorte de Triângulos Na prática, podemos recortar os triângulos somente contra o near plane! Para evitar a singularidade de 𝑧 = 0. Os outro 5 planos podem ser tratados durante a rasterização 223 Recorte de Triângulos 224 𝑧 𝑦 Frustum Recorte de Triângulos 225 𝑧 𝑦 Frustum Recorte contra near plane Recorte de Triângulos 226 𝑧 𝑦 Frustum Recorte contra near plane Sem recorte! Serão tratados pelo rasterizador. Recorte de Triângulos 227 𝑧 𝑦 Frustum Recorte contra near plane Sem recorte! Serão tratados pelo rasterizador. Descartado (100% do lado errado do near plane) Recorte de Triângulos 228 Recorte de Triângulos Na prática, podemos recortar os triângulos somente contra o near plane! Para evitar a singularidade de 𝑧 = 0. Os outro 5 planos podem ser tratados durante a rasterização Como? Loop de rasterização somente por pixels válidos Com o z-buffer, descartar pixels com z fora do range válido 229 Rasterizando Triângulo 230 for (x,y) in region 𝛼 = 𝑓𝐛𝐜 𝑥, 𝑦 /𝑓𝐛𝐜(𝑎𝑥 , 𝑎𝑦) 𝛽 = 𝑓𝐜𝐚 𝑥, 𝑦 /𝑓𝐜𝐚(𝑏𝑥 , 𝑏𝑦) 𝛾 = 𝑓𝐚𝐛 𝑥, 𝑦 /𝑓𝐚𝐛(𝑐𝑥 , 𝑐𝑦) if 𝛼 > 0 and 𝛽 > 0 and 𝛾 > 0 𝐩color = 𝛼𝐚color + 𝛽𝐛color + 𝛾𝐜color 𝐩z = 𝛼𝐚z + 𝛽𝐛z + 𝛾𝐜z if 𝐩z < zbuffer[x,y] and 𝐩z < far_plane draw pixel at (x,y) with color 𝐩color zbuffer[x,y] = 𝐩z for all (x,y) zbuffer[x,y] = ∞ c b a Rasterizando Triângulo 231 for (x,y) in region 𝛼 = 𝑓𝐛𝐜 𝑥, 𝑦 /𝑓𝐛𝐜(𝑎𝑥 , 𝑎𝑦) 𝛽 = 𝑓𝐜𝐚 𝑥, 𝑦 /𝑓𝐜𝐚(𝑏𝑥 , 𝑏𝑦) 𝛾 = 𝑓𝐚𝐛 𝑥, 𝑦 /𝑓𝐚𝐛(𝑐𝑥 , 𝑐𝑦) if 𝛼 > 0 and 𝛽 > 0 and 𝛾 > 0 𝐩color = 𝛼𝐚color + 𝛽𝐛color + 𝛾𝐜color 𝐩z = 𝛼𝐚z + 𝛽𝐛z + 𝛾𝐜z if 𝐩z < zbuffer[x,y] and 𝐩z < far_plane draw pixel at (x,y) with color 𝐩color zbuffer[x,y] = 𝐩z for all (x,y) zbuffer[x,y] = ∞ c b a Perguntas?232
Compartilhar