Sprites de ponto (Direct3D 9)
O suporte para sprites de pontos no Direct3D 9 permite a renderização de pontos de alto desempenho (sistemas de partículas). Sprites de pontos são generalizações de pontos genéricos que permitem que formas arbitrárias sejam renderizadas conforme definido por texturas.
Controles de renderização primitivos de ponto
O Direct3D 9 suporta 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 de câmera, com exceção de quando o aplicativo está passando vértices pós-transformados de formato de vértice flexível (FVF). 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 calculadas e usadas quando os pontos de renderização 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 do 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 que são 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 do espaço da 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 ₑ² )))
Nesta 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 da escala de pontos, 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 entre o olho e a posição (o olho na origem), é calculada tomando a posição do espaço ocular do ponto (Xₑ, Yₑ, Zₑ) e executando a seguinte operação.
D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)
O tamanho máximo do ponto, Pmₐₓ, é determinado tomando o menor dos membros MaxPointSize da estrutura D3DCAPS9 ou o estado de renderização D3DRS_POINTSIZE_MAX. O tamanho mínimo do ponto, Pmin, é determinado consultando o valor de D3DRS_POINTSIZE_MIN. Assim, o tamanho final do ponto de espaço na tela, S, é determinado da seguinte maneira.
- Se Ss > Pmₐₓ, então S = P mₐₓ
- se S < Pmin, então S = P min
- Caso contrário, S = S
Renderização de pontos
Um ponto de espaço de tela, P = ( X, Y, Z, W), de tamanho de espaço de tela S é rasterizado como um quadrilátero dos quatro vértices seguintes.
(( 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 do vértice são duplicados em cada vértice; assim, cada ponto é sempre renderizado com cores constantes.
A atribuição de índices de textura é controlada pela configuração de estado de renderização D3DRS_POINTSPRITEENABLE. Se D3DRS_POINTSPRITEENABLE estiver definido como FALSO , as coordenadas de textura do vértice serão duplicadas em cada vértice. Se D3DRS_POINTSPRITEENABLE estiver definido como TRUE, as coordenadas de textura nos quatro vértices serão definidas com os seguintes valores.
(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)
Isso é mostrado no diagrama a seguir.
Quando o recorte está habilitado, os pontos são cortados da seguinte maneira. 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 frustum de visão e não é renderizado. Se o ponto, levando em conta o tamanho do ponto, estiver completamente fora do visor em X e Y, então 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 cortados corretamente para planos de clipe definidos pelo usuário. Se D3DPMISCCAPS_CLIPPLANESCALEDPOINTS não estiver definido no membro PrimitiveMiscCaps da estrutura D3DCAPS9, os pontos serão cortados para 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 do clipe e descartados quando a posição do vértice está fora de um plano do clipe. Os aplicativos podem evitar artefatos em potencial adicionando uma geometria de borda a planos de recorte que é tão grande quanto o tamanho máximo do ponto.
Se o D3DPMISCCAPS_CLIPPLANESCALEDPOINTS bit estiver definido, os pontos dimensionados serão cortados corretamente para planos de clipe definidos pelo usuário.
O processamento de vértice de hardware pode ou não suportar o tamanho do ponto. Por exemplo, se um dispositivo for criado com D3DCREATE_HARDWARE_VERTEXPROCESSING em um dispositivo de camada de abstração de hardware (HAL) (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 FVF TL (transformados e iluminados) ou processamento de vértice de software (D3DCREATE_SOFTWARE_VERTEXPROCESSING), caso em que 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 suporta sprites de ponto - MaxPointSize definido como maior que 1.0f - é necessário para executar o cálculo de tamanho para sprites não transformados e é necessário para definir corretamente o per-vértice ou D3DRS_POINTSIZED3DRS_POINTSIZE para vértices TL.
Para obter informações sobre regras de renderização para pontos, linhas e triângulos, consulte Rasterization Rules (Direct3D 9).
Tópicos relacionados