Введение в текстуры в Direct3D 11

Текстурный ресурс — это структурированный набор данных, предназначенный для хранения текселей. Тексель представляет собой наименьший элемент текстуры, который может использоваться конвейером для чтения или записи. В отличие от буферов текстуры можно фильтровать по дискретизаторам текстур во время их считывания блоками шейдера. Тип текстуры влияет на способ ее фильтрации. Каждый тексель содержит от 1 до 4 компонентов, упорядоченных в одном из форматов DXGI, определенных перечислением DXGI_FORMAT.

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

Типы текстур

Существует несколько типов текстур: одно-, двух-, и трехмерный; каждый из них может быть создан с использованием MIP-карт и без них. Direct3D 11 также поддерживает массивы текстур и текстуры с несколькими выборками.

Одномерные текстуры

Одномерная текстура в самом простом своем виде содержит данные текстуры, к которым можно обращаться по одной координате текстуры; ее можно отобразить как массив текселей, как показано на следующем рисунке. Трехмерные текстуры представлены интерфейсом ID3D11Texture1D .

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

Каждый тексель содержит несколько цветовых компонентов в зависимости от формата хранимых данных. Повышая сложность, можно создать одномерную текстуру с уровнями MIP-карт, как показано на следующем рисунке.

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

Уровень MIP-карты — это текстура, которая меньше вышестоящего уровня на число, соответствующее степени двух. Самый верхний уровень наиболее детализирован, а каждый последующий уровень содержит меньше деталей. В одномерной MIP-карте самый нижний уровень содержит один тексель. Кроме того, уровни MIP всегда уменьшаются до 1:1. При создании MIP-карт для текстуры с нечетным значением размера более низкий уровень всегда имеет четное значение размера (за исключением низшего уровня, достигающего 1). Например, на схеме показана текстура 5 x 1, следующий низкий уровень которой является текстурой 2 x 1, а следующим (и последним) уровнем MIP является текстура размером 1 x 1. Уровни идентифицируются с помощью индекса, называемого LOD (уровень детализации), который используется для доступа к более мелким текстурам при отрисовке геометрии, находящейся не так близко к камере.

Массивы одномерных текстур

Direct3D 11 также поддерживает массивы текстур. Массив трехмерных текстур также представлен интерфейсом ID3D11Texture1D . Массив одномерных текстур концептуально выглядит как на следующем рисунке.

Иллюстрация массива 1d-текстур

Этот массив текстур содержит три текстуры. Ширина всех трех текстур равна 5 (это число элементов на первом уровне). Каждая текстура также содержит трехслойную MIP-карту.

Все массивы текстур в Direct3D однородные, это означает, что у каждой текстуры в массиве должна быть одинаковый формат данных и размер (в том числе ширина текстуры и количество уровней MIP). Вы можете создавать массивы текстур различных размеров при условии, что все текстуры в отдельном массиве соответствуют друг другу по размеру.

Двумерные текстуры и массивы двумерных текстур

Ресурс Texture2D содержит двухмерную сетку текселей. На каждый тексель указывает вектор u, v. Поскольку это текстурный ресурс, он может содержать уровни MIP и вложенные ресурсы. ДвухD-текстуры представлены интерфейсом ID3D11Texture2D . Полностью заполненный ресурс двухмерных текстур соответствует изображению на следующем рисунке.

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

Этот текстурный ресурс содержит одну текстуру 3 x 5 с тремя уровнями MIP.

Ресурс массива двумерных текстур — это однородный массив двумерных текстур; то есть все текстуры имеют одинаковый формат данных и размеры (в том числе уровни MIP). Массив двухd текстур также представлен интерфейсом ID3D11Texture2D . Он имеет аналогичный массиву одномерных текстур макет за исключением того, что теперь текстуры содержат двумерные данных, как показано на следующем рисунке.

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

Этот массив текстур содержит три текстуры; каждая текстура имеет размер 3 x 5 и два уровня MIP.

Использование массива двумерных текстур как куба текстур

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

Иллюстрация массива двухдовых текстур, представляющих куб текстуры

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

Примечание

Устройства, создаваемые с уровнем компонентов 10_1 и выше, могут поддерживать массивы кубов текстур, в которых количество текстур равно количеству кубов текстуры в массиве 6 раз. Устройства, создаваемые с уровнем компонентов 10_0 , поддерживают только один куб текстуры с шестью гранями. Кроме того, Direct3D 11 не поддерживает частичные кубовые карты.

 

Трехмерные текстуры

Ресурс трехмерной текстуры (также известной как объемная текстура) содержит трехмерный объем текселей. Поскольку это текстурный ресурс, он может содержать уровни MIP. Трехмерные текстуры представлены интерфейсом ID3D11Texture3D . Полностью заполненная трехмерная текстура выглядит, как изображение на следующем рисунке.

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

При привязке фрагмента MIP-карты трехмерной текстуры в качестве целевых выходных данных отрисовки (с использованием представления целевого объекта отрисовки) трехмерная текстура ведет себя аналогично массиву двухмерных текстур с n фрагментами. Конкретный срез отрисовки выбирается на этапе геометрического шейдера путем объявления скалярного компонента выходных данных в качестве SV_RenderTargetArrayIndex системного значения.

Понятие массива трехмерных текстур не существует, соответственно, подресурс трехмерной текстуры — это один уровень MIP-карты.

Текстуры