Упаковка текстур (Direct3D 9)
Короче говоря, оболочка текстуры изменяет базовый способ растеризации в Direct3D текстурированных многоугольников, используя координаты текстуры, указанные для каждой вершины. Во время растеризации многоугольника система выполняет интерполяцию между координатами текстуры в каждой вершине многоугольника для определения текселя, который должен использоваться для каждого пикселя многоугольника. Как правило, система воспринимает текстуры как двухмерные плоскости, интерполируя новые тексели, используя короткий маршрут из точки А текстуры в точку Б. Если точка А представляет собой координаты на текстуре 0,8 и 0,1, а точка Б — координаты 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, так как они проходят через центр текстуры. Эффект обтекания не проявляется.
Использование обтекания текстурами
Чтобы включить обтекание текстурами, вызовите метод IDirect3DDevice9::SetRenderState , как показано в примере кода ниже.
d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);
Первый параметр, принимаемый IDirect3DDevice9::SetRenderState , является состоянием отрисовки, которое необходимо задать. Укажите одно из D3DRS_WRAP0 с помощью D3DRS_WRAP7 перечисленных значений, определяющих уровень текстуры, для которого следует установить оболочку. Укажите D3DWRAPCOORD_0 с помощью флагов D3DWRAPCOORD_3 во втором параметре, чтобы включить обтекание текстурами в соответствующем направлении, или объедините их, чтобы включить перенос в нескольких направлениях. Если опустить флаг, оболочка текстуры в соответствующем направлении будет отключена. Чтобы отключить обтекание текстурой для набора координат текстуры, задайте для соответствующего состояния отрисовки значение 0.
Не следует путать обтекание текстур с режимами адресации текстур с аналогичным названием. Обтекание текстур выполняется до адресации текстуры. Убедитесь, что данные обертывания текстур не содержат координат текстуры за пределами диапазона [0,0, 1,0], так как это приведет к неопределенным результатам. Дополнительные сведения об адресации текстур см. в разделе Режимы адресации текстур (Direct3D 9).
Упаковка карты смещения
Карты смещения интерполируются движком тесселяции. Поскольку режим обтекания для движка тесселяции указать невозможно, обтекание текстуры невозможно выполнить с помощью карт смещения. Приложение может использовать набор вершин, который обеспечивает интерполяцию для обтекания в любом направлении. В приложении также можно указать, чтобы интерполяция производилась простым линейным способом.
Связанные темы