Asignación de códigos FVF a una declaración de Direct3D 9 (Direct3D 9)

Esta tabla asigna códigos FVF a una estructura D3DVERTEXELEMENT9 .

FVF Tipo de datos Uso Índice de uso
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 y D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 y D3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) y D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) y D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm(n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

Declaraciones de vértice con D3DDECLUSAGE_POSITIONT

La presencia de un elemento de vértice con (D3DUSAGE_POSITIONT, 0) se usa para indicar al dispositivo que los datos de vértices que entran ya han estado a través del procesamiento de vértices (como un FVF con D3DFVF_XYZRHW conjunto de bits). En tiempo de dibujo, si la declaración establecida actualmente tiene un elemento con la semántica (D3DUSAGE_POSITIONT, 0), se omite todo el procesamiento de vértices (como si se hubiera establecido un FVF con D3DFVF_XYZRHW bit).

Hay algunas restricciones en las declaraciones de vértice con (D3DDECLUSAGE_POSITIONT, 0):

  • Solo se puede usar el flujo cero en estas declaraciones.
  • Los elementos de vértice deben ordenarse aumentando el desplazamiento de la secuencia.
  • El desplazamiento de flujo debe estar alineado con DWORD.
  • El mismo par (Uso, Índice de uso) solo debe aparecer una vez.
  • Solo se puede usar el método D3DDECLMETHOD_DEFAULT.
  • Otros elementos de vértice no pueden tener la semántica (D3DDECLUSAGE_POSITION, 0).

Además, hay algunas restricciones en esta declaración relacionadas con la versión del controlador de dispositivo. Estas restricciones están en vigor porque Direct3D envía estas declaraciones directamente al controlador sin realizar ninguna conversión.

Declaraciones de vértice sin D3DDECLUSAGE_POSITIONT

El tiempo de ejecución valida la creación de declaraciones. A continuación se muestran las reglas generales para qué declaraciones son legales.

  • Todos los elementos de vértice de una secuencia deben ser consecutivos y ordenados por desplazamiento.
  • El desplazamiento de flujo debe estar alineado con DWORD.
  • El mismo par (Uso, Índice de uso) solo debe aparecer una vez.
  • Si se establece el D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET,
    • Varios elementos de vértice pueden compartir el mismo desplazamiento en una secuencia.
    • Los elementos de vértice pueden ser de diferentes tipos que pueden ser de diferentes tamaños.
    • Los elementos de vértice se pueden superponer arbitrariamente. Por ejemplo, un elemento puede comenzar en una ubicación de una secuencia que es, al mismo tiempo, en medio de otro elemento.
    • Los elementos de vértice pueden tener desplazamiento de flujo en cualquier orden.
  • El número de elementos de vértice no puede ser mayor que 64.
  • UsageIndex debe estar en el intervalo [0-15].
  • Declaración, que se usa con drawPrimitive API, no debe tener elementos de vértice distintos de D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED o D3DDECLMETHOD_LOOKUP.
  • La declaración, que contiene D3DDECLMETHOD_LOOKUP o LOOKUPPRESAMPLED, solo se debe usar con la canalización de vértices programables.
  • La declaración, que se usa con la API DrawRectPatch/DrawTriPatch, no puede tener elementos de vértice con D3DDECLMETHOD_LOOKUPPRESAMPLED o D3DDECLMETHOD_LOOKUP.
  • La declaración debe tener solo un elemento con D3DDECLMETHOD_LOOKUP o método D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • La declaración con D3DDECLMETHOD_LOOKUP o D3DDECLMETHOD_LOOKUPPRESAMPLED no debe tener elementos distintos de D3DDECLMETHOD_DEFAULT, ya que la asignación de desplazamiento solo se realiza para N revisiones.
  • Los elementos de vértice con D3DDECLMETHOD_LOOKUP o D3DDECLMETHOD_LOOKUPPRESAMPLED solo se pueden usar con la semántica (D3DDECLUSAGE_SAMPLE, n) y viceversa.
  • Si un elemento de vértice con D3DDECLMETHOD_LOOKUP método tiene un índice de flujo y un desplazamiento de un elemento de vértice ya existente, este elemento de vértice debe tener el mismo tipo de datos.
  • Un elemento de vértice con el método D3DDECLMETHOD_LOOKUP debe tener el tipo de datos D3DDECLTYPE_FLOAT2/3/4
  • Los elementos de vértice con tipos D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU y D3DDECLMETHOD_PARTIALV deben tener un desplazamiento de un elemento de vértice con un tipo de datos compatible.
  • Un elemento de vértice con el método D3DDECLMETHOD_UV o D3DDECLMETHOD_LOOKUPPRESAMPLED debe tener el tipo D3DDECLTYPE_UNUSED, el índice de flujo cero y el desplazamiento de flujo cero.
  • Las declaraciones con métodos D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU y D3DDECLMETHOD_PARTIALV solo se pueden usar con DrawRectPatch.
  • Los D3DDECLUSAGE_TESSFACTOR de uso solo deben usarse con el tipo de datos D3DDECLTYPE_FLOAT1 y el índice de uso 0.
  • Cuando se usa una declaración para la teselación (DrawRectPatch, DrawTriPatch, N-patches), el tipo de datos debe ser menor o igual que D3DDECLTYPE_SHORT4.
  • Las declaraciones que contienen métodos que requieren determinadas funcionalidades del dispositivo (por ejemplo, asignación de desplazamiento, revisiones rt) solo se pueden crear si el dispositivo los admite.
  • Una declaración de vértice utilizada para dibujar puntos y líneas no puede tener métodos distintos de D3DDECLMETHOD_DEFAULT.
  • Las declaraciones que se pueden crear también dependen de las funcionalidades del controlador.

Consideraciones sobre controladores

Controladores anteriores a Direct3D 9

  • La declaración de entrada debe ser traducible a un FVF válido (tienen el mismo orden de los elementos de vértice y sus tipos de datos).
  • No se permiten espacios en coordenadas de textura. Esto significa que si hay un elemento de vértice con (D3DDECLUSAGE_TEXCOORD, n), también debe haber un elemento de vértice con (D3DDECLUSAGE_TEXCOORD, n-1).

Controladores de Direct3D 9 sin compatibilidad con el sombreador de píxeles versión 3

  • La declaración de entrada debe ser traducible a un FVF válido (tienen el mismo orden de los elementos de vértice y sus tipos de datos).
  • Se permiten espacios en las coordenadas de textura.

Controladores de Direct3D 9 con compatibilidad con el sombreador de píxeles versión 3

Se permiten declaraciones más generales.

  • Los elementos de vértice pueden estar en orden arbitrario y pueden tener cualquier tipo de datos.
  • Varios elementos de vértice pueden compartir el mismo desplazamiento de secuencia y ser de un tipo diferente al mismo tiempo si el dispositivo establece D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET.

Uso de declaración de vértices con la canalización de vértices programables

  • En tiempo de dibujo, Direct3D busca la misma combinación de "uso: índice de uso" en la declaración de vértice actual y la función del sombreador de vértices actual. Cuando se encuentra la combinación, el registro de la función de sombreador DCL se usa como destino para el elemento de vértice.
  • Cuando un elemento de vértice de la declaración de vértice actual tiene un uso que no se encuentra en el sombreador de vértices actual, se omite ese elemento de vértice.
  • Cuando se usa una versión de sombreadores de vértices inferior a 2.0, todas las semánticas mencionadas en el código del sombreador deben estar presentes en la declaración enlazada en tiempo de dibujo. Al usar sombreadores de vértices 2.0 y versiones posteriores, esta restricción que permite a las aplicaciones usar declaraciones de vértices diferentes con el mismo sombreador de vértices no existe. Esto resulta útil cuando un sombreador de vértices lee los datos de entrada en función de las condiciones estáticas. Los registros del sombreador de vértices no se inicializan debido a esto tendrán valores no definidos.

Hay restricciones adicionales al usar con el procesamiento de vértices de hardware en un controlador directX 8:

  • Los elementos de vértice no se pueden superponer ni compartir el mismo desplazamiento.
  • Los tipos de datos se limitan a lo que el controlador DirectX 8 puede comprender.

La instrucción CreateVertexDeclaration podría producir un error si la declaración proporcionada no se puede convertir en una declaración de estilo DirectX de 8. En el caso de un dispositivo de modo mixto, este error se producirá en el momento de Draw* porque es la única vez que se puede saber si este sombreador se usa con el procesamiento de vértices de hardware o software.

Uso de declaración de vértices con la canalización de función fija

Solo se pueden usar declaraciones que cumplan las reglas siguientes:

  • No debe haber huecos entre los elementos de vértice (no se permitió SKIP en una declaración de DirectX 8, que se usa para la canalización de funciones fijas).
  • Semántica (D3DDECLUSAGE_POSITION, 0) debe especificarse y debe tener D3DDECLTYPE_FLOAT3 tipo de datos.
  • Un elemento de vértice con D3DDECLMETHOD_UV de método debe especificar D3DDECLUSAGE_TEXCOORD de uso o D3DDECLUSAGE_BLENDWEIGHT.
  • Un elemento de vértice con método D3DDECLMETHOD_PARTIALU, _PARTIALV o _CROSSUV solo se puede usar con D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT o _TEXCOORD, y debe usar D3DDECLTYPE_FLOAT3 de tipo de entrada.

Cuando se usa una declaración con el procesamiento de vértices de hardware en un controlador de DirectX 8, el entorno de ejecución de Direct3D lo convierte en una declaración de estilo DirectX 8 con las reglas siguientes:

  • Los elementos de vértice no pueden compartir el mismo desplazamiento en una secuencia y no se pueden superponer.
  • El tipo de datos debe ser menor o igual que D3DDECLTYPE_SHORT4.
  • Solo se permiten los métodos siguientes: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV y D3DDECLMETHOD_UV
  • La asignación entre una declaración de Direct3D 9 y una declaración de Direct3D 8 (Direct3D 9) muestra qué semántica de Direct3D 9 se podría convertir en declaración de estilo DirectX 8. Usage y UsageIndex se convierten en un valor de registro.
  • Si hay n elementos de vértice en una declaración y 0 - m (m < n) se asigna a un FVF (elementos descritos en la asignación entre una declaración de Direct3D y códigos FVF (Direct3D 9)), pero m + 1 no, entonces:
    • Si alguno de los elementos de vértice m + 2 hasta n - 1 se asigna a FVF/dx8decl, la declaración no es válida.
    • Los elementos de 0 a m se convierten (por el tiempo de ejecución para los controladores de DirectX 8 y anteriores, y por los controladores de Direct3D 9) mediante la asignación entre una declaración de Direct3D y los códigos FVF (Direct3D 9), m + 1, m + 2 hasta n - 1 se asignan a texcoord contiguo(k), texcoord(k+1), a partir de cualquier texcoord en los elementos 0 - m.
    • Se supone que el tipo de datos de un texcoord asignado es float[1234] reemplazando cualquier tipo de datos que contenga el elemento actual (pero el mismo tamaño). Por lo tanto, el tipo de datos existente puede ser algo que no está en asignación entre una declaración de Direct3D y códigos FVF (Direct3D 9).
    • Si k alcanza 8, la declaración no es válida para FVF/dx8decl.
    • Si se han producido asignaciones a texcoords, se requiere que toda la declaración no tenga elementos con el método de generación distinto de DEFAULT o la declaración no es válida para FVF/dx8decl.

Uso de declaraciones de vértices con ProcessVertices

Se podría usar una declaración de vértice para describir la salida de ProcessVertices. Esta declaración debe cumplir las siguientes reglas:

  • Solo se debe usar la secuencia 0.
  • Solo se permiten métodos D3DDECLMETHOD_DEFAULT.
  • Solo se pueden usar D3DDECLTYPE_FLOATn o tipos de datos D3DDECLTYPE_D3DCOLOR.
  • Los elementos de vértice no pueden compartir el mismo desplazamiento ni superponerse entre sí.
  • No se requieren elementos de vértice con (D3DDECLUSAGE_POSITION, 0) o (D3DDECLUSAGE_POSITIONT,0).
  • Los elementos de vértice con (D3DDECLUSAGE_POSITION, 0) y (D3DDECLUSAGE_POSITIONT,0) no pueden estar presentes en la misma declaración.
  • El sombreador de vértices actual debe ser la versión 3.0 o posterior cuando se usa dicha declaración.

Declaración de vértices