Войти
Gamedev LectureСтатьи

Лекция #29. Убер-система микрошейдеров [Лектор - NexiliaN]

Автор:

Disclaimer: некоторые опечатки поправлены, некоторые реплики передвинуты. полный лог

[22:59] <_NexiliaN_> речь в общем о довольно простой вещи - незнаю почему такая шумиха
[22:59] <_NexiliaN_> и так.
[22:59] <_NexiliaN_> Здравствуйте товарищи! )
[22:59] <_NexiliaN_> и так начинаем наш сказ про убер микро шОйдеры.
[22:59] <_NexiliaN_> Пролог:
[22:59] <_NexiliaN_>  1.  Убер-система микрошейдыров  за это название спасибо Zeux.
[22:59] <_NexiliaN_>        a.  Убер-Шаудеры это очень толстые монстры с тонной #if/def
[22:59] <_NexiliaN_>          это из другой оперы в общем.
[22:59] <_NexiliaN_>        b.  Речь же идёт о microshaders
[23:00] <_NexiliaN_>  2.  система microshaders собирает код из фрагментов.
[23:00] <_NexiliaN_> 3.  Фрагмент ( микро-шадер ) - код на asm или на языке высокого
[23:00] <_NexiliaN_> уровня( от реализаций ) с входными/выходными данными,
[23:00] <_NexiliaN_> требованиями и профилем.
[23:00] <_NexiliaN_> 4.  лекция идёт as-is, то есть обвинять лектора в обкуренности
[23:00] <_NexiliaN_> не стоит.

[23:00] <_NexiliaN_> далее немного поиграю в q.a;)

[23:00] <_NexiliaN_> q. что такое микро шадеры и чем они лучше убершадеров?
[23:00] <_NexiliaN_> a. Убер-шадеры явно фиксированные(#if/def)  могут помочь
[23:00] <_NexiliaN_> сгенерировать несколько вариаций, но в пределах максимально
[23:00] <_NexiliaN_> заложенных возможностей *препроцессор рулит . Микро шадеры от
[23:00] <_NexiliaN_> данного недостатка избавлены и могут свободно комбинироваться c
[23:00] <_NexiliaN_> заранее неизвестными.

[23:00] <_NexiliaN_> q. зачем это надо? Как это отразится на материалах?
[23:01] <_NexiliaN_> a. в общем-то со стороны материала мало что меняется. Это скорее
[23:01] <_NexiliaN_> более тонкие возможности.
[23:01] <_NexiliaN_>    Пример: в материале обычно есть модификатор diffuse  он
[23:01] <_NexiliaN_> отвечает за diffuse(цвет точки без затенения)
[23:01] <_NexiliaN_>    например: color = sample2D(diffise,  uv) + sample2D(noise ,
[23:01] <_NexiliaN_> uv + time * 2) * sample(mask, uv). =))
[23:01] <_NexiliaN_>    и такой эффект скажем, встречается крайне редко.
[23:01] <_NexiliaN_>    Что нам теперь делать описывать все вариаций shadera или
[23:01] <_NexiliaN_> очередной uber-shader для света, кожинга и т.д.? ;)
[23:01] <_NexiliaN_>    А в случай с microshaders эта проблема отпадает.
[23:01] <_NexiliaN_>    Для этого примера мы просто создаём материал, указываем
[23:01] <_NexiliaN_> модификатор и создаём новый microshader который и делает
[23:01] <_NexiliaN_> указанную операцию.

[23:01] <_NexiliaN_> q. что такое модификатор?
[23:01] <_NexiliaN_> a. модификатор это система управление определёнными группами
[23:01] <_NexiliaN_> microshaderев. *Модификаторов столько, сколько и систем.
[23:01] <_NexiliaN_>    К Примеру: diffuse, lightmap, light, posteffect и т.д. Они
[23:01] <_NexiliaN_> зависимы и расположены иерархически. Вернёмся к ним позднее.

[23:02] <_NexiliaN_> q. то есть если просто к материалу прицепит модификатор?
[23:02] <_NexiliaN_> skinning, shader автоматически скомпилируется?
[23:02] <_NexiliaN_> a. да. Только не к материалу, а непосредственно к объекту/render
[23:02] <_NexiliaN_> actorу. (меш если хотите)
[23:02] <_NexiliaN_>    К примеру: есть на просторах, новой Зеландий, меш травы
[23:02] <_NexiliaN_> (конопли, если хотите)
[23:02] <_NexiliaN_>      мы к этому объекту просто прицепляем глобальный
[23:02] <_NexiliaN_> модификатор Vegetation waves.
[23:02] <_NexiliaN_>    Разумеется, веса должны хранится в потоке vb.

[23:02] <_NexiliaN_> Лекция:  begin: часть 1
[23:03] <_NexiliaN_> Система microshaderев представляем из себя набор и фрагментов
[23:03] <_NexiliaN_> на любом языке дружественный для GPU.
[23:03] <_NexiliaN_> Позволяет собирать из них полноценные программы для GPU
[23:03] <_NexiliaN_> (shaders).
[23:03] <_NexiliaN_> Формирует RenderGraph (точнее его узел). - Выходной сценарий
[23:03] <_NexiliaN_> обрисовки.- Последовательность установки буферов, shaderов и
[23:03] <_NexiliaN_> т.д.
[23:03] <_NexiliaN_> Я предпочёл asm в своё время (точнее свой скрипт).  это
[23:03] <_NexiliaN_> позволило более точно оценивать длину фрагмента и точнее
[23:03] <_NexiliaN_> профилировать( hlsl такого на компилит порой ). ;)

