netlib.narod.ru< Назад | Оглавление | Далее >

18.1. Основы мультитекстурирования

Мультитекстурирование, возможно, является самой простой из техник, которые можно реализовать с помощью пиксельного шейдера. Более того, поскольку пиксельные шейдеры заменяют стадию мультитекстурирования фиксированного конвейера, нам необходимо иметь хотя бы базовое представление о том, что происходит на этапе мультитекстурирования. Данный раздел представляет собой краткий обзор мультитекстурирования.

Когда ранее, в главе 6, мы обсуждали наложение текстур, обсуждение мультитекстурирования в фиксированном конвейере функций было пропущено по двум причинам. Во-первых, мультитекстурирование это часть более сложного процесса и мы посчитали, что в тот момент эта тема была бы слишком сложна для восприятия. Во-вторых, фиксированные функции этапа мультитекстурирования заменяются новыми и более мощными пиксельными шейдерами; следовательно имеет смысл не тратить время на устаревшие фиксированные функции этапа мультитекстурирования.

Идея, лежащая в основе мультитекстурирования отчасти связана со смешиванием. В главе 7 мы узнали о смешивании растеризуемых пикселей с пикселями ранее записанными во вторичный буфер для реализации некоторых эффектов. Теперь мы расширим эту идею для нескольких текстур. Итак, мы разрешаем одновременное использование нескольких текстур и затем определяем, как эти текстуры должны быть смешаны одна с другой для получения требуемого эффекта. Наиболее часто мультитекстурирование используется для освещения. Вместо того, чтобы воспользоваться моделью освещения Direct3D на этапе обработки вершин, мы применяем специальные карты текстур, называемые картами освещения (light map), которые сообщают о том, как освещена поверхность. Представим, например, что нам надо осветить прожектором большой ящик. Мы можем описать прожектор в виде структуры D3DLIGHT9, или можно смешать вместе карту текстур, представляющую ящик и карту освещения, представляющую прожектор, как показано на рис 18.1.


Рис. 18.1. Визуализация освещенного прожектором ящика с использованием мультитекстурирования

Рис. 18.1. Визуализация освещенного прожектором ящика с использованием мультитекстурирования. Здесь мы комбинируем две текстуры, перемножая их соответствующие тексели


 

ПРИМЕЧАНИЕ
Как и в примере смешивания из главы 7, получаемое в результате изображение зависит от того, как именно смешиваются текстуры. В фиксированных функциях этапа мультитекстурирования формула смешивания задавалась с помощью относящихся к текстурированию режимов визуализации. В пиксельных шейдерах мы пишем функцию смешивания в коде шейдера в виде простого математического выражения. Второй подход позволяет выполнять смешивание текстур любым желаемым способом. Мы более подробно поговорми о смешивании текстур, когда будем обсуждать в этой главе пример приложения.

Смешивание текстур (в данном примере двух) для освещения ящика имеет два преимущества по сравнению с использованием модели освещения Direct3D:

 

ПРИМЕЧАНИЕ
Этап мультитекстурирования обычно используется для реализации всего механизма освещения статических объектов. Например, у нас может быть карта текстур, хранящая цвета объекта, такая как карта текстур ящика. Затем мы можем создать карту рассеянного освещения, хранящую оттенки рассеиваемого поверхностями света, отдельную карту отраженного света для хранения оттенков отражаемого поверхностями света, карту тумана, определяющую насколько поверхности будут скрыты туманом, и карту деталей, хранящую небольшие, часто встречающиеся на поверхностях детали. Когда все эти текстуры объединяются, мы выполняем освещение окрашивание и добавление деталей для сцены используя только просмотр предварительно созданных текстур.

 

ПРИМЕЧАНИЕ
Карта освещения прожектора — это простейший тривиальный пример карты освещения. Обычно используются специальные программы, генерирующие карты освещения на основе сцены и источников света. Генерация карт освещения выходит за рамки этой книги. Интересующихся читателей мы отсылаем к описанию карт освещения в книге Алана Ватта и Фабио Поликарпо «3D Games: Real-time Rendering and Software Technology».

18.1.1. Разрешение работы с несколькими текстурами

