Сопоставление смещения (Direct3D 9)

Карты смещения похожи на карты текстур, но к которым обращается подсистема вершин.

Блок-схема

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

Схема этапа выборки в канале вершины

Состояние дискретизатора карты смещения можно задать с помощью SetSamplerState , используя номер этапа 256, который является новым номером этапа. Текстура карты смещения задается с помощью SetTexture.

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

  • Карты смещения аналогичны картам текстур, но к которым обращается подсистема вершин.
  • В ранней части канала вершины имеется дополнительный этап выборки, который может быть образцом карты смещения. Доступ к этому этапу осуществляется обычным API SetSamplerState, но номер этапа — D3DDMAPSAMPLER = 256.
  • Состояние образца карты смещения можно задать с помощью SetSamplerState(D3DDMAPSAMPLER, ...) API.
  • Текстура карты смещения задается с помощью API SetTexture(D3DDMAPSAMPLER, texture).
  • Карта может быть предварительно выбрана или нет. Это означает, что его можно упорядочить определенным образом, который позволяет выполнять поиск значений смещения без фильтрации.
  • Изменения в структуре объявления позволяют определить координату текстуры, используемую для поиска карты текстуры. Например, Stream0, Offset, FLOAT2, LOOKUP Displacement_value. Это указывает тесселлатору использовать двухмерный вектор с плавающей запятой в stream0 с определенным смещением в качестве координаты текстуры, чтобы найти карту смещения и связать с ней Displacement_value семантику использования. Объявление вершинного шейдера будет содержать строку, аналогичную {dcl_texture0, v0}, указывающую, что семантика texture0 должна быть связана с входным регистром v0. Указанное значение смещения копируется во входной регистр v0.
  • Существует особый тип сопоставления смещения при предварительной выборке карты текстуры. Последовательный индекс созданных вершин используется в качестве координаты текстуры для карты текстур. Например, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex.
  • Выходные данные подстановки — 4 с плавающей точкой.
  • Сопоставление смещения поддерживается только с N-исправлениями.
  • Драйверы должны игнорировать D3DDMAPSAMPLER в SetTextureStageState, если они не обрабатывают карты смещения.
  • D3DTEXF_ANISOTROPIC режим фильтра не поддерживается.
  • Если D3DSAMP_MIPFILTER в выборке карты смещения не D3DTEXF_NONE, уровень детализации вычисляется следующим образом (обратите внимание, что адаптивное состояние тесселяции используется, даже если D3DRS_ENABLEADAPTIVETESSELLATION имеет значение FALSE): Tmax = состояние отображения D3DRS_MAXTESSELLATIONLEVEL
  • Вычислить уровень тесселяции Te для вершины Vi: (Xi, Yi, Zi) так же, как описано в разделе "Адаптивная тесселяции". Уровень детализации L = log2(Tmax) - log2 (Te).
  • Операции фильтрации и выборки текстур следуют тем же правилам, что и конвейер пикселей (применяется смещение уровня детализации (LOD) и т. д.).
  • В качестве карт смещения можно использовать не все форматы, а только те, которые поддерживают D3DUSAGE_DMAP. Приложение может запрашивать его с помощью CheckDeviceFormat CheckDeviceFormat.
  • D3DUSAGE_DMAP необходимо указать в CreateTexture , чтобы уведомить драйвер о том, что эта текстура будет использоваться в качестве карты смещения.
  • D3DUSAGE_DMAP можно использовать только с текстурами. Его нельзя использовать с картами кубов или томами.
  • Текстуры и целевые объекты отрисовки, созданные с помощью D3DUSAGE_DMAP, можно задавать на обычных этапах выборки и в качестве целевых объектов отрисовки.
  • Состояния отрисовки для установки режима переноса для координат текстуры игнорируются в сопоставлении смещения. Как правило, для подсистемы тесселлатора не существует режимов переноса.
  • Поведение образца карты смещения идентично поведению образцов текстур пикселей. Если выполняется поиск текстуры с менее чем четырьмя каналами (например, R32f), то эти значения переходят в соответствующие каналы целевого регистра (регистр входных данных вершинного шейдера, помеченный семантикой _sample), а остальные каналы по умолчанию — (1, 1, 1). При поиске D3DFMT_L8 передается в каналы R, G, B, а по умолчанию A — 1. Средство растерителя ссылок содержит полные сведения о реализации.

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

  • Введено новое состояние выборки: D3DSAMP_DMAPOFFSET (DWORD) — смещение (в вершинах) в предварительно выборке карты смещения.
  • Появился новый метод объявления: D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • Адаптивная тесселяция должна быть отключена.
  • Параметры фильтра текстур игнорируются. Выборка точек завершена. Предполагается, что фильтр текстуры MIP D3DTEXF_NONE. Предполагается, что все остальные режимы фильтрации текстур D3DTEXF_POINT.
  • Координаты текстуры вычисляются следующим образом: U = (индекс % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles), где Index — это последовательный индекс созданных вершин плюс TSS[D3DSAMP_DMAPOFFSET]. Последовательный индекс устанавливается в нулевое значение в начале каждого примитива и увеличивается после создания вершины.

Это изменения API, которые поддерживают сопоставление смещения.

  • Добавлен формат с одним каналом, D3DFMT_L16.
  • Новый флаг использования D3DUSAGE_DMAP.
  • Специальный этап текстуры, используемый для задания текстуры карты смещения, D3DDMAPSAMPLER.
  • Добавлены новые аппаратные ограничения, D3DDEVCAPS2_DMAPNPATCH и D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. См . раздел D3DDEVCAPS2.

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