Обёртывание текстур (Direct3D 9)
Короче говоря, оболочка текстур изменяет базовый способ, которым Direct3D растеризирует текстурированные многоугольники с помощью координат текстур, указанных для каждой вершины. При растеризации многоугольника система интерполирует координаты текстуры на каждой вершине многоугольника, чтобы определить тексели, которые следует использовать для каждого пикселя многоугольника. Как правило, система обрабатывает текстуру как плоскость 2D, интерполяируя новые тексели, принимая самый короткий маршрут из точки А внутри текстуры в точку B. Если точка A представляет позицию u, v (0.8, 0.1), а точка B — (0.1,0.1), строка интерполяции выглядит следующим образом.
Обратите внимание, что самое короткое расстояние между A и B на этом рисунке проходит примерно через середину текстуры. Включение обтекания координат u-текстуры или v-текстуры изменяет восприятие Direct3D в том, как проходит кратчайший путь между координатами текстур в направлении u и v. По определению, оболочка текстуры приводит к тому, что растризатор принимает самый короткий маршрут между наборами координат текстур, предполагая, что 0.0 и 1.0 совпадают. Последняя часть является сложной: вы можете представить, что включение обертки текстуры в одном направлении заставляет систему рассматривать текстуру так, как будто она обернута вокруг цилиндра. Например, рассмотрим следующую схему.
На предыдущем рисунке показано, как обтекание в направлении u влияет на то, как система интерполирует координаты текстуры. Используя те же точки, что и в примере для нормальной или нераскрытой текстуры, можно увидеть, что самый короткий маршрут между точками A и B больше не находится в середине текстуры; Теперь он находится через границу, где 0.0 и 1.0 существуют вместе. Оболочка в направлении v аналогична, за исключением того, что она оборачивает текстуру вокруг цилиндра, лежащего на боку. Оборачивание как в направлении u, так и в направлении v является более сложным. В этой ситуации вы можете представить текстуру как тор или пончик.
Наиболее распространенное практическое применение обертки текстур — выполнение отображения среды. Как правило, объект, текстурированный с картой среды, выглядит очень отражающим, показывая зеркальное изображение окружения объекта в сцене. Для этого обсуждения представьте себе комнату с четырьмя стенами, каждая из которых окрашена буквой R, G, B или Y и соответствующими цветами: красным, зеленым, синим и жёлтым. Схема среды для такой простой комнаты может выглядеть следующим образом.
Представьте, что потолок комнаты держится совершенно отражающим, четырехсторонним столбом. Сопоставление текстуры карты окружающей среды со столбом просто; сделать так, чтобы столб выглядел так, как будто он отражает буквы и цвета, не так просто. На следующей схеме показан каркас столба с соответствующими координатами текстуры, указанными вблизи верхних вершин. Шов, где оболочка будет пересекать края текстуры, показан пунктирной линией.
При включенной обертке в направлении u, текстурированный столбец отображает цвета и символы из карты среды соответствующим образом, а на шве в передней части текстуры растрезатор правильно выбирает самый короткий маршрут между координатами текстуры, при условии, что u-координаты 0.0 и 1.0 имеют одну и ту же позицию. Текстурированный столбец выглядит следующим образом.
Если текстурное обертывание не включено, растеризатор не интерполирует в направлении, необходимом для создания правдоподобного отраженного изображения. Скорее, область на передней части столба содержит горизонтально сжатые версии текселей между u-координатами 0,175 и 0,875, так как они проходят через центр текстуры. Эффект оболочки разрушен.
Использование обертки текстур
Чтобы включить оболочку текстур, вызовите метод IDirect3Device9::SetRenderState, как показано в примере кода ниже.
d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);
Первый параметр, принимаемый IDirect3DDevice9::SetRenderState, — это состояние отрисовки, которое нужно установить. Укажите одно из перечисленных значений от D3DRS_WRAP0 до D3DRS_WRAP7, определяющих уровень текстуры, для которого необходимо задать обёртку. Укажите флаги от D3DWRAPCOORD_0 до D3DWRAPCOORD_3 во втором параметре, чтобы включить закольцовку текстуры в соответствующем направлении, или объедините их, чтобы включить закольцовку в нескольких направлениях. Если флаг не указан, оболочка текстур в соответствующем направлении отключена. Чтобы отключить оболочку текстур для набора координат текстур, задайте для соответствующего состояния отрисовки значение 0.
Не путайте оболочку текстуры с аналогичными именованными режимами адресации текстур. Упаковка текстур выполняется до адресации текстур. Убедитесь, что данные оболочки текстур не содержат координаты текстур за пределами диапазона [0.0, 1.0], так как это приведет к неопределенным результатам. Дополнительные сведения об адресации текстур см. в режимах адресации текстур (Direct3D 9).
Обертывание карты смещения
Карты смещения интерполируются движком тесселяции. Поскольку режим обертки не может быть задан для модуля тесселяции, упаковка текстур невозможна с картами смещения. Приложение может использовать набор вершин, который делает возможным оборачивание интерполяции в любом направлении. Приложение также может указать интерполяцию, которая должна быть выполнена как простая линейная интерполяция.
Связанные разделы