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


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 

конвейер вершин