Не лекция. Вопросы и ответы о системе шейдерных материалов. [Отвечал shodan.]
Автор: Арсений Капулкин
Disclaimer: некоторые опечатки поправлены, некоторые реплики передвинуты. полный лог
[20:12] <kas> про материалы жги :)
[20:12] <shodan> я отделаюсь одной строкй.
[20:12] <shodan> презентацию все читали? там - тоже херня.
[20:13] <shodan> ну, это очевидно, на самом деле. no silver bullet.
[20:13] <shodan> я не знаю, что рассказывать.
[20:13] <shodan> спрашивайте...
[20:13] <Zeux> можно прокомментировать
[20:13] <Zeux> [20:12] <shodan> презентацию все читали? там - тоже херня.
[20:14] <shodan> что конкретно неясно?
[20:14] <shodan> о какой презентации речь, или почему там херня?
[20:14] <Zeux> идет речь о презентации с доклада на КРИ, я так понимаю
[20:14] <Zeux> интересно, почему там херня, да
[20:16] <shodan> "херня" лишь потому, что система имеет свои недостатки... что очевидно.
[20:16] <shodan> я не говорю, что ВСЕ плохо.
[20:16] <shodan> например, то что все шейдера предкомпилируются заранее, считаю, хорошо.
[20:16] <Zeux> это очевидно. Но на лекции насколько я помню ты упоминал только про сложность разработки.
[20:18] <shodan> какую сложность разработки? :)
[20:18] <shodan> что типа поменял шейдер - изволь перекомпилить?
[20:18] <Zeux> нет, сложность разработки всей системы.
[20:18] <shodan> ну, как на любую сложную систему, ты угробишь на нее время.
[20:19] <shodan> и надо четко осознавать, сколько и за что.
[20:19] <shodan> и окупится ли это.
[20:19] <shodan> в нашем случае, после рефактора я смог сделать кучу дополнительных разбиений ряда шейдеров, и поимел на этом плюсов к фпс.
[20:19] <shodan> еще, например, я сделал порт на ps14 уже после рефактора.
[20:20] <shodan> чуть меньше, чем за 2 рабочих дня.
[20:20] <Zeux> да, это хорошо.
[20:20] <Zeux> но это исключительно плюсы. :)
[20:20] <Zeux> а минусы?
[20:21] <shodan> ты готов угробить несколько месяцев на разработку? ;)
[20:21] <shodan> впрочем, мне было сложнее.
[20:21] <shodan> во-1х в самом начале было не совсем ясно, ЧТО же я таки делаю.
[20:21] <shodan> скажем так, если бы у меня в начале были готовые заголовки rfx.h, думаю потратил бы не 4 а 2 ;)
[20:22] <shodan> во-2х, все-таки это все вставлялось по-живому поверх существующей ублюдочной недосистемы.
[20:22] <shodan> что тоже не способствовало скоростям ;)
[20:22] <shodan> это все впрочем один минус - который разработка...
[20:23] <shodan> другие...
[20:23] <shodan> ну, можно пожаловаться на то, что для разработки нового шейдера сейчас все еще надо постоянно перекомпилить проект,
[20:23] <shodan> но,
[20:24] <shodan> никто не мешает либо делать начальную версию шейдера в том же FX composer, а потом уже интегрировать все его варианты в двигало через мега-систему,
[20:24] <shodan> равно как никто не мешает написать в систему reload на лету ;)
[20:24] <Zeux> насчет системы reload на лету. Я правильно понимаю, что в данный момент бинарные шейдеры находятся в cpp-файле?
[20:25] <shodan> да.
[20:25] <shodan> опять таки - это мое личное решение.
[20:25] <shodan> дописать компиляцию в ресурсы и загрузку оттуда - берусь за 1 день.
[20:25] <Zeux> но таким образом все равно есть рекомпиляция
[20:26] <Zeux> если меняется не просто код шейдера
[20:26] <Zeux> а что-то больше, т.е. входные параметры
[20:26] <Zeux> ну и прочее.
[20:26] <Zeux> не было желания сделать совсем data-driven?
[20:27] <shodan> хм. ну поменялись входные параметры. ну и что? ;)
[20:27] <shodan> ходи к ним из кода по именам, через базовый абстрактный интерфейс материала.
[20:27] <shodan> рекомпиляция *обязательна*, если добавляешь новый pin.
[20:27] <shodan> это - редко.
[20:28] <shodan> хорошо еще что не всего проекта.
[20:28] <Zeux> нет, погоди. Вот например есть прешейдеры. В d3dx effects, насколько я понимаю, они совсем data-driven. То есть их генерит компилятор. У тебя их генерит тоже компилятор :) но не в рантайме, а на этапе сборки.
[20:28] <Zeux> дальше, если мы добавили некоторый параметр
[20:29] <Zeux> и хотим, чтобы артист его менял
[20:29] <Zeux> в редакторе скажем
[20:29] <Zeux> то ведь меняется спецификация материала
[20:29] <Zeux> т.е. нужна перекомпиляция
[20:29] <Zeux> или нет?
[20:29] <shodan> да, есть прешейдеры.
[20:29] <shodan> у меня они транслируются тупо в C++, от лени, чтобы не писать свой плохой "компилятор"
[20:29] <shodan> но.
[20:29] <shodan> не надо путать разные этапы разработки.
[20:29] <shodan> есть этап, когда ты пишешь шейдер.
[20:30] <shodan> и есть этап, когда художник его потом использует.
[20:30] <shodan> так вот, reload на лету - в принципе нужен только для экономии времени в ходе 1го этапа.
[20:31] <shodan> впрочем, я не вижу причин, отчего параметры и не добавлять бы на лету, на самом деле.
[20:31] <shodan> махонький тупой парсер для выражений в прешейдерах, и...
[20:33] <Zeux> да, ладно, примерно ясно. То есть два основных минуса - это сложность разработки и присутствуюющая на данный момент потребность в излишне частой перекомпиляции?
[20:33] <Zeux> еще - как бы ты оценил время разработки данной системы в хороших условиях?
[20:33] <Zeux> т.е. :
[20:33] <Zeux> а) без потребности вживлять в существующий код
[20:33] <Zeux> (плохой существующий код)
[20:34] <Zeux> б) с учетом твоего опыта
[20:34] <Zeux> (т.е. имеется в виду реализация ДРУГИМ человеком с учетом ТВОЕГО опыта)
[20:34] <shodan> надо понимать, что это те минусы, которые *я* оцениваю как минусы.
[20:35] <shodan> причем очевидно в нашем случае они чем-то нивелируются. иначе были бы уже изничтожены ;)
[20:35] <shodan> я, например, рассматриваю как большой плюс то, что дизайнеру дается ряд шейдеров,
[20:36] <shodan> а собирать в редакторе из готовых "кусочков" всякую неоптимальную каку он не может.
[20:36] <shodan> для кого-то этот мой большой плюс - смертельный минус ;))
[20:36] <shodan> без потребности вживлять в существующее, я бы тупо размазал время. ну то есть не "все фичи сразу",
[20:36] <shodan> а "как понадобилась, потратил денек".
[20:36] <shodan> с учетом опыта... сложный вопрос.
[20:37] <shodan> у меня на начальную версию вместе с выработкой начальной же архитектуры параллельно ушло недели 2, что ли.
[20:37] <shodan> или 4.
[20:37] <shodan> я помню, что 2 недели это был один из key points,
[20:38] <shodan> но то ли это было и на генератор и на начальную C++ интеграцию - не помню хоть убей ;)
[20:38] <shodan> в общем, пусть будет 4 рабочих недели на начальную версию. то есть 1 месяц.
[20:38] <Zeux> ок, ясно. Еще вопрос.
[20:39] <Zeux> как (где?) производится привязка стандартных параметров шейдера - т.е. worldviewprojection и прочих?
[20:39] <Zeux> ("стандартных" - в смысле "не специфических")
[20:39] <shodan> есть функция BindSceneConstants.
[20:40] <shodan> она жестко захардкодена в генератор (список констант) с одной стороны и в код двигала в другой.
[20:40] <shodan> констант штук 20, меняются раз в полгода, не проблема.
[20:40] <shodan> ф-я вызывается "когда надо", то есть единицы раз за кадр.
[20:40] <shodan> например при начале отрисовки всех мешей.
[20:40] <Zeux> насчет списка - понятно.
[20:41] <Zeux> я не совсем это имел в виду, но сначала вопрос - почему "единицы раз за кадр"? Ведь скажем worldviewprojection изменяется достаточно часто?
[20:41] <shodan> ах. невнимательно прочитал.
[20:41] <shodan> worldviewprojection - это явно per-mesh-instance data.
[20:42] <shodan> ну, есть еще функция BindInstanceConstants ( MeshInstance_c * ) ;)))
[20:42] <shodan> worldview - единицы раз.
[20:42] <Zeux> ага, это ясно.
[20:42] <Zeux> вопрос был в том
[20:42] <Zeux> как и где указывается, что для данного шейдера в c0-c3 надо запихнуть worldviewprojection?
[20:43] <shodan> хм.
[20:43] <shodan> BindSceneConstants, BindInstanceConstants - они хардкодом, обе.
[20:44] <shodan> вот, кстати, минус!!!
[20:44] <shodan> впрочем опять таки - приделать к существующей системе возможность задавать еще и per-instance данные...
[20:44] <shodan> ну, не 1 день.
[20:44] <shodan> пусть будет 1 неделя.
[20:44] <Zeux> нет, погоди. Ну вот пусть worldviewprojection - он нужен вроде бы всем, и его можно всем в c0-c3 запихнуть
[20:44] <Zeux> а если брать что-то другое? какой-нибудь worldview, который нужен не всем?
[20:45] <Zeux> или хуже
[20:45] <Zeux> worldview_inverse_transpose?
[20:45] <Zeux> time_scaled_to_0_2pi
[20:45] <Zeux> ?
[20:45] <shodan> различаются три группы констант.
[20:45] <shodan> 1) инварианты по сцене,
[20:45] <shodan> 2) инварианты по отрисовывемой модели,
[20:47] <shodan> 3) специфичные для материала константы.
[20:48] <shodan> группа 1) - это например view*projection, она для всей сцены одинаковая, и нужна многим.
[20:48] <shodan> ставим один раз на рендер буффера, BindSceneConstants.
[20:48] <shodan> группа 2) это реально ровно 2 матрицы ;)))
[20:49] <shodan> ну, у меня и сейчас, i mean.
[20:49] <shodan> world, и как раз world*view*projection (для оптимизаций).
[20:49] <shodan> ставятся каждый раз, как переключаемся на новую модель (инстанс меша).
[20:50] <shodan> в группе 3) перемешаны diffuse_color (уникальный для каждого инстанса каждого материала),
[20:50] <shodan> и те самые time_scaled_to_0_2pi, в принципе одинаковые для всех инстансов одного материала.
10 февраля 2006
Комментарии [1]