Panda3D/Manual/Testando stencil escrevendo atributo

O StencilAtrrib é usado para testar e escrever para o buffer stencil. Note que ambas as ações podem ser performadas simultaneamente com um unico StencilAtribb.

O buffer stencil é um buffer de graficos ancillary, em adição aos mais conhecidos buffers de cor e profundidade. Ele providencia uma mascara por-pixel para a linha de renderização que podem ser aproveitadas seletivamente para renderizar objetos ou partes de objetos. Tipicas aplicações do buffer stencil incluindo masking binario, sombreamento e reflexões planares.

Usualmente, usar o buffer stencil envolve criar alguns objetos que nao sao renderizados no buffer de cor. Sau contribuiçao para a cena renderizada e de providenciar um limite invisivel que pode ser usado para ligar ou desligar a renderizaçao do buffer de cor para outros objetos na cena. Pense nele como um cartão cut-out por onde o mundo é visto.

Durante uma comparação stencil, o valor de referencia StencilAttrib é comparado contra o valor armazenado no stencil buffer. A ordem importa aqui. Por exemplo, considere comparar a função StencilAtrrib.SCFGreaterThan com o valor de referencia r=1. Um pixel passa o teste stencil se r > Sp, onde Sp é o valor no buffer stencil no pixel p. Objetos contribuindo valores para o buffer stencil que serao lidos por outras funções de comparação StencikAttributes precisam ser renderizados primeiro, ou resultados inesperados podem ocorrer. Veja como controlar a ordem de renderização.

O buffer stencil esta desabilitado por padrao. Para fazer uso do StencilAtribbs, voce deve adicionar a seguinte linha ao seu arquivo config.prc:

framebuffer-stencil #t

StencilAtrtribs sao definidos exclusivamente por suas funções construtoras, entao vamos examinar o que cada parte faz. O codigo a seguir cria um atributo que manda o objeto renderizar somente se o buffer stencil for exatamente 1, e ele mesmo nao modifica o buffer stencil.

stencilReader =

 StencilAttrib.make(1,StencilAttrib.SCFEqual,StencilAttrib.SOKeep,
                      StencilAttrib.SOKeep,StencilAttrib.SOKeep,1,1,0)

O primeiro parametro é um booleano. Se o parametro é zero, o StencilAttrib não é processado. Proximo na função de comparação que este atributo usa, nesse caso Igual. Os proximos tres parametros determinam o que acontece ao buffer stencil dependendo do resultado da comparação. Nos chegaremos la em minutos. Os tres valores keep falam para esse atributo nunca modificar os valores no buffer. Proximo no valor de referencia para a função de comparação. Antes do valor de referencia ser passado para a função de comparação, contudo, ele é bitwise ANDed com uma mascara. Em nosso caso, nós estamos interessados em ler mas nao em escrever o buffer stencil, entao nos passamos 1 e 0 para as mascaras de leitura e escrita, respectivamente. Essas mascaras são os ultimos dois parametros do StencilAttrib.

Proximo, nos olharemos para um atributo stencil que escreve o buffer stencil. Presumivelmente, essas duas funções funcionarão em conjunto para criar um efeito

constantOneStencil =

 StencilAttrib.make(1,StencilAttrib.SCFAlways,StencilAttrib.SOZero,
                      StencilAttrib.SOReplace,StencilAttrib.SOReplace,1,0,1)

Novamente nós começamos habilitando o atributo. A função de comparação aqui é SEMPRE, significando que o teste passa não importando os parametros. Proximo esta a operação para performar o buffer stencil se o teste falhar que no caso nunca vai acontecer - nos setamos o buffer stencil para zero. O proximo parametro determina o que deve acontecer se a funçao stencil passar, mas o teste de profundidade falhar, e finalmente, o que deve acontecer se ambos os testes de stencil e profundidade passarem. Em nosso caso nos queremos setar os valores do buffer stencil seja passando no teste de profundidade ou nao, entao ambos sao setados apra SUBSTITUIR. O valor de referencia para setar no buffer stencil é 1. Nos estamos escrevendo independente do que esta dentro do buffer, entao nos setamos as mascaras de leitura e escrita respectivamente apra 0 e 1.

Agora nos podemos adicionar esses atributos para nodos na cena que exploram o efeito.

cm = CardMaker("cardmaker") cm.setFrame(-.5,.5,-.5,.5) viewingSquare = render.attachNewNode(cm.generate()) viewingSquare.node().setAttrib(constantOneStencil) viewingSquare.node().setAttrib(ColorWriteAttrib.make(0)) viewingSquare.setBin('background',0) viewingSquare.setDepthWrite(0)

view = loader.loadModel("models/Panda") view.reparentTo(render) view.setScale(3) view.setY(150) view.node().setAttrib(stencilReader)