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

Двоится в глазах

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

Чтобы добавить к сцене второй чайник, добавьте еще один проход визуализации, щелкнув правой кнопкой мыши по узлу эффекта и выбрав в контекстном меню команду Add Pass. В результате будет создан новый проход с именем Pass 1 заполненный, как обычно, предлагаемыми по умолчанию данными простого шейдера. Для второго объекта мы будем выполнять визуализацию чайинка, закрашенного сплошным непрозрачным цветом, как это делалось в самом первом шейдере из этой главы.

Первый этап — установка ссылок на модель и карту отображения потока, чтобы они указывали на требуемые узлы. Затем следует отредактировать код вершинного и пиксельного шейдера для визуализации нового чайника. Можно использовать тот же код, который был в первом созданном в этой главе шейдере, так что, возможно, вы просто скопируете код из старого шейдера и вставите его в новый. Выделите код шейдера, нажмите Ctrl+C, чтобы скопировать его, а затем нажмите Ctrl+V, чтобы вставить код в новый шейдер.

Выглядит просто, не так ли? Но подождите, здесь есть одна проблема! Чайники визуализируются один поверх другого, а мы хотим, чтобы они были расположены рядом. В RenderMonkey нет встроенного метода для указания местоположения отдельного объекта. Однако, это не помешает нам переместить второй объект. Что если мы создадим новую векторную переменную, которая будет использоваться для указания смещения второго объекта?

Чтобы сделать это щелкните правой кнопкой мыши по узлу эффекта, выберите в меню команду Add Variable, укажите тип переменной FLOAT, выберите вариант FLOAT4 и ввпереименуйте созданную переменную в teapot_position. Дважды щелкнув по новой переменной вы можете задать значения смещения для втогого чайника, который отображается во втором проходе визуализации. Можете задать в этой переменной любые значения каждой компоненты, где-нибудь в пределах ста, но помните, что значение компоненты W вектора должно быть равно нулю, поскольку любые другие значения будут влиять на визуализацию объекта.

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

float4x4 matViewProjection;
float4   teapot_position;

struct VS_OUTPUT
{
    float4 Pos: POSITION;
};

VS_OUTPUT vs_main( float4 inPos: POSITION )
{
    VS_OUTPUT Out;

    // Выводим преобразованную и спроецированную вершину со смещением
    Out.Pos = mul(matViewProjection, inPos + teapot_position);

    return Out;
}

Сейчас вы готовы к компиляции шейдера и отображеню двух чайников, как показано на рис. 4.8. Когда шейдер выполнит визуализацию, вы можете дважды щелкнуть по переменной teapot_position чтобы открыть окно редактирования переменной. Результат изменения значения переменной будет в реальном времени отображаться в окне предварительного просмотра.


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

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


Итоговый проект RenderMonkey для данного шейдера находится в файле shader_3.rfx на CD-ROM.


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

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