Текстуры в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki
Виды текстур
Текстура — это ресурс, состоящий из текселей, т. е. пикселей, образующих текстуру (часто их называют просто пикселями; само слово «тексель» образовано соединением слов «текстура» и «пиксель»). В «настоящих» текстурах каждый тексель задаёт цвет данной точки, однако часто встречаются текстуры, хранящие другие виды информации (например, карта нормалей технически является текстурой, каждый тексель которой содержит не цвет, а нормаль к соответствующей точке полигона, на который данная карта накладывается в процессе рендеринга).
От буферов текстуры отличаются следующими аспектами:
-
каждый элемент текстуры, т. е. тексель, всегда состоит лишь из одного компонента заданного формата (элемент буфера в общем случае может содержать до четырёх компонентов включительно, у каждого из которых может быть свой формат);
-
при выборке шейдером текстуры могут фильтроваться, т. е. шейдер получает не точное значение, содержащееся в конкретном текселе, а значение, сформированное по определённым правилам из значений нескольких текселей;
-
текстуры могут иметь mipmap-уровни (см. ниже);
-
к графическому конвейеру привязывается не сама текстура, а её представление.
Поддерживаются текстуры трёх видов: одно-, двух- и трёхмерные (1D, 2D, 3D); каждый из видов может иметь mipmap-уровни, а может и не иметь их. Кроме того, поддерживаются массивы одно- и двухмерных текстур, а также текстуры с мультисэмплингом.
Одномерные текстуры и их массивы
Одномерная текстура содержит тексели, адресуемые с помощью одной текстурной координаты (она обычно обозначается буквой U); её можно рассматривать как одномерный массив текселей:
Одномерная текстура может содержать mipmap-уровни:
Mipmap-уровень — это текстура, содержащая вдвое меньше текселей, чем вышележащий уровень (если при делении на два получилось дробное число, оно усекается в меньшую сторону: если первый уровень имеет пять текселей, второй будет иметь два). Самый нижний mipmap-уровень одномерной текстуры содержит один тексель. Нужный mipmap-уровень задаётся индексом, называемым уровнем детализации (LOD, level of details). Основное назначение mipmap-уровней — упростить и ускорить формирование цветов пикселей изображения объекта, находящегося далеко от камеры и поэтому имеющего небольшой видимый размер.
Массив одномерных текстур имеет следующий концептуальный вид:
Все массивы в текстуре должны иметь одинаковое число текселей и mipmap-уровней, а также одинаковый формат данных.
Работа с одномерными текстурами и их массивами ведётся через интерфейс ID3D10Texture1D или ID3D11Texture1D.
Двухмерные текстуры и их массивы
Двухмерная структура концептуально выглядит следующим образом:
Чтобы указать конкретный тексель, используются две текстурные координаты — U и V.
Каждый mipmap-уровень двухмерной текстуры содержит в два раза меньше текселей по каждой из координат, чем вышележащий уровень. Самый последний mipmap-уровень содержит один тексель.
Массив двухмерных текстур концептуально выглядит следующим образом:
Специальным случаем массива двухмерных текстур является так называемый текстурный куб:
Шейдеры могут использовать специальные встроенные функции для выборки значений из текстурных кубов, для чего последние должны быть привязаны к конвейеру с помощью представлений текстурных кубов, а не обычных массивов. Адресация текселей в текстурном кубе осуществляется по трём координатам; исходной точкой является центр куба.
При использовании оборудования уровня DirectX 10.0 в массиве могут содержаться текстуры только для одного куба, т. е. их должно быть шесть. При использовании оборудования более высокого уровня (начиная с DirectX 10.1) массив может содержать несколько текстурных кубов, в этом случае число элементов массива будет кратно шести.
Работа с двухмерными текстурами и их массивами ведётся через интерфейс ID3D10Texture2D, ID3D11Texture2D или ID3D11Texture2D1.
Трёхмерные текстуры
Трёхмерная текстура, называемая также объёмной текстурой, концептуально выглядит следующим образом:
Для адресации текселей используются три координаты — U, V и W.
Массивы трёхмерных текстур не поддерживаются.
Если трёхмерная структура привязывается к графическому конвейеру в качестве цели рендеринга, она ведёт себя подобно массиву двухмерных текстур с определённым числом секций. Конкретная секция для рендеринга выбирается в геометрическом шейдере с помощью объявления некоторых выходных скалярных данных в качестве системного значения SV_RenderTargetArrayIndex
.
Работа с трёхмерными текстурами ведётся через интерфейс ID3D10Texture3D, ID3D11Texture3D или ID3D11Texture3D1.