Tessellation (Direct3D 9)
Единица Tessellator
Модуль tessellator был улучшен. Теперь его можно использовать для:
- Выполните адаптивную тесселяции всех примитивов высшего порядка.
- Найдите значения смещения вершин из карты смещения и передайте их в шейдер вершин.
- Поддержка прямоугольника-исправления tessellation. Это указывается с помощью объявления вершин с помощью D3DDECLMETHOD_PARTIALU или D3DDECLMETHOD_PARTIALV. Если объявление вершин, содержащее эти методы, используется для рисования исправления треугольника, IDirect3Device9::D rawTriPatch завершится ошибкой. Дополнительные сведения о объявлениях вершин см. в D3DVERTEXELEMENT9.
В DirectX 8.x то, что называлось ORDER, было действительно степенью. В Direct3D 9 степень теперь указывается D3DDEGREETYPE.
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
Изменение типа градуса повлияло на две другие структуры.
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
Драйверы должны исправить ошибки компиляции, которые будут возникать из-за этого изменения при компиляции с новыми заголовками. Не нужно изменять функциональные возможности.
Адаптивная тесселлация
Адаптивная тесселлация может применяться к примитивам высокого порядка, включая N-исправления, исправления прямоугольника и исправления треугольников. Эта функция включена D3DRS_ENABLEADAPTIVETESSELLATION и адаптивно тесселлирует исправление на основе глубины вершины элемента управления в пространстве глаз.
Координаты z (Zi) вершин управления (Vi), которые преобразуются в пространство глаз (Zieye), выполняя точечный продукт с 4 вектором, используются в качестве значений глубины. Вектор 4D (Mdm) задается приложением с помощью четырех состояний отрисовки (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z и D3DRS_ADAPTIVETESS_W). Этот 4-вектор может быть третьим столбцом сцепленного мира и матрицы представления. Его также можно использовать для применения масштабирования к Zieye.
Предполагается, что функция вычисления уровня тесселяции Ti из Zieye считается (MaxTessellationLevel/Zieye), что означает, что MaxTessellationLevel — это уровень тесселяции на Z = 1 в пространстве глаз. MaxTessellationLevel равен значению, заданному IDirect3Device9::SetNPatchMode для N-исправлений и для исправлений RT, он равен pNumSegs. Затем уровень тесселяции зацепляется со значениями, определенными двумя дополнительными состояниями отрисовки D3DRS_MINTESSELLATIONLEVEL и D3DRS_MAXTESSELLATIONLEVEL, которые определяют минимальные и максимальные уровни тесселяции, к которым необходимо зажать. Ти для каждой вершины вдоль края исправлений усреднены, чтобы получить уровень тесселяции для этого края. Алгоритм вычисления Ti для исправлений прямоугольника, исправлений треугольников и N-исправлений отличается в том, какие вершины управления используются для вычисления уровня тесселяции.
Для прямоугольных исправлений с базой B-spline используются четыре вершины внешнего элемента управления. Например, с D3DORDER_CUBIC порядка: вершины (1,1) и (1,ширина-2) используются с pNumSegs[0], вершины (1,ширина-2) и (высота-2,высота-2) используются с pNumSegs[1], вершины (height-2,width-2) и (1,width-2) используются с pNumSegs[2], а вершины (2,1) и (1,1) используются с pNumSegs[3].
Для исправлений треугольника используются вершины угловых исправлений. С D3DORDER_CUBIC порядка: вершины (0) и (9) используются с pNumSegs[0], вершины (9) и (6) используются с pNumSegs[1] и вершинами (6) и (0) используются с pNumSegs[3].
Для N-исправлений используются вершины треугольника.
Для прямоугольников и треугольников с базой Bezier используются вершины управления углами.
Контроль скорости тесселяции для каждой вершины. Приложение может дополнительно предоставить одно положительное значение с плавающей запятой на вершину, которое можно использовать для управления скоростью тесселяции. Это предоставляется с помощью D3DDECLUSAGE_TESSFACTOR, для которого должен быть указан индекс использования 0, а тип входных данных должен быть D3DDECLTYPE_FLOAT1. Это умножается на уровень тесселяции вершин.
Математике
Уровень тесселяции (TE) для края e, представленный двумя вершинами управления (Ve1, Ve2), вычисляется, как показано ниже:
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)).
Ze1eye = Ve1 . Mdm
Ze2eye = Ve2 . Mdm
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye
Te = ( Te1 + Te2 ) / 2;
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
Если D3DRS_ENABLEADAPTIVETESSELLATION TRUE, примитивы треугольников (списки треугольников, вентиляторы, полосы) рисуются как N-исправления, IDirect3Device9::SetNPatchMode имеет значение меньше 1,0.
Изменения API
Новые состояния отрисовки:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL
D3DRS_MAXTESSELLATIONLEVEL // Float
D3DRS_MINTESSELLATIONLEVEL // Float
D3DRS_ADAPTIVETESS_X // Float
D3DRS_ADAPTIVETESS_Y // Float
D3DRS_ADAPTIVETESS_Z // Float
D3DRS_ADAPTIVETESS_W // Float
// D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL
// cannot be less than 1
И значения по умолчанию:
D3DRS_MAXTESSELLATIONLEVEL = 1.0f
D3DRS_MINTESSELLATIONLEVEL = 1.0f
D3DRS_ADAPTIVETESS_X = 0.0f
D3DRS_ADAPTIVETESS_Y = 0.0f
D3DRS_ADAPTIVETESS_Z = 1.0f
D3DRS_ADAPTIVETESS_W = 0.0f
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
Новые аппаратные крышки:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
Связанные разделы