Тесселяции (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
Связанные темы