Cartoon Rendering - PUC-Rio

Cartoon Rendering - PUC-Rio Cartoon Rendering - PUC-Rio

di.inf.puc.rio.br
from di.inf.puc.rio.br More from this publisher
14.04.2013 Views

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

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!