Desde o começo do projeto “EoPeoB”, estou tentando achar uma solução legal para gerar uma saída de render em wireframe pelo XSI.
O que queria era uma saída próxima ao "Depth Cue" que existe na visualização dos viewports, uma saída em wireframe com controle de profundidade.
Meio estúpido, mas o XSI (pelo menos até a versão 7.5) não provê um jeito simples de fazer isso.
Vasculhando a internet, encontrei várias "soluções paralelas" (aka gambiarras) que simulam isso:
Capturar (print screen) do viewport:
Já fiz isso quando precisava de uma imagem só. Mas nesse caso, trata-se de uma cena animada.
Como a cena tem 4 segs, teria que fazer isso para para quase de 120 frames.
E como ainda vou montá-lo sobre um render normal da cena, justapor uma captura em vídeo também não seria agradável, nem bonito.
Toon Ink LENS:
A solução recomendada pela Autodesk.
É basicamente um efeito de câmera (Lens shader). Ele faz uns ray castings absurdos para descobrir os limites de cada polígono para criar cada controrno. E por isso, aumenta consideralvelmente o tempo de render.
Ter várias opções bacanas, como o “taper” para variar a grossura (spread) das linhas conforme a distância (sim, custei para achar isso), e as cores de linha que podem ser personalizados no próprio shader de material (Toon Ink shader) e etc.
O problema é que o wireframe que gera é com a malha final. Ou seja, com o tesselation aplicado, vem com um monte de triângulos a mais, sujando toda a cena.
E ao ligar o merge dos poligonos co-planares, ele ignora completamente as subdivisões dos wires originais…
Na maioria dos casos, até que resolve bem. Mas esperava uma coisa mais limpa e imediata.
Polygon Mesh Texture:
Basicamente é como aplicar uma textura de imagem. É só exportar uma imagem da malha aberta pelo texture editor, e reaplicar no material do objeto.
As linhas do wire serão justamente as linhas guias exportadas. Como a linha é implícit na textura do material, é até possível fazer alguns ajustes de cor e transparências no render tree.
Apesar da espessura poder ser ajustado na própria imagem, a definicão da linha na cena vai depender do tamanho do objeto e da malha. Ou seja, fica difícil manter as linhas uniformes na cena inteira.
Ah sim, já disse que que cada objeto da cena var precisar ter seu próprio material?
Pois bem, significa que isso vai ter que ser feito para TODOS os objetos da cena, um a um.
Apesar da ideia ser relativamente simples, mexer com texturas têm todas as suas chatisses relacionadas (abrir malha, exportar e importar, criar material, etc).
Fazer isso para um bom punhado de objetos não seria muito divertido. E no meu caso, não são poucos.
SDK sample wireframe shader:
Sério, o XSI vem com um toolkit de desenvolvimento de plugin/addons bem bacana.
Dentre um monte de tranqueira, tem um exemplo de shader "Show Edges":
http://softimage.wiki.softimage.com/sdkdocs/examples/Addons/ShowEdges/netview_ShowEdges.htm
Muito gentil por parte da Autodesk de já colocar uma versão compilada dele, pronta para ser usada.
O showedge até que funciona, mas mostra os triângulos do subdivision (como o Toon Ink), coisa o que eu não quero.
Mas junto com ele, vem um tal "Wireframe sample shader". Wow, exatamente o que eu preciso.
Acontece que NÃO funciona!
Consigo conectar no render tree e configurar, mas na hora do "Q" (render region), dá erro. Poxa vida, os caras lá não testam as coisas não?
Até tentei renomear o “Wireframe.64.dll” para “Wireframe.dll”. Parou de dar o erro, mas não faz nada.
Provavelmente o plugin foi compilado para outra versão (Win32), e o meu XSI 7.5 está no Win7 de 64bits.
E, não. Não quero instalar o CPP, ou o C++ do VisualStudio só para recompilar esse troço.
Hardware Renderer:
É uma versão mais "elegante" do printscreen.
Depois de achar, é até lógico. É possível utilizar o próprio motor de render da interface do XSI para dar saída. O truque é trocar a saída do render padrão (“Mental Ray”) para o “Hardware Renderer” e remover da câmera todos os elementos de interface indesejados (nulls, implicits, coords, etc).
O problema que o coitado é feio que dá dó.
É o “WYSIWYG” ao pé da letra. Por ser exatamente a mesma do saída do viewport, tem a mesma lista de opções de configuração. Apesar de ter um “fog”, não existe anti-aliasing nem controle dinâmico de espessura da linha.
Considerações finais
Bem, o objeto do post não era fazer um tutorial de cada método, apenas expor as ideias por trás delas. Mas precisando, posso ajudar.
No momento, estou repensando a cena. Provavelmente vou usar um combinação do Hardware Renderer e o Toon Shader...
Pensei na cena para ser uma coisa rápida de fazer, e está sendo uma das coisas mais chatas do projeto.
Nenhum comentário:
Postar um comentário
Por favor, se não tem nada relevante para dizer, não escreva nada.