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


Функции выборки текстур с плитками ресурсов

В этом разделе описываются функции выборки текстур с плитками ресурсов.

Требования к функциям выборки текстур с плитками ресурсов

Описанные здесь функции выборки текстур требуют поддержки мозаичных ресурсов уровня 2 .

Отзывы шейдера о сопоставленных областях

Любая инструкция шейдера, которая считывает и (или) записывает данные в ресурс с плитками, приводит к записи сведений о состоянии. Этот статус предоставляется как дополнительное возвращаемое значение в каждой инструкции доступа к ресурсу, которая попадает в 32-разрядный временный регистр. Содержимое возвращаемого значения является непрозрачным. То есть его прямое чтения программой-шейдером запрещено. Однако вы можете использовать функцию CheckAccessFullyMapped, чтобы извлечь сведения о статусе.

Проверка полного сопоставления

Функция CheckAccessFullyMapped интерпретирует статус, возвращенный при доступе к памяти и указывает, все ли запрошенные данные были сопоставлены в ресурсе. CheckAccessFullyMapped возвращает значение true (0xFFFFFFFF), если данные сопоставлены и значение false (0x00000000) в ином случае.

Иногда во время выполнения операций фильтров вес определенного текселя окажется равным 0.0. Примером является линейная выборка с координатами текстуры, точно попадающими на центр текселя: 3 других текселя (какие именно зависит от оборудования) участвуют в фильтре, но с весом равным 0. Эти тексели с нулевым весом совсем не влияют на результат фильтра, так что если они попадут на плитки NULL, они не будут считаться доступом без сопоставления. Обратите внимание, что те же гарантии действуют для фильтров текстур с несколькими уровнями MIP-карт. Если тексели в одной из этих карт не сопоставлены, но их вес равен 0, то эти тексели не будут считаться как доступ без сопоставления.

При выборке из формата, имеющего менее 4 компонентов (например, DXGI_FORMAT_R8_UNORM), любые тексели, которые попадают на плитки NULL , приводят к тому, что доступ со значением NULL передается независимо от того, на какие компоненты фактически смотрит шейдер в результате. Например, при чтении из R8_UNORM и маскировке результата чтения в шейдере с помощью .gba/.yzw не требуется читать текстуру. Но если адрес текселя это плитка, сопоставленная с NULL, операция все равно считается как доступ к NULL карте.

Шейдер может проверить этот статус и выполнить любую линию поведения в случае ошибки. Например, зарегистрировать «промахи» в журнале (например, через UAV-запись) и/или выдать другую инструкцию чтения, скрепленную с более грубым LOD, который точно сопоставлен. Приложению также может потребоваться отслеживать успешные операции доступа, чтобы понять, какая часть сопоставленного набора плиток находится в работе.

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

Другая сложность — множество операций доступа будет для одних и тех же плиток, поэтому в журнале будет избыточная информация и возможны конфликты при обращении к памяти. Будет удобно, если оборудованию дать возможность не регистрировать доступ к плитке, если это было сделано где-то раньше. Возможно, состояние такого отслеживания можно будет сбросить из API (скорее всего на границе кадра).

Скрепление MinLOD-по выборке

Чтобы помочь шейдерам избежать областей в ресурсах с фрагментами mipmapped, которые, как известно, не сопоставлены, большинство инструкций шейдера, связанных с использованием выборки (фильтрация), имеют новый режим, позволяющий шейдеру передавать дополнительный параметр зажима MinLOD float32 в образец текстуры. Это значение указывается в численном пространстве MIP-карты представления в противоположность нижележащему ресурсу.

Оборудование выполняет max(fShaderMinLODClamp,fComputedLOD) в том же месте в вычислении LOD, где происходит зажим MinLOD для каждого ресурса, что также является max().

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

Инструкция LOD (например, tex2Dlod), которая предшествует описанному здесь зажиму minLOD для каждой выборки, возвращает как зажатый, так и незажатый LOD. Скрепленный LOD, возвращенный из этой инструкции LOD, отражает все скрепления, включая скрепления по ресурсам, но не скрепления по выборкам. Скрепление по выборке все равно известно шейдеру и контролируется им, поэтому автор шейдера по желанию может вручную применить это скрепление к возвращенному значением инструкции LOD.

Фильтрация сокращения минимумов и максимумов

Приложения могут управлять собственными структурами данных, которые информируют их о том, как выглядят сопоставления для мозаичного ресурса. Примером может быть поверхность, содержащая тексель для хранения сведений о каждой плитке в ресурсе с плиткой. Например, можно сохранить первый LOD, сопоставленный в заданном расположении плитки. Путем тщательной выборки этой структуры данных таким же образом, как и для мозаичного ресурса, можно определить, каким будет минимальное значение lod, полностью сопоставленное для всего пространства фильтра текстуры. Чтобы упростить этот процесс, Direct3D 11.2 предлагает новый режим дискретизатора общего назначения — min/max фильтрация.

Возможности min/max фильтрации для отслеживания LOD могут пригодиться и для других целей, например, для фильтрации поверхности глубин.

Min/max фильтрации сокращения — это режим дискретизаторов, который извлекает тот же набор текселей,что даст и обычный текстурный фильтр. Но вместо смешивания значений для получения результата, он возвращает min() или max() извлеченных текселей по отдельным компонентам (например, минимум всех R-значений, отдельно от минимума всех G-значений и т. д).

Операции min/max действуют согласно правилам арифметической точности Direct3D. Порядок сравнений не важен.

Иногда во время операций фильтра, которые не относится к режиму min/max, вес определенного текселя может оказаться равен 0.0. Примером является линейная выборка с координатами текстуры, которые падают непосредственно на центр текселя. 3 других текселя (которые они могут различаться в зависимости от оборудования) влияют на фильтр, но с 0 весом. Любые из этих текселей, которые будут иметь вес 0 в фильтре, отличном от min/max, в случае фильтра min/max, по-прежнему не будут влиять на результат (и веса никаким образом не повлияют на работу фильтра min/max).

Полный список режимов фильтрации отображается в перечислении D3D11_FILTER со значениями MINIMUM и MAXIMUM в перечислении.

Поддержка этой функции зависит от поддержки ресурсов с плитками уровня 2 .

Доступ конвейера к мозаичного фрагментам ресурсов