Estêncil Two-Sided (Direct3D 9)
Os volumes de sombra são usados para desenhar sombras com o buffer de estêncil. O app calcula os volumes de sombra convertidos sobrepondo a geometria, calculando as bordas da silhueta e afastando-as da luz em um conjunto de volumes 3D. Em seguida, esses volumes são renderizados duas vezes no buffer de estêncil.
A primeira renderização desenha polígonos voltados para frente e aumenta os valores de buffer de estêncil. A segunda renderização desenha 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 decrementados cancelam um ao outro. No entanto, a cena já foi renderizada com geometria normal, fazendo com que alguns pixels falhem no teste de buffer z, conforme o volume de sombra é renderizado. Os valores restantes no buffer de estêncil correspondem aos pixels que estão na sombra. Esse conteúdo restante do buffer de estêncil é usado como uma máscara, para fazer a combinação alfa de um quadrupleto preto grande e abrangente na cena. Com o buffer de estêncil atuando como uma máscara, o resultado será o escurecimento dos pixels que estão nas sombras.
Isso significa que a geometria de sombra é desenhada duas vezes por fonte de luz, exercendo assim pressão sobre a taxa de transferência de vértice da GPU. O recurso de estêncil de dois lados foi projetado para atenuar essa situação. Nesta abordagem, existem dois conjuntos de estado de estêncil (nomeados abaixo), um conjunto para os triângulos voltados para a frente e outro para os triângulos voltados para trás. Dessa forma, somente uma única passagem é desenhada por volume de sombra, por luz.
As alterações de API são restritas a um novo conjunto de estados de renderização. O novo estado de renderização D3DRS_Two_Sided_StencilMODE pode ser definido como TRUE ou FALSE. É FALSE por padrão, o que significa o comportamento atual (DirectX 8). Quando isso estiver definido como TRUE (funcionará somente se D3DSTENCILCAPS_TWOSIDED estiver definido), os seguintes estados de renderização serão aplicados somente aos triângulos front-facing (no sentido horário).
Estado de renderização | Descrição |
---|---|
D3DRS_STENCILFAIL | D3DSTENCILOP a ser feito se o teste de estêncil falhar. |
D3DRS_STENCILZFAIL | D3DSTENCILOP a ser feito se o teste de estêncil for aprovado e o teste z falhar. |
D3DRS_STENCILPASS | D3DSTENCILOP para fazer se os testes de estêncil e z forem aprovados. |
D3DRS_STENCILFUNC | D3DCMPFUNC fn. O teste de estêncil passa se ((máscara ref & ) estencilfn (máscara de estêncil & )) 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 a ser feito se o teste de estêncil falhar. |
D3DRS_CCW_STENCILZFAIL | D3DSTENCILOP a ser feito se o teste de estêncil for aprovado e o teste z falhar. |
D3DRS_CCW_STENCILPASS | D3DSTENCILOP para fazer se os testes de estêncil e z forem aprovados. |
D3DRS_CCW_STENCILFUNC | Função D3DCMPFUNC. O teste de estêncil será aprovado se ((máscara ref & ) estencilfn (máscara de estêncil & )) for verdadeiro. |
Os estados de renderização de estêncil restantes sempre se aplicam a triângulos no sentido horário e no sentido anti-horário.
D3DRS_Two_Sided_StencilMODE é ignorado para sprites de linhas e pontos, o que significa que o comportamento é inalterado em relação ao DirectX 8. Os estados de renderização D3DRS_CCW_STENCIL* são ignorados.
Um novo bit de limite indica se o dispositivo dá suporte a esse recurso. Espera-se que os drivers que não dão suporte a esse recurso ignorem esses novos estados de renderização. Todos os outros bits de limite de estêncil se aplicam a ambos os modos de buffer de estêncil. Como Two_Sided_Stencil implica a capacidade de desenhar com D3DCULLMODE_NONE conjunto, o limite correspondente deve ser definido pelo driver se ele der suporte a esse novo modo de estêncil. O WHQL (Microsoft Windows Hardware Quality Labs) 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:
D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps
Tópicos relacionados