Partilhar via


Sprites de ponto (Direct3D 9)

O suporte para sprites de ponto no Direct3D 9 permite a renderização de alto desempenho de pontos (sistemas de partículas). Os sprites de ponto são generalizações de pontos genéricos que permitem que formas arbitrárias sejam renderizadas conforme definido por texturas.

Controles de renderização primitiva de ponto

O Direct3D 9 dá suporte a parâmetros adicionais para controlar a renderização de sprites de ponto (primitivos de ponto). Esses parâmetros permitem que os pontos sejam de tamanho variável e tenham um mapa de textura completo aplicado. O tamanho de cada ponto é determinado por um tamanho especificado pelo aplicativo combinado com uma função baseada em distância calculada pelo Direct3D. O aplicativo pode especificar o tamanho do ponto como por vértice ou definindo D3DRS_POINTSIZE, que se aplica a pontos sem um tamanho por vértice. O tamanho do ponto é expresso em unidades de espaço da câmera, com exceção de quando o aplicativo está passando vértices FVF (formato de vértice flexível pós-transformado). Nesse caso, a função baseada em distância não é aplicada e o tamanho do ponto é expresso em unidades de pixels no destino de renderização.

As coordenadas de textura computadas e usadas ao renderizar pontos dependem da configuração de D3DRS_POINTSPRITEENABLE. Quando esse valor é definido como TRUE, as coordenadas de textura são definidas para que cada ponto exiba a textura completa. Em geral, isso só é útil quando os pontos são significativamente maiores que um pixel. Quando D3DRS_POINTSPRITEENABLE é definido como FALSE, a coordenada de textura de vértice de cada ponto é usada para todo o ponto.

Cálculos de tamanho de ponto

O tamanho do ponto é determinado por D3DRS_POINTSCALEENABLE. Se esse valor for definido como FALSE, o tamanho do ponto especificado pelo aplicativo será usado como o tamanho do espaço de tela (pós-transformado). Os vértices passados para o Direct3D no espaço de tela não têm tamanhos de ponto calculados; o tamanho do ponto especificado é interpretado como tamanho de espaço na tela.

Se D3DRS_POINTSCALEENABLE for TRUE, o Direct3D calculará o tamanho do ponto de espaço na tela de acordo com a fórmula a seguir. O tamanho do ponto especificado pelo aplicativo é expresso em unidades de espaço da câmera.

S s = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))

Nessa fórmula, o tamanho do ponto de entrada, S i, é por vértice ou o valor do estado de renderização D3DRS_POINTSIZE. Os fatores de escala de ponto, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B e D3DRS_POINTSCALE_C são representados pelos pontos A, B e C. A altura do visor, V h, é o membro Height da estrutura D3DVIEWPORT9 que representa o visor. D ₑ, a distância do olho até a posição (o olho na origem), é calculada tomando a posição do espaço nos olhos do ponto (Xₑ, Yₑ, Zₑ) e executando a operação a seguir.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

O tamanho máximo do ponto, Pmₐₓ, é determinado tomando o menor do membro MaxPointSize da estrutura D3DCAPS9 ou do estado de renderização D3DRS_POINTSIZE_MAX. O tamanho mínimo do ponto, Pmin, é determinado consultando o valor de D3DRS_POINTSIZE_MIN. Portanto, o tamanho final do ponto de espaço na tela, S, é determinado da maneira a seguir.

  • Se Ss > Pmₐₓ, s = P mₐₓ
  • se S < Pmin, então S = P min
  • Caso contrário, S = Ss

Renderização de ponto

Um ponto de espaço na tela, P = ( X, Y, Z, W), do tamanho do espaço na tela S é rasterizado como um quadrilátero dos quatro vértices a seguir.

(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))

Os atributos de cor de vértice são duplicados em cada vértice; portanto, cada ponto é sempre renderizado com cores constantes.

A atribuição de índices de textura é controlada pela configuração D3DRS_POINTSPRITEENABLE estado de renderização. Se D3DRS_POINTSPRITEENABLE for definido como FALSE, as coordenadas de textura de vértice serão duplicadas em cada vértice. Se D3DRS_POINTSPRITEENABLE for definido como TRUE, as coordenadas de textura nos quatro vértices serão definidas com os valores a seguir.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Isso é mostrado no diagrama a seguir.

diagrama de um quadrado com vértices rotulados para valores de coordenada (u,v) e (x,y)

Quando o recorte está habilitado, os pontos são recortados da maneira a seguir. Se o vértice exceder o intervalo de valores de profundidade - MinZ e MaxZ da estrutura D3DVIEWPORT9 - no qual uma cena deve ser renderizada, o ponto existe fora do frusto de exibição e não é renderizado. Se o ponto, levando em conta o tamanho do ponto, estiver completamente fora do visor em X e Y, o ponto não será renderizado; os pontos restantes são renderizados. É possível que a posição do ponto esteja fora do visor em X ou Y e ainda seja parcialmente visível.

Os pontos podem ou não ser recortados corretamente em planos de clipe definidos pelo usuário. Se D3DPMISCCAPS_CLIPPLANESCALEDPOINTS não estiver definido no membro PrimitiveMiscCaps da estrutura D3DCAPS9 , os pontos serão recortados em planos de clipe definidos pelo usuário com base apenas na posição do vértice, ignorando o tamanho do ponto. Nesse caso, os pontos dimensionados são totalmente renderizados quando a posição do vértice está dentro dos planos de clipe e descartados quando a posição do vértice está fora de um plano de clipe. Os aplicativos podem impedir artefatos potenciais adicionando uma geometria de borda para cortar planos tão grandes quanto o tamanho máximo do ponto.

Se o D3DPMISCCAPS_CLIPPLANESCALEDPOINTS bit estiver definido, os pontos dimensionados serão recortados corretamente em planos de clipe definidos pelo usuário.

O processamento de vértice de hardware pode ou não dar suporte ao tamanho do ponto. Por exemplo, se um dispositivo for criado com D3DCREATE_HARDWARE_VERTEXPROCESSING em um dispositivo HAL (camada de abstração de hardware) (D3DDEVTYPE_HAL) que tenha o membro MaxPointSize da estrutura D3DCAPS9 definido como 1.0 ou 0.0, todos os pontos serão um único pixel. Para renderizar sprites de ponto de pixel inferiores a 1,0, você deve usar vértices de TL FVF (transformado e iluminado) ou processamento de vértice de software (D3DCREATE_SOFTWARE_VERTEXPROCESSING), nesse caso, o tempo de execução do Direct3D emula a renderização de sprite de ponto.

Um dispositivo de hardware que faz processamento de vértice e dá suporte a sprites de ponto - MaxPointSize definido como maior que 1,0f - é necessário para executar a computação de tamanho para sprites nãotransformados e é necessário para definir corretamente o por vértice ou D3DRS_POINTSIZED3DRS_POINTSIZE para vértices TL.

Para obter informações sobre como renderizar regras para pontos, linhas e triângulos, consulte Regras de rasterização (Direct3D 9).

Pipeline de Vértice