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

Текстурирование объекта

Теперь, когда мы визуализировали красный чайник, как насчет добавления новых цветов путем наложения текстуры? Поскольку мы будем просто усовершенствовать предыдущий шейдер, он будет использоваться как отправная точка к котрой будет добавляться новый код. Итоговый шейдер для данного раздела находится в файле shader_2.rfx на CD-ROM.

Воспользуемся шейдером из предыдущего раздела и закроем все окна редактирования и предварительного просмотра. Очевидно, первая вещь, которую необходимо добавить к шейдеру — это текстура. Чтобы сделать это, щелкните правой кнопкой мыши по узлу эффекта и выберите в контекстном меню команду Add Texture. В списке типов текстур выберите Add 2D Texture и введите для переменной имя MyTexture1, как показано на рис. 4.6. После того, как переменная создана, дважды щелкните по ней и в появившемся диалоговом окне выбора файла выберите файл fieldstone.tga, находящийся в каталоге с исходными кодами для данной главы на прилагаемом к книге CD-ROM.


Рис. 4.6. Добавление переменной текстуры

Рис. 4.6. Добавление переменной текстуры


Теперь, когда в вашем эффекте есть текстура, необходимо сделать так, чтобы проход визуализации знал, что должен использовать ее. Это делается путем добавления объекта текстуры к узлу прохода визуализации с помощью контекстного меню, вызываемого щелчком правой кнопки мыши (команда меню Add Texture Object). К созданному объекту текстуры необходимо добавить ссылку на узел текстуры, щелкнув по объекту текстуры правой кнопкой мыши и выбрав в контекстном меню команду Add Texture Reference. Чтобы указать ссылку на определенную текстуру, щелкните правой кнопкой мыши по узлу ссылки и с помощью контекстного меню выберите текстуру, на которую будет указывать ссылка, точно так же, как вы делали это для ссылок на модель и карту отображения потока. Двойной щелчок по узлу объекта текстуры выведет окно редактора состояний текстуры. Этот редактор показывает вам различные состояния, установка которых позволяет контролировать процесс доступа аппаратуры видеокарты к текстуре. Помимо этого в окне отображаются уменьшенные изображения всех текстур, используемых в данном проходе визуализации. Для рассматриваемого шейдера замечательно подходят значения, установленные в редакторе по-умолчанию.

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

float2 Txr1: TEXCOORD0

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

struct VS_OUTPUT
{
    float4 Pos: POSITION;
    float2 Txr1: TEXCOORD0;
};

Поскольку вам не надо выполнять никакой специальной обработки координат текстур, все, что необходимо сделать в шейдере — скопировать значение входного параметра в выходную структуру. Полученный в результате всех изменений код шейдера будет выглядеть так:

float4x4 matViewProjection;

struct VS_OUTPUT
{
    float4 Pos: POSITION;
    float2 Txr1: TEXCOORD0;
};

VS_OUTPUT vs_main( float4 inPos: POSITION,
                   float2 Txr1:  TEXCOORD0
                 )
{
    VS_OUTPUT Out;

    // Выводим для преобразованной и спроецированной
    // вершины местоположение и координаты текстуры
    Out.Pos = mul(matViewProjection, inPos);
    Out.Txr1 = Txr1;

    return Out;
}

С вершинным шейдером закончено; перейдем к пиксельному шейдеру, щелкнув по вкладке Pixel Shader в верхней части окна редактирования. Первое, что потребуется вашему пиксельному шейдеру — переменная выборки. Эта переменная сообщает вашему пиксельному шейдеру, какие текстуры доступны для использования; точно так же в вершинном шейдере вы должны были создать переменную для matViewProjection. Объект выборки добавляется путем простого добавления в начало кода пиксельного шейдера объявления переменной типа sampler с именем, соответствующим имени объекта текстуры в узле прохода, на который она будет ссылаться.

Добавьте следующую переменную к части констант в редакторе шейдера:

sampler Texture0;

Чтобы получить доступ к текстуре надо слегка подредактировать пиксельный шейдер. Во-первых, координаты текстуры должны быть входным параметром функции шейдера. Это делается точно так же как и для вершинного шейдера, и требует добавления входной переменной с семантикой TEXCOORD0. Во-вторых, внутри шейдера необходимо получить цвет пиксела из текстуры с помощью функции tex2D. Чтение данных из текстуры, определяемой объектом выборки и координатами текстуры inTxr1 выполняется с помощью следующего кода:

tex2D(Texture0,inTxr1);

С этим вызовом функции мы можем соединить все части шейдера воедино. Итоговый код пиксельного шейдера с внесенными изменениями выглядит так:

sampler Texture0;

float4 ps_main( float4 inDiffuse: COLOR0,
                float2 inTxr1:    TEXCOORD0
              ) : COLOR0
{
    // Возвращаем цвет, взятый из текстуры
    return tex2D(Texture0,inTxr1);
}

Все готово, и вы можете увидеть плоды своего труда. Как и для предыдущего шейдера, закройте окно редактирования и щелкните по кнопке панели инструментов Compile All Shaders in Active Effect. Вы должны увидеть текстурированный чайник, показанный на рис. 4.7.


Рис. 4.7. Рабочее пространство и окно предварительного просмотра для вашего второго шейдера

Рис. 4.7. Рабочее пространство и окно предварительного просмотра для вашего второго шейдера



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

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