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


Тесселяции (Direct3D 9)

Единица тесселлатора

Модуль тесселлатора был улучшен. Теперь его можно использовать для:

  • Выполнение адаптивной тесселяции всех примитивов более высокого порядка.
  • Найдите значения смещения вершин на карте смещения и передайте их шейдеру вершин.
  • Поддержка тесселяции прямоугольников и исправлений. Это указывается с помощью объявления вершины с помощью D3DDECLMETHOD_PARTIALU или D3DDECLMETHOD_PARTIALV. Если объявление вершины, содержащее эти методы, используется для рисования исправления треугольника, IDirect3DDevice9::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 равен значению, заданному IDirect3DDevice9::SetNPatchMode для N-patches, а для RT-patches — pNumSegs. Затем уровень тесселяции прижимается к значениям, определяемым двумя дополнительными состояниями отрисовки D3DRS_MINTESSELLATIONLEVEL и D3DRS_MAXTESSELLATIONLEVEL, которые определяют минимальный и максимальный уровни тесселяции, к которым необходимо прижаться. Значения Ti для каждой вершины вдоль края патч усреднены для получения уровня тесселяции для этого края. Алгоритм вычисления Ti для исправлений прямоугольника, патчей треугольников и N-исправлений отличается тем, какие вершины управления используются для вычисления уровня тесселяции.

Для прямоугольных исправлений с базой B-сплайна используются четыре крайние вершины управления. Например, при D3DORDER_CUBIC порядке: вершины (1,1) и (1,ширина-2) используются с pNumSegs[0], вершины (1,ширина-2) и (высота-2,высота-2) используются с pNumSegs[1], вершины (высота-2,ширина-2) и (1,ширина-2) используются с pNumSegs[2], а вершины (2,1) и (1,1) используются с pNumSegs[3].

Для патчей треугольника используются вершины угловых исправлений. В D3DORDER_CUBIC порядке: вершины (0) и (9) используются с pNumSegs[0], вершины (9) и (6) используются с pNumSegs[1], а вершины (6) и (0) используются с pNumSegs[3].

Для N-исправлений используются вершины треугольника.

Для прямоугольников и треугольников с основанием Безье используются вершины управления углами.

Управление скоростью тесселяции для каждой вершины. При необходимости приложение может предоставить одно положительное значение с плавающей запятой для каждой вершины, которое можно использовать для управления скоростью тесселяции. Это предоставляется с помощью 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 

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