Фильтрация текстур с помощью MIP-карт (Direct3D 9)
MIP-карта — это последовательность текстур, каждая из которых представляет собой одно и то же изображение с последовательно снижающимся разрешением. Высота и ширина каждого изображения или уровня в MIP-карте на два меньше, чем предыдущий уровень. MIP-карты не обязаны быть квадратными.
Изображения MIP-карт с высоким разрешением используются для объектов, расположенных близко к пользователю. Изображения с низким разрешением используются для объектов, отображаемых дальше. Использование MIP-карт улучшает качество отображаемой текстуры за счет использования большего объема памяти.
Direct3D представляет MIP-карты как цепочку присоединенных поверхностей. Текстура с наиболее высоким разрешением находится в начале цепочки, а далее к ней присоединяются последующие уровни MIP-карты. Этот уровень тоже имеет вложение — следующий уровень MIP-карты, и так далее до самого низкого разрешения MIP-карты.
На следующих рисунках показан пример таких уровней. Точечные текстуры представляют собой знак на контейнере в трехмерной игре от первого лица. При создании MIP-карты текстура с самым высоким разрешением является первой в наборе. Каждая последующая текстура в наборе MIP-карт меньше предыдущей по высоте и ширине на число, соответствующее степени двух. В этом случае максимальное разрешение MIP-карты — 256 пикселей на 256 пикселей. Далее следует текстура размером 128x128 пкс. Последняя текстура в цепочке имеет размеры 64x64 пкс.
Этот знак расположен на максимальном расстоянии, на котором его можно увидеть. Если пользователь находится далеко от знака, игра отображает самую маленькую текстуру в цепочке MIP-карт, которая в данном случае имеет размер 64x64 пкс.
Когда пользователь перемещает точку зрения ближе к знаку, используются текстуры цепочки MIP-карты с постепенно увеличивающимся разрешением. Разрешение на следующем рисунке — 128x128 пкс.
Текстура с самым высоким разрешением используется, когда точка зрения пользователя находится на минимально допустимом расстоянии от знака, как показано на следующем рисунке.
Это более эффективный способ имитации перспективы для текстур. Вместо отрисовки одной текстуры во многих разрешениях, быстрее использовать несколько текстур в разных разрешениях.
Direct3D может оценить, какая текстура в наборе MIP-карт имеет разрешение, наиболее близкое к требуемому для вывода, и сопоставляет пиксели пространству текселей. Если разрешение конечного изображения является промежуточным между двумя разрешениями текстур в наборе MIP-карт, Direct3D проверяет тексели обеих MIP-карт и накладывает их цветовые значения друг на друга.
Для использования MIP-карт ваше приложение должно построить набор MIP-карт. Приложения применяют MIP-карты, выбирая набор MIP-карт в качестве первой текстуры в наборе текущих текстур. Дополнительные сведения см. в разделе Наложение текстур (Direct3D 9).
Затем приложение должно установить метод фильтрации, который использует Direct3D для выборки текселей. При самом быстром методе фильтрации MIP-карт Direct3D выбирает ближайший тексель. Используйте перечисленное значение D3DTEXF_POINT, чтобы выбрать это значение. Direct3D может создавать лучшие результаты фильтрации, если приложение использует перечисленное значение D3DTEXF_LINEAR. В этом случае выбирается ближайшая MIP-карта, после чего вычисляется взвешенное среднее значение текселей, окружающих точку текстуры, которой сопоставлен текущий пиксель.
Текстуры MIP-карт используются в трехмерных сценах, чтобы уменьшить время, необходимое для обработки сцены. Они также повышают реалистичность сцены. Однако зачастую для этого требуется большой объем памяти.
Создание набора MIP-карт
В следующем примере показано, как приложение может вызвать метод IDirect3Device9::CreateTexture для построения цепочки из пяти уровней MIP-карты: 256x256, 128x128, 64x64, 32x32 и 16x16.
// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface
IDirect3DTexture9 * pMipMap;
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,
D3DPOOL_MANAGED, &pMipMap);
Первые два параметра, принятые IDirect3Device9::CreateTexture , — это размер и ширина текстуры верхнего уровня. Третий параметр указывает количество уровней в текстуре. Если задать нулевое значение, Direct3D создает цепочку поверхностей, каждая из которых будет на два меньше, чем предыдущая, вплоть до наименьшего возможного размера 1x1. Четвертый параметр указывает использование этого ресурса; В этом случае указывается значение 0, указывающее на отсутствие конкретного использования ресурса. Пятый параметр задает формат поверхности для текстуры. Используйте значение из перечисленного типа D3DFORMAT для этого параметра. Шестой параметр указывает член перечисленного типа D3DPOOL , указывающий класс памяти, в который следует поместить созданный ресурс. Если вы не используете динамические текстуры, рекомендуется D3DPOOL_MANAGED. Последний параметр принимает адрес указателя на интерфейс IDirect3DTexture9 .
Примечание
Каждая поверхность в цепочке MIP-карты имеет размеры, которые наполовину меньше, чем у предыдущей поверхности в цепочке. Если MIP-карта верхнего уровня имеет размер 256x128 пкс, размер MIP-карты второго уровня составит 128x64 пкс, третьего уровня — 64x32 пкс и так далее до 1x1 пкс. Невозможно запросить в Levels число уровней MIP-карт, которое приведет к тому, что ширина или высота любой из MIP-карт в цепочке станет меньше 1 пкс. В простом случае поверхности MIP-карты размером 4x2 пкс максимально допустимое значение Levels — 3. Размер верхнего уровня равен 4x2 пкс, размер второго уровня — 2x1, а третьего уровня — 1x1 пкс. При значении Levels больше 3 будет получено дробное значение высоты MIP-карты второго уровня, поэтому использование такого значения запрещено.
Выбор и отображение MIP-карты
Вызовите метод IDirect3DDevice9::SetTexture , чтобы задать набор текстур MIP-карты в качестве первой текстуры в списке текущих текстур. Дополнительные сведения см. в разделе Наложение текстур (Direct3D 9).
После того как приложение выберет набор текстур MIP-карты, оно должно присвоить значения из перечисленного типа D3DTEXTUREFILTERTYPE состоянию D3DSAMP_MIPFILTER выборки. Затем Direct3D автоматически выполняет фильтрацию текстур MIP-карты. Включение фильтрации текстур MIP-карты показано в следующем примере кода.
m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
Приложение также может вручную проходить по цепочке поверхностей MIP-карты с помощью метода IDirect3DTexture9::GetSurfaceLevel и указания уровня MIP-карты для извлечения. В следующем примере выполняется обход цепочки MIP-карты от максимального до самого низкого разрешения.
IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
// Process this level
pSurfaceLevel->Release();
}
Приложениям необходимо вручную проходить по цепочке MIP-карты, чтобы загружать данные растрового изображения в каждую поверхность в цепочке. Как правило, это единственная причина для обхода цепочки. Приложение может получить количество уровней в MIP-карте, вызвав IDirect3DBaseTexture9::GetLevelCount.
Связанные темы