Поделиться через


Координаты текстуры (Direct3D 9)

Большинство текстур, например растровые изображения, представляют собой двумерный массив значений цвета. Текстуры кубической карты среды являются исключением. Дополнительные сведения см. в разделе Сопоставление кубических сред (Direct3D 9). Отдельные значения цвета называются элементом текстуры или текселью. Каждый тексель имеет уникальный адрес в текстуре. Адрес можно рассматривать как столбец и номер строки, которые помечены как you и v соответственно на следующем рисунке.

Иллюстрация адреса текселя в виде номеров столбцов и строк

Координаты текстуры находятся в пространстве текстуры. То есть они относятся к расположению (0,0) в текстуре. При применении текстуры к примитиву в трехмерном пространстве ее адреса текселя должны сопоставляться с координатами объекта. Затем их необходимо преобразовать в координаты экрана или расположения пикселей.

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

Direct3D сопоставляет тексели в пространстве текстур непосредственно с пикселями в пространстве экрана, пропуская промежуточный шаг для повышения эффективности. Этот процесс сопоставления на самом деле является обратным сопоставлением. То есть для каждого пикселя в пространстве экрана вычисляется соответствующее положение текселя в пространстве текстуры. Выборка цвета текстуры в этой точке или вокруг нее. Процесс выборки называется фильтрацией текстур. Дополнительные сведения см. в разделе Фильтрация текстур (Direct3D 9).

Каждый тексель в текстуре можно указать координатой текселя. Однако для сопоставления текселей с примитивами Direct3D требуется единый диапазон адресов для всех текселей во всех текстурах. Поэтому используется универсальная схема адресации, в которой все адреса текселя находятся в диапазоне от 0,0 до 1,0 включительно. Приложения Direct3D определяют координаты текстуры с точки зрения значения v, так же, как двухдкартовые координаты указываются в виде координат x,y. Технически система может фактически обрабатывать координаты текстуры за пределами диапазона 0,0 и 1,0, и делает это с помощью параметров, заданных для адресации текстуры. Дополнительные сведения см. в разделе Режимы адресации текстур (Direct3D 9).

В результате одинаковые адреса текстур могут сопоставляться с разными координатами текселя в разных текстурах. На следующем рисунке адрес текстуры — (0,5,1,0). Однако поскольку текстуры имеют разные размеры, адрес текстуры сопоставляется с разными текселями. Текстура 1 слева имеет значение 5x5. Адрес текстуры (0,5,1,0) сопоставляется с текселем (2,4). Справа текстура 2 имеет значение 7x7. Адрес текстуры (0,5,1,0) сопоставляется с текселем (3,6).

Иллюстрация сопоставления адресов одной текстуры с разными текселями на разных текстурах

На следующем рисунке показана упрощенная версия процесса сопоставления текселя. По общему признанию, этот пример очень прост. Дополнительные сведения см. в разделе Прямое сопоставление текселей с пикселями (Direct3D 9).

изображение пикселя (квадрат цвета), сопоставленного с пространством объектов

В этом примере пиксель, показанный слева от иллюстрации, идеализирован в квадрат цвета. Адреса четырех углов пикселя сопоставляются с трехмерными примитивами в пространстве объектов. Форма пикселя часто искажается из-за формы примитива в трехмерном пространстве и из-за угла обзора. Углы поверхностной области в примитиве, соответствующие углам пикселя, затем сопоставляются с пространством текстуры. Процесс сопоставления снова искажает форму пикселя, что является распространенным явлением. Окончательное значение цвета пикселя вычисляется на основе текселей в области, с которой сопоставляется пиксель. Вы определяете метод, который Direct3D использует для получения цвета пикселей при настройке метода фильтрации текстур. Дополнительные сведения см. в разделе Фильтрация текстур (Direct3D 9).

Приложение может назначать координаты текстуры непосредственно вершинам. Эта возможность позволяет управлять тем, какая часть текстуры сопоставляется с примитивом. Например, предположим, что вы создаете прямоугольный примитив с тем же размером, что и текстура на следующем рисунке. В этом примере приложение будет сопоставлять всю текстуру со всей стеной. Координаты текстуры, которые приложение назначает вершинам примитива: (0.0,0.0), (1.0,0.0), (1.0,1.0) и (0.0,1.0).

Иллюстрация стены, сопоставленной с текстурой

Если вы решили уменьшить высоту стены на половину, можно исказить текстуру, чтобы поместиться на стене меньшего размера, или назначить координаты текстуры, которые заставляют Direct3D использовать нижнюю половину текстуры.

Если вы решите исказить или масштабировать текстуру в соответствии с меньшей стеной, используемый метод фильтрации текстур будет влиять на качество изображения. Дополнительные сведения см. в разделе Фильтрация текстур (Direct3D 9).

Если вместо этого вы решили назначить координаты текстуры, чтобы Direct3D использовал нижнюю половину текстуры для меньшей стены, то координаты текстуры, назначенные приложением вершинам примитива в этом примере: (0,0,0,5), (1.0,0,5), (1.0,1.0) и (0.0,1.0). Direct3D применяет нижнюю половину текстуры к стене.

Координаты текстуры вершины могут быть больше 1,0. При назначении координат текстуры вершине, которая не находится в диапазоне от 0,0 до 1,0 включительно, необходимо также задать режим адресации текстуры. Дополнительные сведения см. в разделе Режимы адресации текстур (Direct3D 9).

Координаты текстуры и этапы текстуры

Координаты текстуры связываются с текстурами посредством этапов текстуры. Текстуры назначаются этапам текстуры с помощью SetTexture(stageIndex, pTexture). См. раздел IDirect3DDevice9::SetTexture.

Код гибкого формата вершин (FVF) может определять до восьми наборов координат текстуры. Данные координат текстуры предоставляется пользователем в данных вершин. На данные ссылается отсчитываемый от нуля индекс: от 0 до 7. Существует до восьми этапов смешивания текстур. Текстура связана с определенным этапом с помощью SetTexture( stageIndex, pTexture).

После этого любой набор координат текстуры может использоваться на любом этапе. Каждый набор координат связан с этапом с помощью SetTextureStageState( stageIndex, D3DTSS_TEXCOORDINDEX, textureCoordinateIndex ). См. раздел IDirect3DDevice9::SetTextureStageState. Таким образом, этапы смешивания можно настроить для использования любой текстуры и любых координат текстур. Несколько этапов могут использовать одни и те же текстуры или координаты текстуры.

Дополнительные сведения содержатся в следующих разделах.

Текстуры Direct3D