Вспомните, что текстуры устанавливаются с помощью метода IDirect3DDevice9::SetTexture, а режимы выборки (sampler state) устанавливаются с помощью метода IDirect3DDevice9::SetSamplerState, чьи прототипы выглядят так:

HRESULT IDirect3DDevice9::SetTexture(
     DWORD Stage, // индекс этапа текстурирования
     IDirect3DBaseTexture9 *pTexture
);

HRESULT IDirect3DDevice9::SetSamplerState(
     DWORD Sampler, // индекс этапа выборки
     D3DSAMPLERSTATETYPE Type,
     DWORD Value
);

 

ПРИМЕЧАНИЕ
Этап выборки с индексом i связвн с i-ым этапом текстурирования. То есть i-ый этап выборки задает режимы выборки для i-ой установленной текстуры.

Индекс этапа текстурирования/выборки идентифицирует этап текстурирования/выборки для которого мы устанавливаем текстуру или режим выборки. Следовательно, мы можем разрешить использование нескольких текстур и установить для каждой из них требуемые режимы выборки, указывая различные индексы этапов. Ранее в этой книге мы всегда указывали индекс 0, задавая первый этап, поскольку использовали только одну текстуру одновременно. Если, например, нам надо разрешить использование трех текстур, мы используем этапы 0, 1 и 2, как показано ниже:

// Устанавливаем первую текстуру и режимы выборки для нее
Device->SetTexture(     0, Tex1);
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

// Устанавливаем вторую текстуру и режимы выборки для нее
Device->SetTexture(     1, Tex2);
Device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

// Устанавливаем третью текстуру и режимы выборки для нее
Device->SetTexture(     2, Tex3);
Device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

Данный код разрешает использование трех текстур, Tex1, Tex2 и Tex3, и устанавливает режимы фильтрации для каждой текстуры.

18.1.2. Координаты для нескольких текстур

Вспомните, в главе 6 говорилось, что для каждого трехмерного треугольника мы определяем соответствующий треугольный фрагмент текстуры, который накладывается на трехмерный треугольник. Мы делаем это путем добавления к данным каждой вершины координат текстуры. Таким образом, три вершины определяющие треугольник, определяют и соответствующий треугольный фрагмент текстуры.

Поскольку теперь мы используем несколько текстур, для каждой из трех определяющих треугольник вершин нам требуется определение соответствующего треугольного фрагмента каждой из используемых текстур. Мы делаем это добавляя наборы координат текстуры в данные каждой вершины — по одному набору координат для каждой используемой текстуры. Например, если мы хотим смешивать вместе три текстуры, то у каждой вершины должны быть три набора координат текстуры, индексирующих три используемые текстуры. Таким образом, структура данных вершины для мультитекстурирования с использованием трех текстур может выглядеть так:

struct MultiTexVertex
{
     MultiTexVertex(float x, float y, float z,
                    float u0, float v0,
                    float u1, float v1,
                    float u2, float v2)
     {
          _x = x; _y = y; _z = z;
          _u0 = u0; _v0 = v0;
          _u1 = u1; _v1 = v1;
          _u2 = u2; _v2 = v2;
     }

     float _x, _y, _z;
     float _u0, _v0; // Координаты текстуры накладываемой на этапе 0.
     float _u1, _v1; // Координаты текстуры накладываемой на этапе 1.
     float _u2, _v2; // Координаты текстуры накладываемой на этапе 2.

     static const DWORD FVF;
};
const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3;

Обратите внимание на использованный в настраиваемом формате вершин флаг D3DFVF_TEX3, который указывает, что структура вершины содержит три набора координат текстур. Фиксированный конвейер поддерживает до восьми наборов координат текстур. Если этого вам мало, придется использовать объявление вершин и программируемый конвейер.

ПРИМЕЧАНИЕ
В последних версиях пиксельных шейдеров можно использовать один набор координат текстуры для индексирования сразу нескольких текстур, что позволяет убрать дополнительные наборы координат текстур из данных вершины. Конечно, в этом случае подразумевается, что на каждом этапе текстурирования используются одни и те же координаты текстуры. Если координаты текстуры на разных этапах текстурирования различаются, надо использовать несколько наборов координат текстур в данных вершины.

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz