Teselación (Direct3D 9)
Unidad de teselador
La unidad de teselador se ha mejorado. Ahora puede usarlo para:
- Realiza la teselación adaptable de todos los primitivos de orden superior.
- Busque los valores de desplazamiento por vértice de un mapa de desplazamiento y páselos a un sombreador de vértices.
- Admite teselación rectángulo-patch. Esto se especifica mediante una declaración de vértice mediante D3DDECLMETHOD_PARTIALU o D3DDECLMETHOD_PARTIALV. Si se usa una declaración de vértice que contiene estos métodos para dibujar una revisión de triángulo, se producirá un error en IDirect3DDevice9::D rawTriPatch . Para obtener más información sobre las declaraciones de vértices, vea D3DVERTEXELEMENT9.
En DirectX 8.x, lo que se llamaba ORDER era realmente el grado. En Direct3D 9, el grado ahora se especifica mediante D3DDEGREETYPE.
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
El cambio en el tipo de grado afectó a otras dos estructuras.
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
Los controladores deben corregir los errores de compilación resultantes de este cambio cuando se compilan con los nuevos encabezados. No es necesario cambiar ninguna funcionalidad.
Teselación adaptable
La teselación adaptable se puede aplicar a primitivos de orden alto, incluidas N-parches, revisiones de rectángulo y revisiones de triángulos. Esta característica está habilitada por el D3DRS_ENABLEADAPTIVETESSELLATION y tesela un parche de forma adaptable, en función del valor de profundidad del vértice de control en el espacio ocular.
Las coordenadas z (Zi) de los vértices de control (Vi), que se transforman en espacio ocular (Zieye) realizando un producto de punto con un vector 4, se usan como valores de profundidad. La aplicación especifica el vector 4D (Mdm) mediante cuatro estados de representación (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z y D3DRS_ADAPTIVETESS_W). Este vector 4 podría ser la tercera columna de las matrices de vista y mundo concatenado. También se puede usar para aplicar una escala a Zieye.
Se supone que la función para calcular un nivel de teselación Ti de Zieye es (MaxTessellationLevel/Zieye), lo que significa que MaxTessellationLevel es el nivel de teselación en Z = 1 en el espacio ocular. MaxTessellationLevel es igual a un valor establecido por IDirect3DDevice9::SetNPatchMode para N-patches y, para revisiones rt, es igual a pNumSegs. A continuación, el nivel de teselación se fija en valores, definidos por los dos estados de representación adicionales D3DRS_MINTESSELLATIONLEVEL y D3DRS_MAXTESSELLATIONLEVEL, que definen los niveles de teselación mínimo y máximo a los que se va a fijar. Las ti de cada vértice a lo largo de un borde de una revisión se calculan para obtener un nivel de teselación para ese borde. El algoritmo para calcular Ti para revisiones de rectángulo, revisiones de triángulos y revisiones N difiere en lo que se usan los vértices de control para calcular el nivel de teselación.
Para las revisiones del rectángulo con una base B-spline, se usan los cuatro vértices de control más externos. Por ejemplo, con D3DORDER_CUBIC orden: los vértices (1,1) y (1,width-2) se usan con pNumSegs[0], vértices (1,ancho-2) y (alto-2,alto-2) se usan con pNumSegs[2] 1], los vértices (alto-2,ancho-2) y (1,ancho-2) se usan con pNumSegs[2] y vértices (2,1) y (1,1) se usan con pNumSegs[3].
Para las revisiones del triángulo, se usan los vértices de revisión de esquina. Con D3DORDER_CUBIC orden: los vértices (0) y (9) se usan con pNumSegs[0], vértices (9) y (6) se usan con pNumSegs[1] y vértices (6) y (0) se usan con pNumSegs[3].
En el caso de las n revisiones, se usan los vértices de triángulo.
Para el rectángulo y las revisiones de triángulos con una base Bezier, se usan los vértices de control de esquina.
Control de velocidad de teselación por vértice. Opcionalmente, una aplicación puede proporcionar un único valor de punto flotante positivo por vértice, que se puede usar para controlar la velocidad de teselación. Esto se proporciona mediante el D3DDECLUSAGE_TESSFACTOR, para el que el índice de uso debe ser 0 y el tipo de entrada debe ser D3DDECLTYPE_FLOAT1. Esto se multiplica por el nivel de teselación por vértice.
Matemáticas
El nivel de teselación (Te) de un borde e, representado por dos vértices de control (Ve1, Ve2), se calcula como se muestra a continuación:
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)).
Ze1eye = Ve1 . Mdm
Ze2eye = Ve2 . Mdm
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye
Te = ( Te1 + Te2 ) / 2;
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
Cuando D3DRS_ENABLEADAPTIVETESSELLATION es TRUE, los primitivos de triángulos (listas de triángulos, ventiladores, tiras) se dibujan como N-parches, IDirect3DDevice9::SetNPatchMode tiene un valor establecido inferior a 1,0.
Cambios en la API
Nuevos estados de representación:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL
D3DRS_MAXTESSELLATIONLEVEL // Float
D3DRS_MINTESSELLATIONLEVEL // Float
D3DRS_ADAPTIVETESS_X // Float
D3DRS_ADAPTIVETESS_Y // Float
D3DRS_ADAPTIVETESS_Z // Float
D3DRS_ADAPTIVETESS_W // Float
// D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL
// cannot be less than 1
Y sus valores predeterminados:
D3DRS_MAXTESSELLATIONLEVEL = 1.0f
D3DRS_MINTESSELLATIONLEVEL = 1.0f
D3DRS_ADAPTIVETESS_X = 0.0f
D3DRS_ADAPTIVETESS_Y = 0.0f
D3DRS_ADAPTIVETESS_Z = 1.0f
D3DRS_ADAPTIVETESS_W = 0.0f
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
Nuevos límites de hardware:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
Temas relacionados