Текстуры в 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.