Sprites de punto (Direct3D 9)

La compatibilidad con sprites de punto en Direct3D 9 permite la representación de puntos (sistemas de partículas) de alto rendimiento. Las sprites de punto son generalizaciones de puntos genéricos que permiten representar formas arbitrarias según lo definido por las texturas.

Controles de representación primitiva de punto

Direct3D 9 admite parámetros adicionales para controlar la representación de sprites de punto (primitivos de punto). Estos parámetros permiten que los puntos tengan un tamaño variable y que se aplique un mapa de textura completo. El tamaño de cada punto viene determinado por un tamaño especificado por la aplicación combinado con una función basada en distancia calculada por Direct3D. La aplicación puede especificar el tamaño del punto como por vértice o estableciendo D3DRS_POINTSIZE, que se aplica a puntos sin un tamaño de vértice. El tamaño del punto se expresa en unidades de espacio de cámara, a excepción de cuando la aplicación pasa vértices flexibles de formato de vértice flexible (FVF) después de transformarse. En este caso, la función basada en distancia no se aplica y el tamaño del punto se expresa en unidades de píxeles en el destino de representación.

Las coordenadas de textura calculadas y usadas cuando los puntos de representación dependen de la configuración de D3DRS_POINTSPRITEENABLE. Cuando este valor se establece en TRUE, las coordenadas de textura se establecen para que cada punto muestre la textura completa. En general, esto solo es útil cuando los puntos son significativamente mayores que un píxel. Cuando D3DRS_POINTSPRITEENABLE se establece en FALSE, se usa la coordenada de textura de vértices de cada punto para todo el punto.

Cálculos de tamaño de punto

El tamaño del punto viene determinado por D3DRS_POINTSCALEENABLE. Si este valor se establece en FALSE, el tamaño de punto especificado por la aplicación se usa como tamaño de espacio de pantalla (después de la transformación). Los vértices que se pasan a Direct3D en el espacio de pantalla no tienen tamaños de punto calculados; el tamaño de punto especificado se interpreta como tamaño de espacio de pantalla.

Si D3DRS_POINTSCALEENABLE es TRUE, Direct3D calcula el tamaño del punto de espacio de pantalla según la fórmula siguiente. El tamaño de punto especificado por la aplicación se expresa en unidades de espacio de cámara.

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

En esta fórmula, el tamaño del punto de entrada, S i, es por vértice o el valor del D3DRS_POINTSIZE estado de representación. Los factores de escala de puntos, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B y D3DRS_POINTSCALE_C, se representan mediante los puntos A, B y C. El alto de la ventanilla, V h, es el miembro Height de la estructura D3DVIEWPORT9 que representa la ventanilla. D ₑ, la distancia desde el ojo hasta la posición (el ojo en el origen), se calcula tomando la posición del espacio ocular del punto (Xₑ, Yₑ, Zₑ) y realizando la siguiente operación.

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

El tamaño máximo de punto, Pmₐₓ, se determina tomando el menor tamaño del miembro MaxPointSize de la estructura D3DCAPS9 o del estado de representación de D3DRS_POINTSIZE_MAX. El tamaño mínimo de punto, Pmin, se determina consultando el valor de D3DRS_POINTSIZE_MIN. Por lo tanto, el tamaño final del punto de espacio de pantalla, S, se determina de la siguiente manera.

  • Si Ss > Pmₐₓ, entonces S = P mₐₓ
  • si S <Pmin, entonces S = P min
  • De lo contrario, S = S

Representación de puntos

Un punto de espacio de pantalla, P = ( X, Y, Z, W), del tamaño de la pantalla S se rasteriza como un cuadrilátero de los cuatro vértices siguientes.

(( 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))

Los atributos de color de vértice se duplican en cada vértice; por lo tanto, cada punto siempre se representa con colores constantes.

La asignación de índices de textura se controla mediante la configuración de estado de representación D3DRS_POINTSPRITEENABLE. Si D3DRS_POINTSPRITEENABLE se establece en FALSE, las coordenadas de textura de vértice se duplican en cada vértice. Si D3DRS_POINTSPRITEENABLE se establece en TRUE, las coordenadas de textura de los cuatro vértices se establecen en los valores siguientes.

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

Esto se muestra en el diagrama siguiente.

diagram of a square with labeled vertices for (u,v) and (x,y) coordinate values

Cuando el recorte está habilitado, los puntos se recortan de la siguiente manera. Si el vértice supera el intervalo de valores de profundidad - MinZ y MaxZ de la estructura D3DVIEWPORT9 - en el que se va a representar una escena, el punto existe fuera del frustum de vista y no se representa. Si el punto, teniendo en cuenta el tamaño del punto, está completamente fuera de la ventanilla en X e Y, el punto no se representa; se representan los puntos restantes. Es posible que la posición de punto esté fuera de la ventanilla en X o Y y siga siendo parcialmente visible.

Los puntos pueden o no ser recortados correctamente en planos de clip definidos por el usuario. Si D3DPMISCCAPS_CLIPPLANESCALEDPOINTS no se establece en el miembro PrimitiveMiscCaps de la estructura D3DCAPS9 , los puntos se recortan en planos de clip definidos por el usuario basándose únicamente en la posición del vértice, omidiendo el tamaño del punto. En este caso, los puntos escalados se representan completamente cuando la posición del vértice está dentro de los planos de clip y se descartan cuando la posición del vértice está fuera de un plano de recorte. Las aplicaciones pueden evitar posibles artefactos agregando una geometría de borde a planos de recorte que sea tan grande como el tamaño máximo del punto.

Si se establece el bit de D3DPMISCCAPS_CLIPPLANESCALEDPOINTS, los puntos escalados se recortan correctamente en planos de clip definidos por el usuario.

El procesamiento de vértices de hardware puede admitir o no el tamaño del punto. Por ejemplo, si se crea un dispositivo con D3DCREATE_HARDWARE_VERTEXPROCESSING en un dispositivo de capa de abstracción de hardware (HAL) (D3DDEVTYPE_HAL) que tiene el miembro MaxPointSize de la estructura D3DCAPS9 establecido en 1.0 o 0.0, todos los puntos son un solo píxel. Para representar sprites de punto de píxeles inferiores a 1,0, debes usar vértices FVF TL (transformados y iluminados) o procesamiento de vértices de software (D3DCREATE_SOFTWARE_VERTEXPROCESSING), en cuyo caso el tiempo de ejecución de Direct3D emula la representación de sprite de punto.

Se requiere un dispositivo de hardware que procesa vértices y admite sprites de punto ( MaxPointSize establecido en mayor que 1,0f) para realizar el cálculo de tamaño de los sprites no transformados y es necesario establecer correctamente el vértice por vértice o D3DRS_POINTSIZED3DRS_POINTSIZE para vértices TL.

Para obtener información sobre las reglas de representación de puntos, líneas y triángulos, vea Reglas de rasterización (Direct3D 9) .

Canalización de vértices