dev->SetRenderState(D3DRS_POINTSIZE, 0x7FA03001);
dev->SetRenderState(D3DRS_MAXTESSELLATIONLEVEL, *(DWORD*)(&floatTesselationFactor));
Есть одна небольшая проблема. Если у вас меняется тип выводимой геометрии (например, выводили треугольники, а дальше пойдут стрипы), то необходимо "перезагрузить" тесселятор. Для этого, отключаем его:
dev->SetRenderState(D3DRS_POINTSIZE, 0x7FA03000);
dev->SetRenderState(D3DRS_ENABLEADAPTIVETESSELLATION, 0);
После этого, сразу включаем и настраиваем кодом выше.
Но это ещё не всё! Нам нужно поменять вершинный шейдер. Теперь на его входе мы будем получать не просто информацию об одной вершине, но информацию сразу о трёх вершинах текущего треугольника, а также барицентрические координаты текущего положения в нём.
Поэтому, если у вас на входе например, вот такая структура:
struct VS_INPUT
{
float4 position: POSITION0,
float2 texcoord: TEXCOORD0
};
То её следует поменять на такую:
struct VS_INPUT
{
float3 barycentric: BLENDWEIGHT0,
float4 position1: POSITION0,
float2 texcoord1: TEXCOORD0,
float4 position2: POSITION4,
float2 texcoord2: TEXCOORD4,
float4 position3: POSITION8,
float2 texcoord3: TEXCOORD8
};
Теперь, чтобы найти параметры вершины для текущего положения следует использовать такой код: