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


Использование 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-патчи через вызов IDirect3DDevice9::SetNPatchMode(nSegments) со значением nSegments больше 1.0. Rect/Tri патчи должны рендериться с помощью следующих явных точек входа.

Чтобы рисовать участки, вы можете использовать следующие методы.

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

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

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

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

IDirect3DDevice9::DrawTriPatch аналогичен IDirect3DDevice9::DrawRectPatch за исключением того, что он рисует треугольный высокоуровневый патч.

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

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

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

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

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

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

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

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

Higher-Order Примитивы