quinta-feira, 23 de fevereiro de 2012

Simples sistema LOD para Blender


LOD(Level of Detail) ou "Nível de Detalhamento" é um sistema utilizado em engines gráficas para aumentar o desempenho da aplicação 3d, tornando-o mais leve para o computador. Funciona alterando o nível de detalhamento dos objetos na cena de acordo com a distância do observador, esse detalhamento pode ser varias coisas, o mais comum é a redução de vértices, de perto o objeto fica com um número maior de vértices e conforme o observador se afasta se reduz a quantidade de vértices, pode-se definir níveis de LOD, como alto,médio e baixo para perto, próximo e longe, nada impede que possa ser feito outros níveis. Existe um outro LOD para imagens que é o mipmap que já vem no blender e esta ativado por padrão.

Exemplo de LOD para vértices
Eu estou fazendo algumas maquetes 3d com um nível considerável de vértices e utilizando GLSL para renderização, como o blender não lida bem com GLSL, isto é "fica pesado mesmo com um cenário com pouco objetos", fui forçado a criar um sistema simples para que eu possa continuar utilizar o blender como ferramenta principal de trabalho. O sistema que fiz, é um sistema de controle de vértices, funciona como descrito no parágrafo anterior, porém com algumas peculiaridades, primeiro você precisa reduzir a quantidade de vértices do seu modelo 3d manualmente, isto pode ser feito no blender com o modificador "DECIMATE", ou um aplicativo externo como o MeshLab  que é free e open source. Outro ponto importante é colocar em cada modelo 3d, propriedades informando quem são os seus substitutos para cada nível, colocando o nome da malha e não do objeto, que é um contêiner da malha. Os nível de detalhamento são ajustado no script Python, nas variáveis dist_hi e dist_med.

Na direita o nome das malhas
Ex: No "Cube.001" temos o Objeto e ligado a ele temos o nome da malhas "Med.Cube"


Conclusão:
Os teste de validação se mostraram bem interessantes, pois o sistema LOD não consome muito processamento e conseguiu um aumento de desempenho considerável,  mas isso depende de cada caso, pois talves  em um cenário com pouco elementos o sistema pode não fazer efeito, por outro lado se observou que em cenário com elementos muito complexos "muitos vértices", houve um efeito colateral indesejável. Quando se aproxima de um objeto pela primeira vez ha um travamento no aplicativo, por que o modelo vai ser carregado na memória e isso pode demorar dependendo da complexidade do modelo, mas nas próximas vezes que o modelo for chamado o sistema corresponde bem, por que o modelo se encontra carregado na memoria do computador, talves um sistema de preload resolve isso.
Como o título do artigo enfatiza, é um sistema simples, feito as pressas para uma urgência, o ideal seria um sistema automático de redução de vértices em tempo real, sem a necessidade de redução manual e link dos modelos substitutos ao modelo principal. Um sistema desses poderia estar em forma de add-ons para o blender, o que seria uma melhoria importante para game engine. Acho que o que falta para a BGE são ferramentas que torne o trabalho menos braçal, mais eficiente, mas o bom do blender também pode ser isso, a oportunidade de poder fazer suas próprias soluções e aprender mais com a tarefa.

Blender 2.62
Arquivo .blend Download