Fundamentos de Computação Gráfica Aplicação de Tags em Objetos de Sistemas de Visualização em Tempo Real Renato Deris Prado Tópicos principais Introdução e Objetivos 1. Conceitos Importantes 2. 2 Modelos massivos e modelos CAD Texturas e texturização de imagens Textura procedural Projeto 3. 4. Sistemas de visualização em tempo real e autotags Objetivos Grafo de cena Aplicação dinâmica de texturas Testes e Resultados Considerações Finais 1. Introdução e Objetivos Sistemas de visualização em tempo real (Environ – Tecgraf/Puc-Rio) Sistema de realidade virtual que busca aumentar a qualidade gráfica e o realismo da visualização. Permite a interação com o usuário de diversas formas (Mover objetos, navegar pela cena, criar anotações) Imagem do software Environ mostrando uma refinaria de petróleo. 3 A resposta do programa é em tempo real (Exemplo: Movimentação de câmera). 1. Introdução e Objetivos Autotags Cada objeto da cena tridimensinal tem um nome específico. As autotags (circuladas de vermelho na foto) são aplicadas nos objetos e mostram seus nomes. Permitem a rápida identificação de objetos. Esse tipo de identificação existe em objetos reais. Imagem do software AvevaReview 2010 de uma refinaria de petróleo mostrando as autotags. 4 1. Introdução e Objetivos Objetivos 5 Estudar como fazer uso das autotags. Inicialmente criar uma aplicação simples de tempo real para poder desenvolver os testes (mais complicado testar com o Environ). Ao usar autotags não comprometer o desempenho da aplicação de tempo real. Usar futuramente as autotags no Environ, em arquivos de extensão rvm ou modelos CAD (slide 6). 2.Conceitos Importantes Modelos massivos e modelos CAD 6 Alguns modelos carregados pelo Environ contém milhões de objetos (cilindros, cubos, cones, etc) e por isso são chamados de modelos massivos. Arquivos de extensão rvm podem ser modelos massivos e são modelos CAD que são o foco do trabalho. Modelos CAD ou Computer Aided Design são os modelos que recebem as autotags em softwares concorrentes ao Environ. Eles representam objetos reais para visualização científica e mostram refinárias e plataformas de petróleo, como exemplos. 2.Conceitos Importantes Texturas e texturização de imagens Em computação gráfica texturização é um processo que recebe uma superfície de um objeto e modifica sua aparência em cada localização usando alguma imagem, função ou outra fonte de dados. Aplicação de tags é um processo de texturização. 7 Como exemplo, ao invés de criar vários cubos para representar uma parede de tijolos, pode-se usar uma imagem de parede de tijolos e aplicá-la a somente um cubo maior. 2.Conceitos Importantes Texturas e texturização de imagens Duas formas de texturização foram cogitadas: Texturização de imagens bidimensionais: Aplicação de uma imagem png, representando a autotag, sobre as geometrias. Problemas: Cada textura diferente ou autotag ocuparia memória de vídeo. Podem existir milhões de objetos, cada um com sua autotag. Com isso, a possibilidade de a memória ser insuficiente é enorme. Como saber os nomes dos objetos para criar imagens de textura? Necessidade de criação de texturas a medida que carrega modelos e conhece os nomes dos objetos. Textura procedural: Programação em placa de vídeo com programas chamados shaders. Problemas: Como ter os caracteres ASCII já que não temos uma imagem com a tag? 8 Os caracteres ASCII teriam que ser criados por código para serem aplicados. 3.Projeto No inicío da implementação foi escolhida a texturização de imagens bidimensionais para ver na prática como o sistema computacional se comportaria com os problemas apontados anteriormente (slide 8) e se alguma solução viável poderia ser encontrada. Grafo de cena É uma estrutura de dados que facilita a separação de funcionalidades do projeto (classes) e a estruturação de objetos na cena. A hierarquia de classes e seus detalhes estão explicados no texto. O grafo de cena permitiu criar a aplicação de tempo real e as cenas com objetos tridimensionais. 9 3.Projeto Grafo de cena Imagem retirada da aplicação criada nesse trabalho. Do lado esquerdo uma cena com sessenta mil objetos e do lado direito com dez mil. Os objetos vermelhos são cubos e os azuis, cilindros. Com o grafo de cena construído o próximo passo foi resolver a aplicação dinâmica de texturas. 10 3.Projeto Aplicação dinâmica de texturas Porque aplicação dinâmica de texturas? Cada objeto tem um nome único e precisa de uma textura diferente. Vários arquivos com objetos diferentes podem ser carregados e não se sabe o nome deles até a leitura do arquivo. O que foi feito? Uma imagem com todos os caracteres ASCII necessários foi usada como base. Esta imagem png fica inicialmente guardada em disco. Quando a aplicação roda, é carregada em RAM. Para o OpenGL uma imagem é armazenada como um vetor unidimensional. Uma vez que se tem essa imagem guardada em um vetor, é possível “recortar” letras do repositório e organizá-las em um novo vetor. Para isso era preciso conhecer previamente a altura e a largura desses caracteres no repositório. 11 3.Projeto Aplicação dinâmica de texturas Exemplo de tags que podem ser extraídas do repositório. As tags são brancas com contorno preto para que possam aparecer também em objetos escuros. Qualquer outra combinação de cores poderia ser usada. A organização dos novos vetores toma conta de colocar as letras bem juntas parecendo realmente uma palavra única. A medida que o arquivo é carregado diferentes tags podem ser construídas para que cada objeto possa receber uma textura diferente. 12 3.Projeto Aplicação dinâmica de texturas A medida que o arquivo é carregado, diferentes tags podem ser construídas para que cada objeto possa receber uma textura diferente. Objetos já com as tags aplicadas sobre eles. 13 3.Projeto Testes e resultados Máquina com Windows7, Geforce9600GT de 512Mb, 2Gb de RAM. GPU-Z usado para medir VRAM. Teste 1 Objetivo: Ver quantos objetos poderiam ser renderizados sem as texturas mantendo um frame rate bom para uma aplicação de tempo real. Resultado: Objetos Textura FPS 60.000 Não 4 10.000 Não 30 Com cinco mil cilindros e cinco mil cubos frame rate de 30 fps (objetos muito aglomerados) 14 3.Projeto Testes e resultados Teste 2 Objetivo: Medir consumo de memória de vídeo e ver quantos objetos poderiam ter tags. Resultado: Objetos Textura VRAM FPS 40.000 Não 148Mb 8 40.000 Sim 508Mb 0 30.000 Não 122Mb 10 30.000 Sim 500Mb 2 - Sistema operacional gasta 110 MB, logo, gasto com geometria é baixo. - A aplicação de texturas fez o fps cair drasticamente. Dúvida que surge: O alto consumo de VRAM está fazendo cair o fps ou existe algum gargalo no grafo? 15 3.Projeto Testes e resultados Teste 3 Objetivo: Examinar possíveis gargalos na aplicação. Foi visto que a função glBindTexture2D poderia ser responsável pela queda de performance. Essa função deve ser chamada antes do desenho de cada objeto para que troque a textura/tag da vez. Como cada objeto tem uma tag diferente, ela acaba sendo chamada uma vez para cada objeto. Resultado: Objetos Textura VRAM FPS 40.000 Sim 508Mb 8 As texturas continuaram sendo jogadas na placa, mantendo o gasto de VRAM em 508Mb mas agora não foram realizados os “binds”. O frame rate não caiu para 0 fps como antes. O glBindTexture2D era o gargalo! 16 3.Projeto Testes e resultados Com o resultado do Teste 3, o problema de usar a função glBindTexture2D muitas vezes, se tornou maior do que o do gasto de memória de vídeo, quando lidando com modelos massivos. 17 Solução encontrada Foi visto que no software concorrente AvevaReview, nem todos os objetos da cena recebiam tags de uma vez. Eles iam recebendo tags a medida que ficavam mais próximos da câmera – a medida que os quadros iam sendo renderizados e a câmera ia se movimentando. A solução é escolher um certo limite de objetos que receberá tags por quadro. Exemplo: Os objetos mais próximos da câmera. Foi feita uma adaptação no grafo de cena para que, antes da renderização de um quadro, seja calculada a posição da câmera no espaço 3D. Na hora de renderizar os objetos, é calculada a distância deles para a câmera. Os objetos que estão até uma distância x da câmera irão receber tags e os outros não. 3.Projeto Testes e resultados Solução encontrada Limitando as chamadas a função glBindTexture2D, foi possível manter um desempenho aceitável. Quanto menos chamadas dessa função melhor. Faz sentido que o usuário não precise ver todas as tags ao mesmo tempo! É possível notar que os objetos próximos da câmera têm tags e os mais ao fundo não. 18 3.Projeto Testes e resultados 19 Solução encontrada Uma vez que o problema do “bind” foi diminuindo, a memória de vídeo volta a ser um problema. Com muitos objetos, mesmo que só alguns recebam tags, ainda é preciso guardar na placa uma textura diferente por objeto. Até o presente momento não foi feito um controle de memória, mas para a solução ser viável, é necessário que isso exista futuramente. A escolha de quais objetos devem receber tags por quadro pode ser mais bem feita para que sejam obtidos resultados visuais melhores. 4.Considerações Finais Exibição de tags sobre objetos é um bom recurso para pessoas que trabalham com modelos CAD, já que facilitam a identificação dos objetos. A solução encontrada é viável de ser implementada. Com um limite de objetos que podem receber tags, a performance da aplicação é pouco comprometida. Entretanto, ajustes nos algoritmos precisam ser feitos para que a solução fique mais completa e possa de fato ser usada no Environ. 20 Melhor escolha de quais objetos recebem tags para que um número mínimo de binds seja realizado e melhores efeitos visuais sejam obtidos. É necessário existir uma gerência de quando as texturas entram e saem da placa de vídeo para que o gasto de VRAM não seja maior do que o possível. 4.Considerações Finais 21 O que foi feito: Grafo de cena Criação e montagem dinâmica de texturas Aplicação de tags em cilindros e cubos Testes de performance Falta fazer no futuro: Melhoria dos algoritmos para escolha dos objetos que recebem tags. Controle de memória de vídeo Ajuste na orientação das tags Conversa com usuários reais do Environ sobre as soluções que os atenderiam melhor FIM 22