Shader que "corta" o buraco em toda a geometria

10

Como criar um sombreador que "corta" toda a geometria, apenas renderizando o plano de fundo de limpeza no Unity? Um exemplo:

insira a descrição da imagem aqui

Isso é um prisma em uma enorme sala branca em forma de caixa. A superfície do prisma está apenas renderizando o skybox da cena (um céu estrelado). Eu usei várias câmeras, o que é bastante ineficiente ... Deve haver uma maneira com apenas shaders.

Como posso fazer isso?

CalebHC
fonte

Respostas:

14

Ok, finalmente descobri!

insira a descrição da imagem aqui

Você vê como a malha da esfera “corta” através do cilindro e é plana até a caixa do céu. Demorei mais do que o esperado para descobrir isso, mas graças a uma página da wiki ( http://wiki.unity3d.com/index.php/DepthMask ), resolvi tudo.

Antes de usar a configuração do sombreador na página wiki, eu estava usando três câmeras diferentes com diferentes sinalizadores de limpeza / profundidade para obter o mesmo resultado. Funcionou, mas engasgou totalmente com o Ouya. A solução acima requer apenas uma câmera e roda muito fasta.

Então eu configurei a cena como tal ...

  1. adicionou uma skybox realista (nasa)

  2. adicionou algumas formas

  3. adicionou o script SetRenderQueue ao plano, esfera e cilindro

  4. defina a ordem da fila na esfera como 2999 (os outros objetos estão em 3000)

  5. depois adicionou o sombreador DepthMask à esfera

É isso aí. Qualquer dúvida me avise!

CalebHC
fonte
2
Ah, eu estava pensando demais sobre o problema no meu post acima (eu estava pensando em malhas planas em paredes / pisos, na verdade). A solução vinculada mostra um objeto de furo 3D, e a solução mostrada, neste caso, é muito simples - tudo o que você realmente precisa fazer é gravar o 'buraco' no buffer z sem escrever nenhuma cor e garantir que o furo seja desenhado cedo.
Bluescrn
@bluescrn Não se preocupe! Agradeço o post detalhado. :)
CalebHC
2

Duas opções para obter o efeito desejado - mas elas têm um custo:

  • Escreva os furos no buffer de estêncil ou no canal alfa de destino e desenhe o camarote por último, usando um teste de estêncil ou mistura alfa adequado e sem teste z?

ou

  • Renderize a skybox em uma textura no início do quadro e projete-a na 'geometria do furo'

Eu suspeito que deve haver uma maneira de fazer isso usando / abusando do buffer z também - mas você provavelmente deseja testar os 'polígonos de furo' usando o Z real deles e escrever um Z diferente. Você provavelmente poderia usar várias passagens e o buffer de estêncil - desenhando o buraco 3 vezes com o renderstate configurado assim pode funcionar:

  • Passe 1: sem teste z, estêncil transparente sob polys de furo
  • Passe 2: Teste z normal, valor do estêncil de incremento (onde o teste de profundidade passa)
  • Passe 3: Limpe Z onde o estêncil> 0

Você ainda precisaria desenhar em uma ordem específica - primeiro o ambiente, depois os buracos e, finalmente, a caixa do céu por último.

bluescrn
fonte