Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта таблица сопоставляет коды 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 или выше, если используется такое объявление.
Связанные разделы