Вводные сведения о текстурах

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

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

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

Типы текстур

Direct3D поддерживает несколько представлений с плавающей запятой. Все вычисления с плавающей запятой выполняются в определенном подмножестве 32-битных правил с плавающей запятой одинарной точности IEEE 754.

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

1D-текстуры

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

На следующем рисунке показана одномерная текстура.

одномерная текстура

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

одномерная текстура с уровнями MIP

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

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

Массивы 1D текстур

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ресурс трехмерной текстуры

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

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

Системы координат для Direct3D определены для точек и текселей.

Система координат пикселей

Система координат для пикселей в Direct3D определяет начало координат целевого объекта отрисовки в левом верхнем углу, как показано на следующем рисунке. Центры пикселей смещены на (0,5f, 0,5f) от целочисленных расположений.

схема системы координат для пикселей в direct3d 10

Система координат Текселя

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

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

Координаты текстуры представлены в виде нормализованного или скалярного числа; каждая координата текстуры сопоставляется определенному текселю следующим образом.

Для нормализованной координаты:

  • Выборка точек: Texel # = floor(U * Width)
  • Линейная выборка: левый тексель # = пол(U * ширина), правый тексель # = левый тексель # + 1

Для скалярной координаты:

  • Выборка точек: Texel # = floor(U)
  • Линейная выборка: левый тексель # = floor(U - 0,5), правый тексель # = левый тексель # + 1

Где ширина — это ширина текстуры (в текселях).

Упаковка адреса текстуры происходит после расчета расположения текселя.

Текстуры