Поделиться через


Сопоставление кодов FVF с объявлением Direct3D 9 (Direct3D 9)

В этой таблице коды FVF сопоставляются со структурой D3DVERTEXELEMENT9 .

FVF Тип данных Использование Индекс использования
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 и D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 и 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) и D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) и 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

 

Объявления вершин с D3DDECLUSAGE_POSITIONT

Наличие элемента вершины с (D3DUSAGE_POSITIONT, 0) указывает устройству, что поступающие данные вершин уже прошли обработку вершины (например, FVF с D3DFVF_XYZRHW битом). Если во время рисования в объявлении текущего набора имеется элемент с семантикой (D3DUSAGE_POSITIONT, 0), обработка всей вершины пропускается (как если бы был задан FVF с D3DFVF_XYZRHW битом).

Существуют некоторые ограничения для объявлений вершин с (D3DDECLUSAGE_POSITIONT, 0):

  • В таких объявлениях можно использовать только нулевой поток.
  • Элементы вершин должны быть отсортированы путем увеличения смещения потока.
  • Смещение потока должно быть выровнено по DWORD.
  • Та же пара (Usage, Usage Index) должна быть указана только один раз.
  • Можно использовать только метод D3DDECLMETHOD_DEFAULT.
  • Другие элементы вершины не могут иметь семантику (D3DDECLUSAGE_POSITION, 0).

Кроме того, существуют некоторые ограничения на такое объявление, связанные с версией драйвера устройства. Эти ограничения действуют, так как Direct3D отправляет такие объявления непосредственно в драйвер без каких-либо преобразований.

Объявления вершин без D3DDECLUSAGE_POSITIONT

Среда выполнения проверяет создание объявлений. Ниже приведены общие правила того, какие объявления являются законными.

  • Все элементы вершин для потока должны быть последовательными и отсортированы по смещению.
  • Смещение потока должно быть выровнено по DWORD.
  • Та же пара (Usage, Usage Index) должна быть указана только один раз.
  • Если D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET задан, то
    • Несколько элементов вершин могут совместно использовать одно и то же смещение в потоке.
    • Все элементы вершин могут быть разных типов, которые могут быть разных размеров.
    • Элементы вершин могут перекрываться произвольно. Например, один элемент может начинаться в расположении потока, который одновременно находится в середине другого элемента.
    • Элементы вершины могут иметь смещение потока в любом порядке.
  • Число элементов вершины не может быть больше 64.
  • UsageIndex должен находиться в диапазоне [0–15].
  • Объявление, используемое с API DrawPrimitive, не должно содержать элементов вершин, отличных от D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED или D3DDECLMETHOD_LOOKUP.
  • Объявление, содержащее D3DDECLMETHOD_LOOKUP или LOOKUPPRESAMPLED, следует использовать только с программируемым конвейером вершин.
  • Объявление, используемое с API DrawRectPatch/DrawTriPatch, не может содержать элементы вершины с D3DDECLMETHOD_LOOKUPPRESAMPLED или D3DDECLMETHOD_LOOKUP.
  • Объявление должно содержать только один элемент с методом D3DDECLMETHOD_LOOKUP или D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • Объявление с D3DDECLMETHOD_LOOKUP или D3DDECLMETHOD_LOOKUPPRESAMPLED не должно содержать элементов, отличных от D3DDECLMETHOD_DEFAULT, так как сопоставление смещения выполняется только для N-исправлений.
  • Элементы вершин с D3DDECLMETHOD_LOOKUP или D3DDECLMETHOD_LOOKUPPRESAMPLED можно использовать только с семантикой (D3DDECLUSAGE_SAMPLE, n) и наоборот.
  • Если элемент вершины с методом D3DDECLMETHOD_LOOKUP имеет индекс потока и смещение уже существующего элемента вершины, этот элемент вершины должен иметь тот же тип данных.
  • Элемент вершины с методом D3DDECLMETHOD_LOOKUP должен иметь тип данных D3DDECLTYPE_FLOAT2/3/4.
  • Элементы вершин с типами D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU и D3DDECLMETHOD_PARTIALV должны иметь смещение элемента вершины с совместимым типом данных.
  • Элемент вершины с методом D3DDECLMETHOD_UV или D3DDECLMETHOD_LOOKUPPRESAMPLED должен иметь тип D3DDECLTYPE_UNUSED, нулевой индекс потока и ноль смещения потока.
  • Объявления с методами D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU и D3DDECLMETHOD_PARTIALV можно использовать только с DrawRectPatch.
  • D3DDECLUSAGE_TESSFACTOR использования следует использовать только с типом данных D3DDECLTYPE_FLOAT1 и индексом использования 0.
  • Если для тесселяции используется объявление (DrawRectPatch, DrawTriPatch, N-patches), тип данных должен быть меньше или равен D3DDECLTYPE_SHORT4.
  • Объявления, содержащие методы, требующие определенных возможностей устройства (например, сопоставление смещения, RT-исправления), можно создавать только в том случае, если устройство поддерживает их.
  • Объявление вершин, используемое для рисования точек и линий, не может иметь методы, кроме D3DDECLMETHOD_DEFAULT.
  • Объявления, которые могут быть созданы, также зависят от возможностей драйвера.

Рекомендации по драйверам

Драйверы, предшествующие Direct3D 9

  • Входное объявление должно быть преобразовано в допустимый FVF (имеют одинаковый порядок элементов вершин и их типы данных).
  • Пробелы в координатах текстуры не допускаются. Это означает, что если имеется элемент вершины с (D3DDECLUSAGE_TEXCOORD, n), то также должен быть элемент вершины с (D3DDECLUSAGE_TEXCOORD, n-1).

Драйверы Direct3D 9 без поддержки пиксельного шейдера версии 3

  • Входное объявление должно быть преобразовано в допустимый FVF (имеют одинаковый порядок элементов вершин и их типы данных).
  • Допускаются пробелы в координатах текстуры.

Поддержка драйверов Direct3D 9 с пиксельным шейдером версии 3

Допускаются более общие объявления.

  • Элементы вершин могут находиться в произвольном порядке и могут иметь любые типы данных.
  • Несколько элементов вершин могут совместно использовать одно и то же смещение потока и иметь другой тип в одно и то же время, если D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET задано устройством.

Использование объявления вершин с помощью программируемого конвейера вершин

  • Во время рисования Direct3D ищет ту же комбинацию "использование — индекс использования" в текущем объявлении вершины и текущей функции шейдера вершин. При обнаружении комбинации в качестве назначения для элемента вершины используется регистр из функции шейдера DCL.
  • Если элемент вершины в текущем объявлении вершин имеет использование, которое не найдено в текущем шейдере вершин, этот элемент вершины игнорируется.
  • При использовании вершинных шейдеров версии ниже 2.0 вся семантика, указанная в коде шейдера, должна присутствовать в объявлении, привязанном во время рисования. При использовании шейдеров вершин версии 2.0 и более поздних версий это ограничение, позволяющее приложениям использовать различные объявления вершин с одинаковым шейдером вершин, не существует. Это полезно, когда вершинный шейдер считывает входные данные на основе статических условий. Регистры вершинного шейдера не инициализированы из-за этого будут иметь неопределенные значения.

Существуют дополнительные ограничения при использовании с аппаратной обработкой вершин в драйвере DirectX 8:

  • Элементы вершины не могут перекрываться или совместно использовать одно и то же смещение.
  • Типы данных ограничены тем, что может понять драйвер DirectX 8.

CreateVertexDeclaration может завершиться ошибкой, если предоставленное объявление не может быть преобразовано в объявление в стиле DirectX 8. Для устройства со смешанным режимом этот сбой произойдет во время Draw*, так как это единственный раз, когда можно узнать, используется ли этот шейдер с аппаратной или программной обработкой вершин.

