Modelagem, Animação e Rendering de Nuvens utilizando Visualização Volumétrica João Luis Prauchner, Carlos A. Dietrich, Luciana P. Nedel, Carla M. D. S. Freitas Instituto de Informática, Universidade Federal do Rio Grande do Sul (UFRGS) Caixa Postal 15.064 – 91.501-970 – Porto Alegre – RS – Brasil {jlprauchner,cadietrich,nedel,carla}@inf.ufrgs.br Abstract. Graphical applications such as flight simulators and games often use clouds modeling and rendering to improve the realism of scenes. Traditional approaches employ a technique known as environment mapping to simulate clouds on the sky. This work presents two approaches to simulate 3D clouds in real time using programmable graphics hardware. Resumo. Aplicações gráficas tais como simuladores de vôo e jogos utilizam técnicas de modelagem e “rendering” de nuvens para tornar os ambientes mais realistas. Abordagens tradicionais empregam a técnica conhecida como “environment mapping” para criar a ilusão de um céu com nuvens. Este trabalho apresenta duas abordagens para simular nuvens tridimensionais em tempo real, utilizando hardware gráfico programável. 1. Introdução Nuvens são parte integrante do céu e sua ausência em uma cena gerada sinteticamente pode prejudicar o realismo da mesma [Harris 2001], pois mesmo um olho não treinado consegue julgar corretamente o realismo de um modelo sintético de nuvens. Aplicações gráficas com ambientes virtuais como jogos e simuladores de vôo freqüentemente exibem cenas ao ar livre, as quais necessitam de um céu com nuvens. A modelagem realista de nuvens também é utilizada na visualização meteorológica, visto que trata de um fenômeno natural e amorfo. Segundo Ebert (1994), as nuvens possuem um conjunto de características visuais facilmente identificáveis e que, quando modeladas adequadamente, produzem melhores resultados em imagens e animações. A primeira delas é sua estrutura volumétrica, correspondendo a partículas num espaço tridimensional, e amorfa, possuindo detalhes em várias escalas e posições. A segunda característica é relacionada ao processo de formação da nuvem, cujas partículas de água passam por momentos de turbulência e agitação, o que produz os padrões comuns às nuvens e sua evolução ao longo do tempo. Finalmente, existem diversos modelos de iluminação e tonalização que devem ser adequadamente utilizados para que as imagens produzidas sejam convincentes, já que nuvens são compostas de partículas de gelo e água que absorvem, refletem e espalham luz. A técnica de síntese de imagens de nuvens mais tradicional é o mapeamento de texturas 2D, representando o céu nublado em um ou mais planos de fundo ou em uma grande redoma. Esses planos são dispostos suficientemente longe do observador de modo a criar a ilusão de um céu verdadeiro. No entanto, apenas o uso dessa técnica (conhecida como environment mapping, ou mapeamento de ambiente [Watt 2000]) não permite que vários efeitos desejados sejam alcançados [Harris 2001]. Por exemplo, num simulador de vôo, não haveria a possibilidade do observador atravessar nuvens tridimensionais, podendo ver outros objetos encobertos (parcial ou totalmente) por elas. A característica dinâmica das nuvens é outro fator a ser levado em conta, já que as mesmas assumem formas diversas e se movimentam ao longo do tempo. Soma-se a isso os processos físicos de iluminação sofridos pelas nuvens, os quais produzem diversos efeitos visuais (Figura 1). Dessa forma, para se obter melhores resultados fazse necessário o uso de abordagens baseadas em nuvens volumétricas, ou seja, em objetos tridimensionais com volume. Tais técnicas têm, entretanto, um custo elevado em termos de memória e processamento. Assim, aliado ao uso de APIs gráficas tradicionais como a OpenGL, o uso do hardware gráfico programável vem ganhando destaque como auxílio no processamento de cenas com nuvens volumétricas em tempo real [Harris 2002]. (a) (b) Figura 1. Imagens de nuvens reais [Illinois 2002]. Predominância de nuvens do tipo cumulus (baixas e médias altitudes, em torno de 2000 a 6000 metros). O objetivo deste trabalho é investigar as técnicas atuais para a modelagem, animação e rendering de nuvens 3D, implementando o método mais adequado para aplicações em tempo real de nuvens dinâmicas. O restante do trabalho é organizado como segue. A Seção 2 revisa as técnicas atuais para simulação de nuvens, enquanto a Seção 3 descreve o método implementado e a Seção 4 apresenta os resultados obtidos. Na Seção 5 são apresentadas conclusões e discutida a continuidade do trabalho. 2. Técnicas de Simulação de Nuvens Existem diversas técnicas para a modelagem e simulação de nuvens, sendo que podem ser classificadas em técnicas baseadas em Física e métodos procedurais [Spochk 2003, Dobashi 2000). As técnicas baseadas em Física tentam simular os processos meteorológicos que criam nuvens e a interação entre a luz e as partículas que formam as nuvens. Já os métodos procedurais são baseados na geração dos padrões visuais das nuvens, sem simular os processos físicos envolvidos. Estas técnicas normalmente utilizam algum tipo de padrão irregular como o ruído de Perlin (1985, 2002), ou alguma combinação de funções que gere algum padrão que pareça irregular como o método de Gardner (1985). 2.1. Simulação baseada em Física A forma assumida pelas nuvens ao longo do tempo depende principalmente das condições ambientais onde as mesmas são formadas, tais como o movimento do ar, a temperatura e a umidade [Miyazaki 2001]. Pesquisadores vêm desenvolvendo técnicas capazes de simular a dinâmica de fluidos envolvida na formação e no movimento das nuvens, assim como de outros gases. Tais simulações levam em conta parâmetros como interação da temperatura, do vento e da umidade em cada partícula para modelar diversas classes de nuvens. Um exemplo importante dessa classe de técnica foi desenvolvido por Dobashi (2000) que utilizou autômatos celulares representados como células em uma grade retilínea 3D. A evolução das nuvens é simulada pela aplicação de regras de transição no estado dos autômatos a cada instante de tempo ti. As regras de transição representam a formação, extinção e movimentação pelo vento, utilizando o estado da vizinhança de cada célula. A principal vantagem das abordagens baseadas em Física é o realismo da animação. O método de Dobashi foi pioneiro na exibição de volumes de luz (shafts of light) entre as nuvens, com bons resultados em cenas ensolaradas. No entanto, a taxa de exibição de 30 segundos por quadro obtida por essa técnica não a torna apropriada para o rendering interativo [Schpok 2003]. Entretanto, o uso de simplificações matemáticas pode ser aliado aos recursos do hardware gráfico programável para melhorar o desempenho das simulações [Stam 1999]. 2.2. Geração procedural As abordagens procedurais para geração de nuvens tentam reproduzir a forma da nuvem através de primitivas matemáticas ou heurísticas, sem se preocupar com os processos físicos envolvidos. Dentre essas abordagens, podemos citar funções volumétricas implícitas [Ebert 1994], fractais, síntese de Fourier e ruído [Perlin 1985] para criar a estrutura básica das nuvens. Essas técnicas têm como vantagem a simplicidade na implementação quando comparadas às técnicas baseadas em Física, além de apresentarem desempenho superior, já que não exigem muitos cálculos complexos. A desvantagem é o processo de ajuste dos parâmetros para as heurísticas matemáticas que formarão as nuvens. Esse processo geralmente não é muito intuitivo, consistindo de etapas de tentativa e erro para se produzir imagens e animações realistas. Um dos métodos clássicos de geração de texturas procedurais é o ruído de Perlin (Perlin noise) (1985, 2002). Texturas procedurais 2D ou 3D são texturas geradas por um procedimento matemático que tenta imitar o comportamento natural de certos fenômenos naturais. A idéia básica do ruído de Perlin é a combinação de números pseudo-aleatórios (ruídos) de diferentes frequências e amplitudes, como mostra a Figura 2 através de um exemplo 1D. Figura 2. Sinais ou funções de diferentes freqüências e amplitudes. A combinação resultante mantém características das funções de entrada. Muitas abordagens utilizam elipsóides volumétricos para modelar inicialmente a nuvem, adicionando, depois, os detalhes proceduralmente [Elinas 2001, Ebert 1994]. Entre estas encontra-se o sistema desenvolvido por Schpok (2003) para modelagem, animação e rendering de nuvens proceduralmente. O sistema possui uma interface gráfica, a qual permite que artistas simulem diversos tipos de nuvens ajustando parâmetros de alto nível, como o tipo da nuvem. 2.3. Rendering de nuvens A simulação baseada em Física ou a geração procedural fornece como resultado um volume de dados, partículas ou densidades, representando as nuvens [Táxen 1999]. De posse desse volume de dados, o processo de rendering consiste em transformar os valores de cada elemento de dado em valores de cor (RGB, por exemplo), passando-os ao frame-buffer. Para isso, faz-se necessária a tonalização (shading) e a combinação (blending) para gerar a cor final dos pixels correspondentes às nuvens, juntamente com o restante da cena. Segundo Liao (2002), o maior desafio do rendering de nuvens é obter imagens com qualidade fotorrealística. Para isso, o modelo de iluminação deve aproximar os processos físicos envolvidos na interação da luz com as partículas das nuvens, aproximando portanto, os processos de espalhamento (scattering ou dispersão) e absorção de luz, considerando também sombras. A dispersão da luz pode ser simples ou múltipla. A dispersão simples simula a reflexão da luz através do meio (i.e., as partículas das nuvens) em uma única direção, geralmente a direção de observação. Já a dispersão múltipla se dá em todas as direções (ou em uma amostragem destas), é mais complexa e custosa de calcular, mas é mais correta no que diz respeito aos cálculos físicos. Uma técnica interessante nessa linha é adotada por Harris (2001) e se concentra em produzir nuvens estáticas para utilização em simuladores de vôo e jogos. Esta técnica assume que as partículas das nuvens são estáticas, ou seja, não é abordado o problema da animação. Em uma etapa de pré-processamento, o método de Harris calcula a quantidade de luz incidente em cada partícula P, utilizando uma aproximação do processo de espalhamento da luz, visto que o cálculo leva em conta um subconjunto pequeno de direções possíveis de raios, em volta da direção da luz. Os valores de iluminação calculados são então armazenados e utilizados no rendering e shading da cena, executada em tempo real. Para o rendering das partículas na cena são usados impostores ou billboards, gerados dinamicamente. Billboards são polígonos semitransparentes, renderizados geralmente de acordo com a posição da câmera. Impostores são freqüentemente utilizados em jogos a fim de simplificar o rendering de objetos complexos (como plantas, por exemplo), aumentando assim o desempenho na geração das cenas. Posteriormente, o método de Harris foi estendido por Wang (2003), onde artistas modelam em torno de 12 diferentes tipos de nuvens através de uma interface especialmente desenvolvida. Assim como no método de Harris, o rendering é feito através de billboards, nesse caso estáticos e dispostos em volta do observador. 3. Técnica Desenvolvida Este trabalho propõe a implementação de técnicas para as 3 classes de diferentes problemas mencionados anteriormente quando do rendering de nuvens. Esta seção aborda com detalhes os problemas enfrentados e as soluções utilizadas. 3.1. Modelagem Na modelagem, as técnicas que tentam aproximar a forma e o comportamento das nuvens através de modelos físicos podem produzir resultados mais realistas. No entanto, o custo computacional muitas vezes é proibitivo para aplicações em tempo real. Neste trabalho são utilizadas abordagens procedurais, que normalmente apresentam melhor performance e são mais simples de implementar, porém demandam ajustes finos em parâmetros para produzir bons resultados. Além disso, com a geração procedural, o usuário não fica restrito às leis da Física. É importante notar a independência entre a modelagem, a animação e o rendering de nuvens. Isso porque é possível modelá-las utilizando uma técnica procedural, por exemplo, e gerar as imagens utilizando simulação de processos óticos. A técnica desenvolvida envolve a utilização do ruído de Perlin para a modelagem das nuvens. Utilizando a API gráfica OpenGL, a nuvem volumétrica é representada como uma textura 3D que pode ser entendida como um conjunto de imagens (fatias) 2D. A textura 3D contém um total de n elementos (voxels), sendo n o produto do número de fatias, número de linhas e número de colunas (n = nfatias * nlinhas * ncolunas). Cada fatia é gerada proceduralmente através de ruído, como ilustrado na Figura 3. O ruído de Perlin possui a característica de, dado um mesmo parâmetro que o controla, gerar sempre um mesmo número. Na geração das fatias, são utilizadas as coordenadas 3D de cada voxel como parâmetro de entrada para a função de ruído. Parâmetros adicionais são utilizados para controlar o processo, como o número de oitavas de ruído diferentes, além de um fator de escala da amplitude do sinal. Figura 3. Processo de modelagem da nuvem 3D. O valor de cada voxel é resultado da função Perlin3D. A escolha arbitrária para esses parâmetros é uma desvantagem desse método. No entanto ele é capaz de gerar resultados convincentes sem a complexidade de implementação intrínseca de abordagens baseadas em Física. A solução proposta neste trabalho inicialmente gera de forma procedural duas (ou mais) texturas 3D que serão utilizadas nos próximos estágios, discutidos nas seções a seguir. 3.2. Rendering Para o rendering, inicialmente foi utilizada a técnica tradicional de visualização direta de volumes utilizando uma geometria de amostragem baseada em planos ortogonais à direção de observação [Gelder 1996]. Esses planos são polígonos que amostram as coordenadas das texturas 3D, interpoladas na rasterização (Figura 4). Com a crescente capacidade das placas gráficas atuais, é possível desenvolver aplicações interativas utilizando rendering direto de volumes, e dessa forma, gerar imagens mais realistas. No entanto, o desempenho nessa abordagem é afetado principalmente pela resolução da textura 3D e pela quantidade de planos de amostragem utilizados. O algoritmo utilizado para a geração dos planos de amostragem é denominado WSG (Weighted Sweep Graph), e foi desenvolvido por Dietrich et al. (2004). Após a rasterização, os planos resultam em fragmentos (candidatos a pixels). Para cada fragmento, um programa de fragmento é executado no processador gráfico da placa (GPU), buscando o valor correspondente na textura 3D. A combinação deste valores de trás para frente (blending) é responsável pela composição dos fragmentos e geração da imagem resultante. Figura 4. Processo de rendering da nuvem 3D. O pipeline é similar ao utlizado na visualização volumétrica direta. Apesar dessa técnica gerar imagens de boa qualidade (Figura 5), uma vez que considera todos (ou a maioria) os voxels da textura 3D que representa a nuvem, o excessivo número de fragmentos gerados impacta no desempenho da simulação. Uma alternativa para a solução desse problema é a redução das fatias de amostragem da textura. No entanto, com poucas fatias, os intervalos entre elas se tornam maiores e é possível enxergá-los, o que reduz o realismo da simulação. Figura 5. Imagens geradas utilizando a abordagem de slicing da textura 3D A fim de diminuir a taxa de exibição de quadros na animação, buscando taxas mais interativas, foi implementada uma técnica adicional de rendering, que apresentou uma melhora considerável no desempenho, além de permitir a exibição de uma quantidade maior de nuvens na cena. Essa técnica utiliza impostores ou billboards como geometria de amostragem para a textura 3D. Os impostores são renderizados no espaço de tela, de acordo com a direção de visualização, e são paralelos entre si, como ilustra a Figura 6. Ao contrário da abordagem de Harris (2001), os impostores não são gerados dinamicamente; no entanto, poucos deles (em torno de 3) são suficientes para gerar imagens de qualidade, e ainda assim possibilitar a imersão nas mesmas. Da mesma forma que na abordagem baseada em fatias, os billboards passam o estágio de rasterização e os fragmentos gerados buscam sua cor na textura 3D e são combinados também de trás para frente. Figura 6. Processo de rendering da nuvem através de impostores renderizados no espaço de tela. A mudança na direção de visualização resulta na atualização (redesenho) dos mesmos. 3.3. Animação Para a animação das nuvens ao longo do tempo, foi escolhida a técnica conhecida como morphing ou transformação [Lerios 1995] ao invés da simulação Física. Essa técnica foi utilizada anteriormente para combinar dois objetos representados por dados volumétricos. No entanto, não havia sido aplicada para a animação de nuvens. Neste trabalho a técnica de morphing entre duas texturas 3D é implementada utilizando os recursos do hardware gráfico programável, responsável pelo cálculo da animação. Como o foco do trabalho são as aplicações em tempo real e as abordagens de utilizam o hardware normalmente possuem uma performance superior às implementadas em software, decidiu-se implementar a animação das nuvens como um programa de fragmentos executado na GPU. Foi utilizada a linguagem CG (C for Graphics) para a implementação do programa de fragmentos. Dessa forma, são utilizadas as extensões ao OpenGL correspondentes aos programas de vértice e de fragmento (vertex e fragment program). O morphing entre duas ou mais nuvens (uma representando a nuvem inicial e a outra, a final) é executado através de um fragment program, como mostra a Figura 7, para cada fragmento gerado. O morphing, então, funciona da seguinte forma. É escolhida a nuvem inicial e a final. A nuvem em um instante de tempo t é o resultado da interpolação linear entre as nuvens inicial e final, cuja forma é: corResultante(t) = (1-t) * corNuvemInicial + corNuvemFinal * t Ou seja, o fragmento utiliza suas coordenadas e textura para buscar o valor de cor em ambas as texturas, e com base em t calcula o valor final a ser escrito no frame-buffer. Quando t = 0, a nuvem resultante é igual à inicial; quando t = 1, a resultante é a nuvem final. É especificado também um incremento para t, que controla a velocidade do morphing entre as nuvens. 4. Resultados Os testes foram realizados em um PC com processador Pentium III com 1GHz de clock, 512 MB de memória e placa gráfica GeForce FX 5200. Foi implementado um ambiente em OpenGL representando uma cena ao ar livre. As nuvens 3D foram então adicionadas à cena (Figura 8). A animação foi executada a uma taxa média de 19 quadros por segundo, utilizando de 3 a 6 impostores para o rendering. As Figuras 9 e 10 também ilustram a utilização dos billboards na cena. Figura 7. Processo de rendering e morphing da nuvem 3D. A função lerp calcula a cor final do fragmento com base nas texturas A e B. Figura 8. As imagens da esquerda (superior e inferior) representam cenas sem nuvens. Nas da direita foram acrescentadas nuvens renderizadas através de billboards. Em relação à técnica de visualização volumétrica através de fatias, foi obtida uma taxa entre 3 e 30 quadros por segundo, dependendo do número de fatias geradas. Com um número grande de fatias (em torno de 1000), o resultado visual foi semelhante ao obtido com os impostores, no entanto o desempenho foi consideravelmente melhor. Isso porque os impostores geram muito menos fragmentos e a combinação (blending) dos mesmos é uma operação custosa. Em ambos os casos o morphing foi utilizado para a animação, sem apresentar quedas no desempenho global. Para as texturas 3D, foram utilizados volumes cujas dimensões variaram de 323 até 2563. Tais dimensões resultam em nuvens com maior ou menor resolução, porém são limitadas pelo tamanho da memória da placa gráfica onde são armazenadas. Através do ajuste na função de ruído, foram modelados diferentes tipos de nuvens, desde as mais suaves às mais irregulares. Os resultados dos testes de desempenho realizados são ilustrados na Figura 11. (a) (b) Figura 9. (a) Estágio inicial da animação (morphing), onde o parâmetro t é próximo de zero. (b) Estágio intermediário/final da animação, onde t é próximo de 0.8. Figura 10. Diferentes tipos de nuvens obtidas através da alteração dos parâmetros da função de ruído. Basicamente, a escala do ruído controla a suavidade (ou irregularidade) dos padrões das nuvens. (a) (b) Figura 11. Resultados dos testes realizados com uma textura 3D de resolução 2563. (a) Abordagem utilizando a WSG para o rendering e (b) abordagem utilizando impostores. 5. Conclusões e Trabalhos Futuros Neste trabalho foi abordado o problema da modelagem, animação e rendering de nuvens volumétricas dinâmicas, e apresentadas técnicas implementadas utilizando o hardware gráfico programável, visando aplicações em tempo real. Dentre essas técnicas foi implementada a de morphing entre texturas 3D para a animação das nuvens, além da modelagem procedural e o rendering baseado em fatias. É importante ressaltar que, para aplicações em tempo real, o rendering de nuvens deve utilizar apenas uma pequena porcentagem do tempo de geração de um quadro, visto que normalmente cenas ao ar livre apresentam muitos outros objetos a serem renderizados. Ao contrário das abordagens baseadas em environment mapping, as técnicas apresentadas nesse artigo possibilitam a imersão do observador em nuvens volumétricas (3D) em tempo real. Como trabalhos futuros, espera-se incrementar a técnica de modelagem de nuvens. Ferramentas de mais alto nível poderiam ajustar mais intuitivamente os parâmetros da função de ruído, e dessa forma gerar uma variedade maior de nuvens. Inclusive, poderiam ser gerados outros efeitos volumétricos proceduralmente (como neblina, fumaça, nebulosas espaciais, etc.) para aplicações em tempo real. Outra extensão possível às técnicas descritas nesse artigo envolve a adição de um modelo de iluminação mais realista, que levasse em conta o espalhamento da luz nas partículas da nuvem, por exemplo. Cabe lembrar que o uso de um modelo muito complexo de iluminação poderia impactar negativamente no desempenho global da cena. Agradecimentos À CAPES, CNPq e nVidia por suportarem parcialmente este trabalho. Referências Dietrich, C.A. et al. (2004) “Real-time interactive visualization and manipulation of volumetric data using GPU-based methods”. SPIE Medical Imaging, San Diego, USA. (in press). Dobashi, Y. et al. (2000) “A Simple, Efficient Method for Realistic Animation of Clouds”, In: Proceedings of ACM SIGGRAPH, p. 19-28. Ebert, D. et. al. (1994) “Texturing and Modeling: A procedural Approach”. In: AP Professional. p. 332. Elinas, P. and Stuerzlinger, W. (2001) “Real-Time Rendering of 3D Clouds”. In: Journal of Graphics Tools, p. 33-45. Gardner, G. (1985) "Visual Simulation of Clouds." In: Proceedings of ACM SIGGRAPH, Addison Wesley, p. 297-303. Gelder, A. V. and Kim, K. (1996) “Direct Volume Rendering with Shading via 3D Textures”, In: Symposium on Volume Visualization, p. 23-30, San Francisco, CA. Harris, M. and Lastra, A. (2001) “Real-Time Cloud Rendering”. EUROGRAPHICS 2001, Volume 20, Number 3. Harris, M., Coombe, G., Scheuermann, T. and Lastra, A. (2002) "Physically-Based Visual Simulation on Graphics Hardware". In: ACM SIGGRAPH/Eurographics Workshop on Graphics Hardware, p. 109-118. Illinois (2002) Department of Atmospheric Sciences. University of Illinois. Disponível em http://ww2010.atmos.uiuc.edu/(Gh)/guides/mtr/cld/home.rxml acessado em 2003. Miyazaki, R., Yoshida, S., Dobashi, Y. and Nishita, T. (2001) “A Method for Modeling Clouds based on Atmospheric Fluid Dynamics”. In: Proceedings of Pacific Graphics, p. 363-372. Lerios, A., Garfinkle, C. D., Levoy, M., (1995) “Feature-Based Volume Metamorphosis”. In: Proceedings of SIGGRAPH, p. 449-456. Liao, H. S., Chuang, J. H. and Lin, C. C. (2002) “Efficient Rendering of Dynamic Clouds”. CVGIP, Agosto de 2002. Perlin, K. (1985) “An Image Synthesizer”. In: ACM SIGGRAPH Computer Graphics, v. 19, n. 3, p. 287-296. Perlin, K. (2002) “Improving Noise”. In: Proceedings of ACM SIGGRAPH, p. 681-682. Schpok, J., Simons J., Ebert, D. and Hansen, C. (2003) “A Real-Time Cloud Modeling, Rendering and Animation System”. In: Proceedings of ACM SIGGRAPH, p. 160166. Stam, J. (1999) “Stable Fluids”. In: Proceedings of ACM SIGGRAPH, p. 121-128. Taxen, G. (1999) “Cloud Modeling for Computer Graphics”, Master's Thesis, Royal Institute of Technology, Stockholm, Sweden, 1999. Wang, N. (2003) “Realistic and Fast Cloud Rendering in Computer Games”. ACM SIGGRAPH Sketch, 2003. Disponível em http://www.ofb.net/~eggplant/clouds/. Acessado em novembro/2003. Watt, A. (2000), 3D Computer Graphics, Addison Wesley, 2000.