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


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

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

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

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

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

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

Координаты текстур можно объявлять в разных форматах, что позволяет устранять текстуры с помощью одной координаты или 4 координат текстуры (для проецируемых координат текстуры 2D). Дополнительные сведения см. в форматов координат текстуры (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
};

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