Сопоставление смещения (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.
Связанные темы