Cartoon Rendering - PUC-Rio
Cartoon Rendering - PUC-Rio Cartoon Rendering - PUC-Rio
Jeronimo Silvério Venetillo 9924305 Introdução Cartoon Rendering Cartoon Rendering é um dos métodos estudados na área de renderização não fotorealísta. Renderização não fotorealísta é o nome dado à técnica de retratar modelos onde o resultado final não tem o compromisso de estar próximo à realidade, e sim de explorar estilos de desenho. As principais características do cartoon rendering são as silhuetas e arestas, que são destacadas do resto do desenho. Geralmente elas possuem cores que se destacam da cor original do desenho, e as silhuetas são mais espessas que as arestas. Além disso, são usados poucos tons de cores ( normalmente dois ) para simular iluminação. Enquanto a renderização comum tem sua base em leis físicas de iluminação, esta técnica se baseia na percepção humana e procura realçar pontos importantes para o entendimento do desenho. Objetivo O objetivo deste projeto é estudar maneiras de fazer este tipo de renderização em tempo real. Serão abordados neste trabalho os métodos de implementação das técnicas de detecção de silhueta, detecção de arestas vivas e iluminação. Silhueta Desenhos animados são bi-dimensionais em sua essência e o cartoon rendering explora algumas técnicas de desenho para mostrar um mundo bim-dimensional com profundidade. Uma dessas propriedades é a silhueta, que delimita os modelos e torna evidente quais deles estão em primeiro plano e quais não estão. Modelos em primeiro plano têm suas silhuetas completas, ou seja, não cortadas por nenhuma outra silhueta. Figura 1-a: Figura sem nenhuma delimitaçao, onde informações como forma e posição nao ficam evidentes. Figura 1-b: Tendo a silhueta, ficam evidentes as informações sobre numero de objetos, delimitação de suas formas e ordem espacial. Page 1 of 15
- Page 2 and 3: Jeronimo Silvério Venetillo 992430
- Page 4 and 5: Jeronimo Silvério Venetillo 992430
- Page 6 and 7: Jeronimo Silvério Venetillo 992430
- Page 8 and 9: Jeronimo Silvério Venetillo 992430
- Page 10 and 11: Jeronimo Silvério Venetillo 992430
- Page 12 and 13: Jeronimo Silvério Venetillo 992430
- Page 14 and 15: Jeronimo Silvério Venetillo 992430
Jeronimo Silvério Venetillo<br />
9924305<br />
Introdução<br />
<strong>Cartoon</strong> <strong>Rendering</strong><br />
<strong>Cartoon</strong> <strong>Rendering</strong> é um dos métodos estudados na área de renderização não<br />
fotorealísta. Renderização não fotorealísta é o nome dado à técnica de retratar modelos<br />
onde o resultado final não tem o compromisso de estar próximo à realidade, e sim de<br />
explorar estilos de desenho.<br />
As principais características do cartoon rendering são as silhuetas e arestas, que<br />
são destacadas do resto do desenho. Geralmente elas possuem cores que se destacam da<br />
cor original do desenho, e as silhuetas são mais espessas que as arestas. Além disso, são<br />
usados poucos tons de cores ( normalmente dois ) para simular iluminação.<br />
Enquanto a renderização comum tem sua base em leis físicas de iluminação, esta<br />
técnica se baseia na percepção humana e procura realçar pontos importantes para o<br />
entendimento do desenho.<br />
Objetivo<br />
O objetivo deste projeto é estudar maneiras de fazer este tipo de renderização em<br />
tempo real. Serão abordados neste trabalho os métodos de implementação das técnicas de<br />
detecção de silhueta, detecção de arestas vivas e iluminação.<br />
Silhueta<br />
Desenhos animados são bi-dimensionais em sua essência e o cartoon rendering<br />
explora algumas técnicas de desenho para mostrar um mundo bim-dimensional com<br />
profundidade. Uma dessas propriedades é a silhueta, que delimita os modelos e torna<br />
evidente quais deles estão em primeiro plano e quais não estão. Modelos em primeiro<br />
plano têm suas silhuetas completas, ou seja, não cortadas por nenhuma outra silhueta.<br />
Figura 1-a: Figura sem nenhuma delimitaçao,<br />
onde informações como forma e posição nao<br />
ficam evidentes.<br />
Figura 1-b: Tendo a silhueta, ficam evidentes as<br />
informações sobre numero de objetos, delimitação de suas<br />
formas e ordem espacial.<br />
Page 1 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Em um modelo poliédrico é chamado silhueta o conjunto de arestas que formam o<br />
contorno de um objeto, para um dado observador. As arestas que compõem este conjunto<br />
são compartilhadas por uma face que aponta para o observador (frontface) e uma face que<br />
aponta a direção oposta ao observador (backface).<br />
Para fazer a detecção de silhueta, apresentaremos os seguintes metodos:<br />
• Força Bruta<br />
Para cada aresta, calculamos o produto escalar entre as normais das faces vizinhas<br />
a aresta e multiplicamos os dois resultados. Caso tenhamos um número menor que<br />
zero, esta aresta é uma silhueta.<br />
• Utilização de estrutura de dados que explore vizinhança entre arestas.<br />
Tendo a informação de quais os vertices que compõe o modelo, podemos em preprocessamento,<br />
criar uma estrutura topologica que contenha para cada aresta, quais os<br />
vertices e faces associados a ela, além de quais arestas são suas vizinhas. Com isso,<br />
aplicamos o método força bruta até encontrarmos uma aresta que faça parte da<br />
silhueta, depois percorreremos apenas as arestas vizinhas a ela para descobrir toda a<br />
silhueta ( válido para modelos convexos ).<br />
• Descontinuidade no Z-Buffer ( processamento de imagem ), aplicando textura<br />
projetiva. ( Philippe Decaudin - Research Report INRIA #2919 )<br />
Silhuetas correspondem a uma descontinuidade de ordem zero no z-buffer.<br />
Aplicando um filtro de detecção de contorno, conseguimos extrair uma imagem que<br />
vale um em todos os lugares, exceto onde uma descontinuidade foi encontrada.<br />
Multiplicamos esta imagem pela imagem original para ter uma imagem com silhueta.<br />
• Environment Map<br />
Criamos um environment map com as bordas pretas, para que as faces com as<br />
normais perpendiculares ao observador fiquem com a cor preta. ( Bruce Gooch &<br />
Amy Ashurst Gooch – SIGGRAPH 99 )<br />
• Edge-Buffer ( John W. Buchanan – EA Canada )<br />
Ver apendice A.<br />
• CullFace e PolygonOffeset ( Bruce Gooch & Amy Ashurst Gooch – SIGGRAPH<br />
99 )<br />
Esta técnica utiliza o hardware para encontrar as silhuetas. Desenhamos o modelo<br />
normal com o polygonOffset ativado. Ativamos o frontFace culling, selecionamos o<br />
modo de desenho de backFace com linhas, trocamos a função de depth test para<br />
LEQUAL e desenhamos novamente o modelo.<br />
Arestas Vivas<br />
O conjunto de arestas é um outro elemento que ajuda a percepção de<br />
profundidade num desenho. Elas indicam mudanças abruptas na direção normal das faces<br />
do modelo.<br />
Page 2 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Figure 1: O mesmo modelo com e sem a informação de suas arestas. Enquanto a silhueta so nos<br />
fornece a delimitação dos objetos ( relação objeto – mundo ), as arestas nos fornecem mais de seus<br />
conteudos ( relação objeto – objeto ).<br />
Arestas vivas são arestas onde o ângulo existente entre as duas faces adjacentes é<br />
menor que um limite minimo ou maior que um limite maximo.<br />
Para fazermos a detecção de arestas vivas, temos os seguintes métodos:<br />
• Descontinuidade do mapa de normais ( processamento de imagem ). Usando<br />
textura projetiva. ( Philippe Decaudin - Research Report INRIA #2919 )<br />
Mesmo método aplicado para encontrar silhuetas, porém a análise é feita no mapa<br />
de normais, e não no mapa de profundidade.<br />
• Como as arestas vivas independem do observador, elas podem ser detectadas em<br />
tempo de pre-processamento. Usando o pre-processamento, temos os seguintes<br />
metodos:<br />
o Edge-Buffer ( John W. Buchanan – EA Canada )<br />
Ver Apendice A.<br />
o PolygonOffset e DrawLines<br />
Esta técnica utiliza o hardware para desenhar as arestas. Desenhamos o<br />
modelo com o polygonOffset ativado, mudamos a função do depth test<br />
para LEQUAL e renderizamos as linhas calculadas em pré-processamento.<br />
<strong>Cartoon</strong> Shading ( Cel-Shading )<br />
Esta técnica, ao contrario das outras duas, tem como objetivo dar um aspecto bidimensional<br />
ao desenho. Mudamos o modelo de iluminação tradicional ( Phong ) para um<br />
modelo mais simplificado, onde uma única cor sólida é usada para descrever um material.<br />
Com isso, perde-se a noção de profundidade que a iluminação tradicional nos dá.<br />
Para continuarmos tendo a percepção de que existem partes do modelo iluminadas<br />
e partes não-iluminadas, a cor que define o material é escurecida para que simule a parte<br />
do modelo que está em “sombra”.<br />
Para calcularmos estas cores, seguimos a seguinte equação:<br />
CSombra = GlobalAmbiente x MaterialAmbiente + LuzAmbiente x MaterialAmbiente<br />
CIluminada = CSombra + LuzDifusa x MaterialDifusa<br />
Page 3 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Para calcularmos qual das duas cores será atribuída a um determinado vértice,<br />
fazemos o produto escalar entre a normal do vértice e o vetor normalizado que vai do<br />
vertice a fonte de luz. Caso este valor seja maior que um determinado valor ( 0.5 por<br />
exemplo ) este vertice está iluminado e usarmos como cor CIluminada caso contrário este<br />
vértice está em sombra, e usaremos CSombra.<br />
Em termos de implementação, foi criado em pre-processamento uma textura 1D<br />
com um dos extremos tendo o valor CSombra e o outro extremo tendo o valor CIluminado, e<br />
uma pequena região de transição, para que a quebra entre a região iluminada e a região<br />
escura não fosse muito abrupta. As coordenadas de textura de cada vértice são calculadas<br />
como o máximo entre zero e o produto escalar entre a normal do vértice e o vetor<br />
normalizado que vai do vértice à fonte de luz.<br />
Figure 2<br />
Figura da direita – Iluminação convencional X <strong>Cartoon</strong> Shade – Figura da esquerda<br />
São destacadas as perdas de informação que se tem com o cartoon Shade e também a mudança mais abrupta dos tons.<br />
Implementação<br />
As implementações foram feitas na plataforma Windows, usando recursos de<br />
OpenGL e desenvolvidas usando Microsoft Visual Studio .NET.<br />
• 1ª Implementação<br />
A idéia orginal da implementação era criar uma biblioteca genérica que pudesse<br />
renderizar cenas no estilo cartoon. Para isso escolhemos os algoritmos de CullFace e<br />
PolygonOffset para silhueta, PolygonOffset e DrawLines para arestas e o método de<br />
textura 1D para o cartoon Shade. Nesta implementação foram criadas três classes:<br />
- <strong>Cartoon</strong>: Contém métodos de inicialização da biblioteca e métodos de controle<br />
de renderização, como se os modelos terão ou não silhueta, arestas, etc.<br />
- <strong>Cartoon</strong>Shade: Cria a textura do cartoonShade, faz a gerencia desta textura junto<br />
ao OpenGL e fornece informações sobre as coordenadas de textura.<br />
- <strong>Cartoon</strong>Mesh: Malha que será desenhada no estilo cartoon. Criada a partir da<br />
informação sobre vértices, normais e numero de triangulos. Existem métodos que dão<br />
Page 4 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
opções de como a malha será desenhada, métodos de carregamento, descarregamento e<br />
desenho.<br />
Com este tipo de implementação, temos muita flexibilidade na criação de cenas,<br />
já que cada malha pode ter sua propria opção de desenho e a malha que será desenhada<br />
em cartoon é independente do resto da cena.<br />
Figure 3<br />
Modelo em cartoon ( jipe ) junto com um modelo “real” ( sofá ).<br />
• 2ª Implementação<br />
Depois de implementar a biblioteca, notamos que da maneira que estávamos<br />
fazendo a transformação de um modelo real em cartoon, poderíamos também construir<br />
uma estratégia de rendering.<br />
Foi criada então a classe cartoonStrategy, que é uma estratégia de rendering para a<br />
VIS ( grafo de cena – TecGraf ).<br />
Desta maneira, o criador da cena perde um pouco a sua flexibilidade na criação, já<br />
que agora as informações não estão associadas a cada malha, mas sim à estrategia.<br />
Porém, as informações que precisavam ser fornecidas já são inerentes à cena, logo tudo<br />
que é preciso para desenhar a cena em cartoon é chamar a estratégia de renderização<br />
apropriada, da mesma maneira que a estratégia de renderização comum era chamada.<br />
Resultados<br />
O grande problema apresentado por este tipo de renderização é o desempenho.<br />
Para fazer a renderização completa da cena, faz-se o desenho do modelo com cartoon<br />
Shade, e para isso, necessitamos da posição da luz em relação ao objeto, o que nos leva a<br />
fazer contas para transformar a posição da luz em seu espaço local para o espaço do<br />
objeto. A partir disso, recalcula-se o vetor com as coordenadas de textura. O segundo<br />
passo é desenhar a silhueta, que faz com que o modelo seja mais uma vez passado para o<br />
pipeline de renderização, desta vez com culling de frontFace e modo de desenho de<br />
linhas. O terceiro passo é desenhar as arestas, que foram calculadas em preprocessamento.<br />
Apesar da terceira passada ser geralmente uma passada com um número bem<br />
reduzido de vértices em relação ao modelo original, continuamos tendo uma estrategia de<br />
Page 5 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
três passadas de rendering, e duas delas sendo desenhadas com linhas, o que não tem um<br />
desempenho muito bom no OpenGL.<br />
Em termos de resultados visuais, o cartoon rendering melhora a compreensão de<br />
alguns modelos, principalmente naqueles em que o nível de detalhes é muito grande, e<br />
tira a sensação de estar vendo um “modelo plástico”. O ganho visual para modelos com<br />
textura não foi muito grande.<br />
Screenshots<br />
Temos à esquerda os modelos desenhados da forma convencional, e a direita<br />
desenhados em cartoon.<br />
Page 6 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Page 7 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Page 8 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Conclusão<br />
A técnica de cartoon rendering se mostrou muito positiva em termos de resultados<br />
visuais. Enquanto na maneira de renderização convencional o espectador nota erros, seja<br />
pela plásticidade dos modelos ou pela “perfeição” da cena, na renderização por cartoon o<br />
observador não se sente enganado pela visualização, pois ele “sabe” que não está vendo<br />
algo “real”.<br />
Em termos de desempenho, esta técnica ainda se mostra ruim ao considerarmos<br />
modelos muito grandes. Algumas otimizações foram feitas em relação aos cálculos em<br />
CPU ( passar a posição global da luz para o modelo e só transformar para o espaço local<br />
se ele ou a luz tiverem mudado e só recalcular o vetor de coordenadas de textura caso<br />
isso ocorresse ), mas nada que impactasse numa grande mudança de desempenho.<br />
Page 9 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Apendice A<br />
Edge-Buffer<br />
A idéia do edge buffer é guardar em uma tabela as informações de arestas e a qual<br />
tipo de face ela esta associada. Para o poligono abaixo, teriamos a seguinte tabela<br />
antes da renderização:<br />
V – Another Vertex<br />
B – Backface<br />
F – Frontface<br />
Esta tabela nos dá apenas a informação da estrutura do objeto. Durante a<br />
renderização por poligonos, faremos uma operacao XOR com o byte B caso a face do<br />
poligono seja uma backface ou uma operacao XOR com o byte F caso a face do<br />
poligono seja uma frontface.<br />
Caso a face F(1,2,3) seja desenhada primeiro, teriamos como tabela.<br />
Vertex VFB VFB VFB VFB<br />
1 210 310 400 500<br />
2 310 500 x00 x00<br />
3 400 500 x00 x00<br />
4 500 x00 x00 x00<br />
5 x00 x00 x00 x00<br />
Depois a face F(1,3,4)<br />
Vertex VFB VFB VFB VFB<br />
1 210 300 410 500<br />
2 310 500 x00 x00<br />
3 410 500 x00 x00<br />
4 500 x00 x00 x00<br />
5 x00 x00 x00 x00<br />
Vertex VFB VFB VFB VFB<br />
1 200 300 400 500<br />
2 300 500 x00 x00<br />
3 400 500 x00 x00<br />
4 500 x00 x00 x00<br />
5 x00 x00 x00 x00<br />
Page 10 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Depois a face F(1,4,5)<br />
Vertex VFB VFB VFB VFB<br />
1 210 300 411 501<br />
2 310 500 x00 x00<br />
3 410 500 x00 x00<br />
4 501 x00 x00 x00<br />
5 x00 x00 x00 x00<br />
Todas outras faces...<br />
Vertex VFB VFB VFB VFB<br />
1 211 300 411 500<br />
2 311 500 x00 x00<br />
3 411 500 x00 x00<br />
4 500 x00 x00 x00<br />
5 x00 x00 x00 x00<br />
A silhueta é formada pelas arestas em negrito. Ou seja, as arestas que terminam o<br />
procedimento com os bits Front e Back acesos. Agora fazemos uma segunda passada<br />
de rendering para desenharmos as arestas detectadas.<br />
Para podermos renderizar a silhueta de uma caixa aberta usando esta técnica,<br />
teriamos a seguinte tabela:<br />
O que geraria a seguinte silhueta:<br />
Vertex VFB VFB VFB<br />
1 211 410 501<br />
2 311 800 x00<br />
3 400 711 x00<br />
4 610 x00 x00<br />
5 601 800 x00<br />
6 711 x00 x00<br />
7 800 x00 x00<br />
8 x00 x00 x00<br />
Page 11 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Caso consideremos todas as arestas que FB != 00, que são as arestas onde não<br />
existem duas faces apontando para a mesma direção, termos uma silhueta de objetos<br />
abertos.<br />
Vertex VFB VFB VFB<br />
1 211 410 501<br />
2 311 800 x00<br />
3 400 711 x00<br />
4 610 x00 x00<br />
5 601 800 x00<br />
6 711 x00 x00<br />
7 800 x00 x00<br />
8 x00 x00 x00<br />
Para permitir que as arestas também sejam desenhadas, cria-se mais um bit que é<br />
setado em pre-processamento, e sempre que este bit for igual a 1, a aresta é desenhada.<br />
Page 12 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Apendice B<br />
Manual do Usuário<br />
Os programas suportam somente modelos 3ds.<br />
- Implementacao 1 - Lib<br />
Para iniciar o programa:<br />
cartoonLib.exe [modelo1 path_texturas1] [modelo2 path_texturas2] ...<br />
Caso nenhum modelo seja passado como parametro, modelos default serao carregados<br />
Comandos:<br />
Camera VGL -> Verificar documentacao em:<br />
http://www.tecgraf.puc-rio.br/~fabraham/vgl/manualusuario.html<br />
'm' Troca o modelo caso haja mais de um modelo carregado.<br />
'4' Move fonte de luz para direita<br />
'6' Move fonte de luz para esquerda<br />
'8' Move fonte de luz para frente<br />
'5' Move fonte de luz para tras<br />
'9' Move fonte de luz para cima<br />
'3' Move fonte de luz para baixo<br />
't' Habilita/desabilita textura<br />
'b' Habilita/desabilita borda ( silhueta )<br />
'c' Habilita/desabilita arestas<br />
'l' Habilita/desabilita iluminacao ( cartoon Shade )<br />
esc -> Sai<br />
Page 13 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
- Implementacao 2 - Strategy<br />
Para iniciar o programa<br />
cartoonStrategy.exe [modelo1 path_texturas1] [modelo2 path_texturas2] ...<br />
Caso nenhum modelo seja passado como parametro, modelos default serao carregados<br />
Comandos:<br />
Camera VGL -> Verificar documentacao em:<br />
http://www.tecgraf.puc-rio.br/~fabraham/vgl/manualusuario.html<br />
'k' Habilita/desabilita estrategia de cartoon<br />
'.' Aumenta Intensidade da fonte de luz (efeito nos modelos reais)<br />
',' Diminui Intensidade da fonte de luz (efeito nos modelos reais)<br />
'm' Troca o modelo caso haja mais de um modelo carregado.<br />
'4' Move fonte de luz para direita<br />
'6' Move fonte de luz para esquerda<br />
'8' Move fonte de luz para frente<br />
'5' Move fonte de luz para tras<br />
'9' Move fonte de luz para cima<br />
'3' Move fonte de luz para baixo<br />
't' Habilita/desabilita textura<br />
'b' Habilita/desabilita borda ( silhueta )<br />
'c' Habilita/desabilita arestas<br />
'l' Habilita/desabilita iluminacao e cartoon Shade.<br />
esc Sai<br />
Page 14 of 15
Jeronimo Silvério Venetillo<br />
9924305<br />
Referencias<br />
• Johan Claes, Fabian Di Fiore, Gert Vansichem, Frank Van Reeth – Fast 3D<br />
<strong>Cartoon</strong> <strong>Rendering</strong> with Improved Quality by Exploiting Graphics<br />
Hardware – Image and Vision Computing – 2001<br />
• Philippe Decaudin – <strong>Cartoon</strong>-Looking <strong>Rendering</strong> of 3D-Scenes – INRIA#2919<br />
– Junho/1996<br />
• Adam Lake, Carl Marshall, Mark Harris’, Marc Blackstein – Stylized <strong>Rendering</strong><br />
Techniques for Scalable Real-Time 3D Animation – Proceedings of NPAR –<br />
2000<br />
• Non-Photorealistic <strong>Rendering</strong> – SIGGRAPH 99 Course 17<br />
• Lee Markosian, Michael A. Kowalski, Samuel J. Trychin, Lubomir D. Bourdev,<br />
Daniel Goldstein, John F. Hughes – Real-Time Nonphotorealistic <strong>Rendering</strong> –<br />
Computer Graphics (Proceedings of SIGGRAPH '97) – Agosto/1997<br />
• John W. Buchanan, Mario C. Souza – The edge buffer: A data structure for<br />
easy silhouette rendering – Proceedings of NPAR – 2000<br />
• Carl S. Marshall – Non-Photorealistic <strong>Rendering</strong> (NPR) Real-time 3D <strong>Cartoon</strong><br />
Animation – Game Developers Conference – 2000<br />
• Aaron Hertzmann – Introduction to 3D Non-Photorealistic <strong>Rendering</strong>:<br />
Silhouettes and Outlines – SIGGRAPH '99 Course on Non-Photorealistic<br />
<strong>Rendering</strong> – Agosto/1999<br />
• Jeff Lander – Under the Shade of the <strong>Rendering</strong> Tree – Game Developer<br />
Magazine – fevereiro/2000<br />
• Jeff Lander – Shades of Disney: Opaquing a 3D World – Game Developer<br />
Magazine – março/2000<br />
Page 15 of 15