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


Использование примитивов Higher-Order (Direct3D 9)

В этом разделе показано, как использовать в приложении примитивы более высокого порядка.

Определение поддержки примитива Higher-Order

Элемент DevCaps структуры D3DCAPS9 можно запросить, чтобы определить уровень поддержки операций с примитивами более высокого порядка. В следующей таблице перечислены возможности устройств, связанные с примитивами более высокого порядка в Direct3D 9.

Возможность устройства Описание
D3DDEVCAPS_NPATCHES Устройство поддерживает N-патчи и основано на изогнутых треугольниках PN (особый вид кубических треугольников Безье).
D3DDEVCAPS_QUINTICRTPATCHES Устройство поддерживает кривые Безье и B-сплайны.
D3DDEVCAPS_RTPATCHES Устройство поддерживает прямоугольные и треугольные исправления (RT-patches).
D3DDEVCAPS_RTPATCHHANDLEZERO Исправления RT можно эффективно нарисовать с использованием нуля дескрипторов.

 

Обратите внимание, что D3DDEVCAPS_RTPATCHHANDLEZERO не означает, что можно нарисовать исправление с нулевым маркером. Всегда можно нарисовать нулевое исправление дескриптора, независимо от того, задана ли возможность этого устройства. Если эта возможность задана, аппаратная архитектура не требует кэширования какой-либо информации, а некэшированные исправления (обработка нуля) нарисовывается так же эффективно, как и кэшированные.

Отрисовка исправлений

Direct3D 9 поддерживает два типа примитивов более высокого порядка или исправлений. Они называются N-Patches и Rect/Tri patches. N-исправления можно отобразить с помощью любого вызова отрисовки треугольника, включив N-patchs через вызов IDirect3Device9::SetNPatchMode( nSegments ) со значением nSegments больше 1.0. Исправления Rect/Tri должны быть отрисованы с использованием следующих явных точек входа.

Для рисования исправлений можно использовать следующие методы.

IDirect3DDevice9::D rawRectPatch рисует прямоугольное исправление высокого порядка, заданное параметром pRectPatchInfo, используя заданные в данный момент потоки. Параметр Handle используется для связывания исправления с дескриптором, чтобы при следующем нарисовке исправления не было необходимости повторно указать pRectPatchInfo. Это позволяет предварительно вычислять и кэшировать коэффициенты разницы вперед или другую информацию, что, в свою очередь, позволяет последующим вызовам IDirect3Device9::D rawRectPatch использовать тот же дескриптор для эффективного выполнения.

Для статических исправлений приложение задает вершинный шейдер и соответствующие потоки, предоставляет сведения о исправлениях в параметре pRectPatchInfo и задает дескриптор, чтобы Direct3D хватил и кэшировали информацию. Затем приложение может вызвать IDirect3DDevice9::D rawRectPatch с параметром pRectPatchInfo со значением NULL , чтобы эффективно нарисовать исправление. При рисовании кэшированного исправления заданные в данный момент потоки игнорируются. Однако можно переопределить кэшированные pNumSegs, указав новые значения для pNumSegs. Кроме того, необходимо задать тот же вершинный шейдер при отрисовке кэшированного исправления, который был задан при захвате.

Для динамических исправлений данные исправлений изменяются при каждой отрисовке исправления, поэтому кэшировать информацию неэффективно. Приложение может передать это в Direct3D, задав для параметра Handle значение 0. В этом случае Direct3D рисует исправление с помощью заданных в данный момент потоков и значений pNumSegs и не кэширует никаких сведений. Недопустимо одновременно задать для handle значение 0, а для pPatch — значение NULL.

Повторно указав pRectPatchInfo для того же дескриптора, приложение может перезаписать ранее кэшированные сведения.

IDirect3DDevice9::D rawTriPatch похож на IDirect3DDevice9::D rawRectPatch , за исключением того, что он рисует треугольное исправление высокого порядка.

Создание норм и координат текстуры

Если вы используете шейдер гибкого формата вершин (FVF), автоматическое создание норм и координат текстуры невозможно.

Для нормальных можно либо предоставить их напрямую, либо заставить Direct3D вычислить их автоматически.

Координаты, созданные для прямоугольных патчей, являются координатами на основе сплайнов, как показано на следующих иллюстрациях.

иллюстрация исходной текстуры и текстуры с координатами на основе сплайна

Координаты, созданные для треугольных патчей, являются барицентрическими координатами сплайнов, как показано на следующих иллюстрациях.

иллюстрация исходной текстуры и текстуры с барицентрическими координатами сплайнов

Если приложению необходимо изменить диапазон созданных координат текстуры, это можно сделать с помощью преобразований текстур.

Примитивы более высокого порядка