Использование объявления вершин с конвейером фиксированной функции

Можно использовать только объявления, которые соответствуют следующим правилам:

  • Между элементами вершин не должно быть пробелов (skip не разрешено в объявлении DirectX 8, которое используется для конвейера фиксированной функции).
  • Необходимо указать семантику (D3DDECLUSAGE_POSITION, 0) и иметь D3DDECLTYPE_FLOAT3 тип данных.
  • Элемент вершины с D3DDECLMETHOD_UV метода должен указывать D3DDECLUSAGE_TEXCOORD использования или D3DDECLUSAGE_BLENDWEIGHT.
  • Элемент вершины с D3DDECLMETHOD_PARTIALU, _PARTIALV или _CROSSUV метода можно использовать только с D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT или _TEXCOORD и должен использовать тип ввода D3DDECLTYPE_FLOAT3.

Если объявление используется с аппаратной обработкой вершин в драйвере DirectX 8, среда выполнения Direct3D преобразует его в объявление в стиле DirectX 8 со следующими правилами:

  • Элементы вершины не могут совместно использовать одно и то же смещение в потоке и не могут перекрываться.
  • Тип данных должен быть меньше или равен D3DDECLTYPE_SHORT4.
  • Допустимы только следующие методы: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV и D3DDECLMETHOD_UV
  • Сопоставление между объявлением Direct3D 9 и объявлением Direct3D 8 (Direct3D 9) показывает, какую семантику Direct3D 9 можно преобразовать в объявление в стиле DirectX 8. Usage и UsageIndex преобразуются в регистровое значение.
  • Если в объявлении имеется n элементов вершин и 0–m (m < n) сопоставляется с FVF (элементы, описанные в разделе Сопоставление между объявлением Direct3D и кодами FVF (Direct3D 9)), а m + 1 — нет, то:
    • Если какой-либо элемент из m + 2 до n - 1 элемента вершины сопоставляется с FVF/dx8decl, объявление является недопустимым.
    • Элементы от 0 до m преобразуются (средой выполнения для драйверов DirectX 8 и более ранних версий; и драйверами Direct3D 9), используя сопоставление между объявлением Direct3D и кодами FVF (Direct3D 9), m + 1, m + 2, пока n - 1 не будут сопоставлены с смежными texcoord(k), texcoord(k+1), начиная с любого texcoord в элементах 0 - m.
    • Предполагается, что тип данных в сопоставленном texcoord — float[1234], заменяющий любой тип данных, который содержит текущий элемент (но такого же размера). Таким образом, существующий тип данных может не находиться в сопоставлении между объявлением Direct3D и кодами FVF (Direct3D 9).
    • Если k достигает 8, объявление недопустимо для FVF/dx8decl.
    • При возникновении каких-либо сопоставлений с texcoords все объявление не должно содержать элементов с методом создания, кроме DEFAULT, или объявление недопустимо для FVF/dx8decl.

Использование объявлений вершин с ProcessVertices

Объявление вершины можно использовать для описания выходных данных ProcessVertices. Такое объявление должно соответствовать следующим правилам:

  • Необходимо использовать только поток 0.
  • Разрешены только D3DDECLMETHOD_DEFAULT методы.
  • Можно использовать только типы данных D3DDECLTYPE_FLOATn или D3DDECLTYPE_D3DCOLOR.
  • Элементы вершины не могут совместно использовать одно и то же смещение или перекрываться друг с другом.
  • Элементы вершин с (D3DDECLUSAGE_POSITION, 0) или (D3DDECLUSAGE_POSITIONT,0) не требуются.
  • Элементы вершин с (D3DDECLUSAGE_POSITION, 0) и (D3DDECLUSAGE_POSITIONT,0) не могут присутствовать в одном объявлении.
  • При использовании такого объявления текущий шейдер вершин должен иметь версию 3.0 или более позднюю.

Объявление вершин