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


Исправлены коды FVF функции (Direct3D 9)

Код FVF описывает содержимое вершин, хранящихся с чередованием в одном потоке данных. Обычно он указывает данные, обрабатываемые конвейером обработки вершин фиксированной функции. Это объявление вершин более старого стиля; Сведения о текущем стиле объявления вершин см. в разделе D3DVERTEXELEMENT9.

Приложения Direct3D могут определять вершины модели несколькими разными способами. Поддержка гибких определений вершин, также известных как гибкие форматы вершин или коды гибких форматов вершин, позволяет приложению использовать только необходимые компоненты вершин, устраняя те компоненты, которые не используются. Используя только необходимые компоненты вершины, приложение может экономить память и свести к минимуму пропускную способность обработки, необходимую для отрисовки моделей. Вы описываете форматирование вершин с помощью сочетания кодов D3DFVF .

Спецификация FVF включает форматы для размера точек, заданные D3DFVF_PSIZE. Этот размер выражается в единицах пространства камеры для не преобразованных и освещенных вершин (TL), а также в единицах пространства устройства для вершин TL.

Методы отрисовки интерфейса IDirect3DDevice9 предоставляют приложениям C++ методы, которые принимают сочетание этих флагов и используют их для определения способа отрисовки примитивов. По сути, эти флаги сообщают системе, какие компоненты вершин — положение, весовые коэффициенты смешивания вершин, обычные значения, цвета, количество и формат координат текстуры — приложение использует и, косвенно, какие части конвейера отрисовки вы хотите применить к ним в Direct3D. Кроме того, наличие или отсутствие определенного флага формата вершин сообщает системе о том, какие поля компонентов вершин присутствуют в памяти и которые вы опустили.

Чтобы определить ограничения устройств, можно запросить у устройства значения D3DFVFCAPS_DONOTSTRIPELEMENTS и D3DFVFCAPS_TEXCOORDCOUNTMASK в члене FVFCaps D3DCAPS9.

Координаты текстур можно объявлять в разных форматах, что позволяет обращаться к текстурам, используя всего одну координату или четыре координаты текстуры (для двухd-проецируемых координат текстур). Дополнительные сведения см. в разделе Форматы координат текстуры (Direct3D 9). Используйте D3DFVF_TEXCOORDSIZEN набор макросов для создания битовых шаблонов, определяющих форматы координат текстуры, используемые в формате вершин.

Ни в каких приложениях не будет использоваться каждый компонент. Взаимные однородные поля W (RHW) и нормальные вершины являются взаимоисключающими. Большинство приложений не будет пытаться использовать все восемь наборов координат текстур, но Direct3D имеет такую емкость. Существует несколько ограничений, которые можно использовать с другими флагами. Например, нельзя использовать флаги D3DFVF_XYZ и D3DFVF_XYZRHW вместе, так как это указывает на то, что приложение описывает положение вершины как с нетрансформированных, так и преобразованных вершин.

Для использования индексированного наложения вершин флаг D3DFVF_LASTBETA_UBYTE4 должен отображаться в конце объявления FVF. Наличие этого флага указывает, что пятый вес смешивания будет рассматриваться как DWORD, а не как float. Дополнительные сведения см. в разделе Индексированное наложение вершин (Direct3D 9).

В следующих примерах кода показана разница между кодом FVF, использующим флаг D3DFVF_LASTBETA_UBYTE4, и кодом, в котором нет. Флаг D3DFVF_XYZB3 присутствует при использовании четырех индексов смешивания, так как вы всегда вычитаете сумму первых трех из числа один, чтобы получить четвертый (blend₄ = 1 - (blend₁ + blend₃)).

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

FVF, определенный ниже, использует флаг D3DFVF_LAST_UBYTE4.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

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