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


Сопоставление кодов 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.
  • Та же пара (использование, индекс использования) должна быть указана только один раз.
  • Можно использовать только метод D3DDECLMETHOD_DEFAULT.
  • Другие элементы вершины не могут иметь семантику (D3DDECLUSAGE_POSITION, 0).

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

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

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

  • Все элементы вершин для потока должны быть последовательными и отсортированы по смещениям.
  • Смещение потока должно быть выровнено по границе DWORD.
  • Та же пара (использование, индекс использования) должна быть указана только один раз.
  • Если задан 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-patches), можно создавать только в том случае, если устройство их поддерживает.
  • Объявление вершин, используемое для рисования точек и линий, не может иметь методы, отличные от 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. Для устройства со смешанным режимом этот сбой произойдет во время отрисовки, так как это единственный момент, когда можно определить, используется ли этот шейдер с аппаратной или программной обработкой вершин.

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

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

  • Между элементами вершин не должно быть пробелов (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. Использование и 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 или выше, если используется такое объявление.

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