Общие сведения о текстурах в Direct3D 11
Ресурс текстуры — это структурированная коллекция данных, предназначенная для хранения текселей. Тексель представляет собой наименьшую единицу текстуры, которую конвейер может считывать или записывать данные. В отличие от буферов, текстуры можно фильтровать сэмплерами текстур, когда они считываются шейдерными блоками. Тип текстуры влияет на фильтрацию текстуры. Каждый тексель содержит от 1 до 4 компонентов, упорядоченных в одном из форматов DXGI, определенных перечислением DXGI_FORMAT.
Текстуры создаются как структурированный ресурс с известным размером. Однако каждая текстура может быть типизированной или без типа при создании ресурса до тех пор, пока тип полностью указан с помощью вида, когда текстура привязана к конвейеру.
Типы текстур
Существует несколько типов текстур: 1D, 2D, 3D, каждая из которых может быть создана с mipmap или без них. Direct3D 11 также поддерживает массивы текстур и многофакторные текстуры.
1D Текстуры
1D-текстура в простейшей форме содержит данные текстуры, которые можно устранить с помощью одной координаты текстуры; Его можно визуализировать как массив текселей, как показано на следующем рисунке. 1D-текстуры представлены интерфейсом ID3D11Texture1D.
Каждый тексель содержит ряд компонентов цвета в зависимости от формата хранимых данных. Добавление дополнительной сложности позволяет создать 1D-текстуру с уровнями mipmap, как показано на следующем рисунке.
Уровень mipmap — это текстура, которая меньше уровня над ним на степень двойки. Самый верхний уровень содержит наиболее подробные сведения, каждый последующий уровень меньше. Для 1D-MIP-карты наименьший уровень содержит один тексель. Кроме того, уровни MIP всегда сводятся к 1:1. При создании mipmap-уровней на текстуре нечетного размера, следующий более низкий уровень всегда имеет четный размер (за исключением случаев, когда самый низкий уровень достигает 1). Например, схема иллюстрирует текстуру 5x1, следующий самый низкий уровень которого — текстура 2x1, чей следующий (и последний) уровень mip — текстура размером 1x1. Уровни определяются индексом под названием LOD (уровень детализации), который используется для доступа к меньшей текстуре при отрисовке геометрии, которая не так близка к камере.
Массивы текстур 1D
Direct3D 11 также поддерживает массивы текстур. Массив текстур 1D также представлен интерфейсом ID3D11Texture1D. Массив 1D-текстур выглядит концептуально, как показано на следующем рисунке.
Этот массив текстур содержит три текстуры. Каждая из трех текстур имеет ширину текстуры 5 (это число элементов в первом слое). Каждая текстура также содержит мипмап с 3 уровнями.
Все массивы текстур в Direct3D представляют собой однородный массив текстур; это означает, что каждая текстура в массиве текстур должна иметь одинаковый формат и размер (включая ширину текстуры и количество уровней MIP-карты). Вы можете создавать массивы текстур разных размеров, если все текстуры в каждом массиве соответствуют размеру.
2D-текстуры и 2D-массивы текстур
Ресурс Texture2D содержит 2D-сетку текселей. Каждый тексель доступен по адресу, который задается вектором u, v. Так как это ресурс текстуры, он может содержать уровни mipmap и подресурсы. Трехмерные текстуры представлены интерфейсом ID3D11Texture2D. Полностью заполненный ресурс текстуры 2D выглядит следующим образом.
Этот ресурс текстуры содержит одну текстуру 3x5 с тремя уровнями mipmap.
Ресурс массива текстур 2D — это однородный массив двухмерных текстур; То есть каждая текстура имеет одинаковый формат данных и измерения (включая уровни mipmap). Массив текстур 2D также представлен интерфейсом ID3D11Texture2D. Он имеет аналогичный макет, как массив текстур 1D, за исключением того, что текстуры теперь содержат 2D-данные, как показано на следующем рисунке.
Этот массив текстур содержит три текстуры; каждая текстура имеет размеры 3x5 с двумя уровнями мипмапа.
Использование 2D-массива текстур в качестве текстурного куба
Куб текстуры — это 2D-массив текстур, содержащий 6 текстур, по одному для каждого лица куба. Полностью заполненный куб текстуры выглядит следующим образом.
2D-массив текстур, содержащий 6 текстур, можно считывать в шейдерах с помощью встроенных функций обработки кубической карты, после их привязки к конвейеру с использованием представления кубической текстуры. Кубы текстур обращаются из шейдера трёхмерным вектором, направленным от центра куба текстуры.
Заметка
Устройства, создаваемые с помощью уровня компонентов 10_1, и более поздних версий, могут поддерживать массивы кубов текстур, в которых количество текстур равно количеству кубов текстур в массиве, умноженному на шесть. Устройства, создаваемые с уровнем возможностей 10_0, поддерживают только один куб текстуры с шестью гранями. Кроме того, Direct3D 11 не поддерживает частичные карты кубов.
Трехмерные текстуры
Трехмерный ресурс текстуры (также известный как объемная текстура) содержит трехмерное распределение текселей. Поскольку это ресурс текстуры, он может содержать уровни mipmap. Трехмерные текстуры представлены интерфейсом ID3D11Texture3D. Полностью заполненная трехмерная текстура выглядит следующим образом.
Если срез mipmap трехмерной текстуры привязан как цель отрисовки (с представлением цели отрисовки), трехмерная текстура ведет себя так же, как массив 2D текстур с n срезами. Конкретный срез отрисовки выбирается на этапе геометрического шейдера, объявляя скалярный компонент выходных данных как системное значение SV_RenderTargetArrayIndex.
Отсутствует концепция трехмерного массива текстур; поэтому подресурс трехмерной текстуры представляет собой всего лишь один уровень MIP-карты.
Связанные разделы