Лекция #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.
29 июня 2006