Partilhar via


Two-Sided Stencil (Direct3D 9)

Os Volumes de Sombra são usados para desenhar sombras com o buffer de estêncil. O aplicativo calcula os volumes de sombra lançados pela geometria ocluída, calculando as bordas da silhueta e extrudindo-as da luz em um conjunto de volumes 3D. Esses volumes são então renderizados duas vezes no buffer de estêncil.

A primeira renderização desenha polígonos voltados para a frente e incrementa os valores de buffer de estêncil. A segunda renderização desenha os polígonos voltados para trás do volume de sombra e diminui os valores de buffer de estêncil. Normalmente, todos os valores incrementados e diminuídos anulam-se mutuamente. No entanto, a cena já foi renderizada com geometria normal, fazendo com que alguns pixels falhassem no teste z-buffer à medida que o volume de sombra é renderizado. Os valores deixados no buffer de estêncil correspondem a pixels que estão na sombra. Esses conteúdos restantes do stencil-buffer são usados como uma máscara, para misturar alfa um grande quad preto abrangente na cena. Com o buffer de estêncil agindo como uma máscara, o resultado é escurecer os pixels que estão nas sombras.

Isso significa que a geometria da sombra é desenhada duas vezes por fonte de luz, pressionando assim a taxa de transferência do vértice da GPU. O recurso de estêncil de dois lados foi projetado para mitigar essa situação. Nesta abordagem, existem dois conjuntos de estado de estêncil (nomeados abaixo), um definido para os triângulos voltados para a frente e o outro para os triângulos voltados para trás. Desta forma, apenas uma única passagem é desenhada por volume de sombra, por luz.

As alterações da API são restritas a um novo conjunto de estados de renderização. O novo D3DRS_Two_Sided_StencilMODE de estado de renderização pode ser definido como TRUE ou FALSE. É FALSE por padrão, o que significa o comportamento atual (DirectX 8). Quando isso é definido como TRUE (funcionará somente se D3DSTENCILCAPS_TWOSIDED estiver definido), os seguintes estados de renderização se aplicarão somente aos triângulos frontais (no sentido horário).

Estado de renderização Descrição
D3DRS_STENCILFAIL D3DSTENCILOP fazer se o teste de estêncil falhar.
D3DRS_STENCILZFAIL D3DSTENCILOP fazer se o teste de estêncil passar e o teste z falhar.
D3DRS_STENCILPASS D3DSTENCILOP fazer se ambos os testes de estêncil e z passarem.
D3DRS_STENCILFUNC D3DCMPFUNC FN. Stencil Test passa se ((ref & mask) stencilfn (stencil & mask)) for verdadeiro.

 

Um novo conjunto de estados de renderização se aplica aos triângulos voltados para trás (no sentido anti-horário).

Estado de renderização Descrição
D3DRS_CCW_STENCILFAIL D3DSTENCILOP fazer se o teste de estêncil falhar.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP fazer se o teste de estêncil passar e o teste z falhar.
D3DRS_CCW_STENCILPASS D3DSTENCILOP fazer se ambos os testes de estêncil e z passarem.
D3DRS_CCW_STENCILFUNC D3DCMPFUNC função. O teste de estêncil passa se ((ref & mask) stencilfn (stencil & mask)) for verdadeiro.

 

Os estados de renderização de estêncil restantes sempre se aplicam a triângulos no sentido horário e anti-horário.

D3DRS_Two_Sided_StencilMODE é ignorado para linhas e sprites de pontos, o que significa que o comportamento não é alterado do DirectX 8. Os estados de renderização D3DRS_CCW_STENCIL* são ignorados.

Um novo bit de tampa indica se o dispositivo suporta esse recurso. Espera-se que os drivers que não oferecem suporte a esse recurso ignorem esses novos estados de renderização. Todos os outros bits de tampa de estêncil aplicam-se a ambos os modos de buffer de estêncil. Uma vez Two_Sided_Stencil implica a capacidade de desenhar com D3DCULLMODE_NONE conjunto, a tampa correspondente deve ser definida pelo condutor se suportar este novo modo de estêncil. Microsoft Windows Hardware Quality Labs (WHQL) deve impor isso.

Novos estados de renderização:

D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL     // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL    // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS     // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC     // Same default as D3DRS_STENCILFUNC

Novo limite máximo:

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

Técnicas de buffer de estêncil

D3DRENDERSTATETYPE