[23:03] <_NexiliaN_> MicroShader и методы ( в дальнейшем microshader == ms )
[23:05] <_NexiliaN_>  1.  Method  это непосредственно код GPU и все параметры
[23:05] <_NexiliaN_>      необходимые для того объекта.
[23:05] <_NexiliaN_>        a.  Описывается как тип method программы (может быть
[23:05] <_NexiliaN_>          ps/vs/psva/any в будущем сложнее).
[23:05] <_NexiliaN_>              i.  Пример: < method type="any" name="Normalize" template_name =
[23:05] <_NexiliaN_>                "vector3" >
[23:05] <_NexiliaN_>                  1.  type  тип программы
[23:05] <_NexiliaN_> 2.  name  имя
[23:05] <_NexiliaN_> 3.  template_name  имя для другим программ. ( реализация =] )
[23:05] <_NexiliaN_>        b.  Link  указывает явные зависимости программ.
[23:05] <_NexiliaN_>              i.  К Примеру: пиксельная программа ссылается на нужную для неё
[23:05] <_NexiliaN_>                vs программу.
[23:05] <_NexiliaN_>                  1.  Например:  <link type=vs name=baryCentricCoord>
[23:05] <_NexiliaN_>                      a.  Именно это устанавливает связку программ.


[23:06] <_NexiliaN_> korak : для какого АПИ была реализована система?
[23:07] <_NexiliaN_> апи значение иметь небудет если вы позаботитесь о собственном скрипте

[23:07] <_NexiliaN_>        c.  Include  тоже что и #include в cpp  целые ms
[23:07] <_NexiliaN_>              i.  Пример: <include name = "Normalize"/>
[23:07] <_NexiliaN_>        d.  Common  указывается необходимый общий ms до этого ms.
[23:07] <_NexiliaN_>              i.  Пример: в случай со светом
[23:07] <_NexiliaN_>                  1.  <common name = ReflectVector/>
[23:07] <_NexiliaN_>                      a.  этот объект встанет выше последнего просившего.  хотя его
[23:07] <_NexiliaN_>                          также можно запросить в IO.
[23:07] <_NexiliaN_>                            i.  Применяется в частных случаях.
[23:08] <_NexiliaN_>        e.  IO  входящий и выходящие параметры (сроковыми именами)
[23:08] <_NexiliaN_>              i.  К Примеру: <IO input = "vector3" var = "invec" proxy = any
[23:08] <_NexiliaN_>                params =/>
[23:08] <_NexiliaN_>                      a.  input  создает переменную IO для фрагмента. Где явно
[23:08] <_NexiliaN_>                          указывает, с чем работаем. Это может быть строковое имя.
[23:08] <_NexiliaN_>                            i.  Например, явное указание:  в место vector3  normal3 (что
[23:08] <_NexiliaN_>                              потребует до этого фрагмента нормаль). Не в этом случай.
[23:08] <_NexiliaN_>                  2.  var  имя как будет называться в нутрии фрагмента эта IO
[23:08] <_NexiliaN_>                    переменная.
[23:08] <_NexiliaN_>                  3.  proxy  явные Тип. (например, что это anyFloat3).
[23:08] <_NexiliaN_>                  4.  params  доп. Параметры.
[23:09] <_NexiliaN_>              ii. К Примеру: <IO output = "vector3" var = "outvec" proxy=any
[23:09] <_NexiliaN_>                params=/>
[23:11] <_NexiliaN_>        f.  Далее описывается: порядок параметров  необходимо
[23:11] <_NexiliaN_>          использование линковки в телах других фрагментов.
[23:11] <_NexiliaN_>              i.  К Примеру: <func_order> <order name = "outvec"/> <order name
[23:11] <_NexiliaN_>                = "invec"/> </func_order>.
[23:12] <_NexiliaN_>                            ii. Обязательно только для библиотечных ms как эта.
[23:12] <_NexiliaN_>        g.  Requare  описание требований (констант или текстур и т.д.)
[23:12] <_NexiliaN_>              i.  Пример: <require texLookUp = "normalizeCubeMap" var =
[23:12] <_NexiliaN_>                "nrmLookUp"/> - $к этому примеру не относится.
[23:12] <_NexiliaN_>                  1.  сто соответственно запросит самплер normalizeCubeMap
[23:12] <_NexiliaN_>                    переменная nrmLookUp - $к этому примеру не относится.
[23:12] <_NexiliaN_>              ii. Пример: <require global_constant = adaptiveBias, var =
[23:12] <_NexiliaN_>                bias/> - $к этому примеру не относится.
[23:12] <_NexiliaN_>              iii.Пример: <require interpolator = diffuse_uv, var = bias/>
[23:12] <_NexiliaN_>                - и т.д. - $к этому примеру не относится.
[23:12] <_NexiliaN_>                  1.  diffuse_uv равна общей uv.

Страницы: 1 2 3 4 Следующая »

29 июня 2006