Nebula CommunityСтатьи

Шейдеры и рендерпафы (shaders && renderpaths) практика использования

Автор:

рендерпафы Nebula2

  В этой статье я расскажу об использовании шейдеров и рендерпафов в таком замечательном проекте как "3d инструктор. вождение по москве", multisoft-web.ru
Данный материал предполагает, что читатель имеет достаточно опыта в directx, c++, xml и 3dsmax. Смысл данной статьи - познакомить читателей с волшебным миром рендерпафов и шейдеров такого замечательного движка nebula2, а также привлечь внимание дополнительных разработчиков к этому игровому движку.

  Во-первых, что такое рендерпаф. Это файл, описывающий порядок отрисовки, используемые техники, типы освещения и другие параметры для объектов на экране и других рендертаргетах. Упрощеный пример рендерпафа:

<?xml version="1.0" encoding="utf-8" ?>

<!-- render path for DX7 fixed function pipeline -->
<RenderPath name="dx7" shaderPath="home:data/shaders/fixed">

    <!-- declare shaders and technique aliases -->
    <Shader name="compose" file="shaders:shaders.fx" />
   <Shader name="passes" file="shaders:passes.fx" />
    <Shader name="phases" file="shaders:phases.fx" />

    <Shader name="static" file="shaders:shaders.fx" />

    <Float4 name="ShadowColor" value="0.0 0.0 0.0 0.25" />
    <Float4 name="FogDistances" value="0.0 1000.0 0.0 0.0" />
    <Float4 name="FogColor" value="0.5 0.5 0.5 1.0" />

    <!-- the default section -->
    <Section name="default">
        <!-- render pass -->
        <Pass name="Color" shader="passes" technique="tPassColor" clearColor="0.0 0.0 0.0 1.0" clearDepth="1.0" clearStencil="0">

            <Float4 name="FogDistances" variable="FogDistances" />
            <Float4 name="FogColor" variable="FogColor" />\

            <Phase name="opaque" shader="phases" technique="tPhaseOpaque" sort="FrontToBack" lightMode="FFP">
                <Sequence shader="static" technique="tStatic" />
            </Phase>
        </Pass>

        <!-- post-draw stuff -->
        <Pass name="gui" drawGui="Yes"/>
    </Section>
</RenderPath>

Комментарии:
сначала определяем каталог, в котором находятся необходимые нам шейдеры:

<RenderPath name="dx7" shaderPath="home:data/shaders/fixed">

в данном рендерпафе единственный материал статик из shaders.fx:

<Shader name="static" file="shaders:shaders.fx" />


различные параметры для шейдеров:

    <Float4 name="ShadowColor" value="0.0 0.0 0.0 0.25" />
    <Float4 name="FogDistances" value="0.0 1000.0 0.0 0.0" />
    <Float4 name="FogColor" value="0.5 0.5 0.5 1.0" />

в данном примере одна секция (с именем "default". секция - рендертаргет).

в секцию завернут pass:

        <Pass name="Color" shader="passes" technique="tPassColor" clearColor="0.0 0.0 0.0 1.0" clearDepth="1.0" clearStencil="0">

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

внутри паса могут находится несколько фаз (внутри которых могут быть сиквенсы):

            <Phase name="opaque" shader="phases" technique="tPhaseOpaque" sort="FrontToBack" lightMode="FFP">
                <Sequence shader="static" technique="tStatic" />
            </Phase>

сиквенсы - самый нижний уровень рендера, он определяет материалы, которые будут рендериться. например, если написать

                <Sequence shader="static" technique="tStatic" />
                <Sequence shader="universal" technique="tUniversal" />

то будут рендериться 2 материала - static и universal, вызывая соответствующие техники.

Далее после прорисовки 3d картинки, рендерится поверх GUI:

        <Pass name="gui" drawGui="Yes"/>

Итак, структура рендерпафа:

<renderpath имя>

<шейдеры>
<константы>
<рендертаргеты>


<section имя0>
  <pass имя0>
     <phase имя0>
         <sequence параметры>
         <sequence параметры>
         <sequence параметры>
         ...
     </phase>

     <phase имя1>

     </phase>
      ... 
  </pass>

  <pass имя1>

  </pass>
   ...
</section>


<section имя1>
</section>

...
</renderpath>


меняя различные сиквенсы, а также их параметры мы управляем отрисованными в сцене объектами. меняя и добавляя навые секции мы можем отрисовывать новые рендертаргеты - например, зеркало заднего вида автомобиля.

добавляя пасы после основного мы можем создавать пост-рендерные эффекты, обрабатывая уже готовую картинку. в небула2 по-умолчанию заложены следующие пост-рендерные эффекты:
-псевдо HDR
-HDRI (luminance недоделан)
-туман
-depth of view - размытость дальних объектов
-noise - кинематогрофичный пост-эффект пленки

в следующей статье, если это будет интересна, затрону подробнее эффекты небулы )))

идея рендерпафа думаю понятна

22 февраля 2007 (Обновление: 30 мар 2007)

Комментарии [1]