Сопоставление кодов 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 или более позднюю.
Связанные темы