v 0. Pasted by Zeux as text at 2007-05-09 23:53:36 MSK and set expiration to never.

Paste will expire never.

  1. [19:59] * Zeux sets mode: +m
  2. [19:59] <Zeux> Давайте начинать.
  3. [19:59] <Zeux> Привет всем, спасибо, что пришли послушать.
  4. [20:00] <Zeux> Сначала вкратце о лекции и правилах проведения
  5. [20:00] * ZiV (mir@ircnet-27305.tesnet.ru) has joined #gamedev_lecture
  6. [20:00] * Doc-Allegator (Doc-Allega@ircnet-7189.keymachine.de) has joined #gamedev_lecture
  7. [20:00] * neteraser (evgeny.hom@85.249.133.ircnet-12281) has joined #gamedev_lecture
  8. [20:00] <Zeux> Лекция о том, как сделан рендер в игре STALKER
  9. [20:00] <Zeux> Лекция будет преимущественно проходить в +m режиме
  10. [20:00] <Zeux> т.е. говорить могу только я
  11. [20:00] <Zeux> и несознательные слушатели
  12. [20:00] <Zeux> которые являются опами
  13. [20:00] <Zeux> будут делаться перерывы на вопросы
  14. [20:01] <Zeux> наверное, 2-3
  15. [20:01] * xError (none@77.244.40.ircnet-4313) has joined #gamedev_lecture
  16. [20:01] <Zeux> если у вас возникают вопросы по ходу лекции - пишите мне в приват.
  17. [20:01] <_ShaMan_> я буду на рендер писать =)
  18. [20:01] * Zeux sets mode: -o _ShaMan_
  19. [20:01] <Zeux> Логи лекции будут доступны
  20. [20:02] <Zeux> наверное, через час после окончания
  21. [20:02] <Zeux> так что если надо будет через пол часа куда-то срочно бежать - особо не переживайте, вы сможете прочитать то, что пропустили :)
  22. [20:02] <Zeux> Теперь таки начнем.
  23. [20:03] <Zeux> Эта лекция является своеобразным продолжением лекции про рендер в Обливионе (была примерно год назад). В начале той лекции я рассказывал, почему реверс игр возможен
  24. [20:03] * NULL_PTR[afk] is now known as NULL_PTR
  25. [20:03] <Zeux> И рассказывал, как можно прореверсить большинство игр
  26. [20:03] <Zeux> Повторяться я не буду.
  27. [20:03] <Zeux> При анализе рендера Сталкера я использовал все тот же NV PerfHUD
  28. [20:03] <Zeux> который доблестные разработчики все так же (как в Обливионе) забыли отключить в финале
  29. [20:04] <Zeux> Так же были два полезных источника
  30. [20:04] <Zeux> Один - исходники шейдеров Сталкера
  31. [20:04] <Zeux> которые вынимаются из архивов с помощью утилиты
  32. [20:04] <Zeux> STALKER Data Unpacker
  33. [20:04] <Zeux> лежит где-то на ag.ru :)
  34. [20:05] * [ENRIX] (XXX@217.20.47.ircnet-4855) has joined #gamedev_lecture
  35. [20:05] <Zeux> Второй - статья Олеся (программист графики Сталкера) в GPU Gems 2
  36. [20:05] <Zeux> статья помогла значительно меньше (хотя и решила несколько вопросов), без исходников шейдеров - лекция появилась бы значительно позже
  37. [20:05] <Zeux> и была бы менее подробной.
  38. [20:05] * Vel (AntVelm@193.30.54.ircnet-3860) has joined #gamedev_lecture
  39. [20:05] <Zeux> Ну и напоследок, перед тем как начать основную часть
  40. [20:05] * Vel is now known as _VEL-
  41. [20:06] <Zeux> В сталкере есть несколько режимов рендеринга
  42. [20:06] <Zeux> 3, если быть точным
  43. [20:06] <Zeux> Я буду рассматривать только самый совершенный
  44. [20:06] <Zeux> который использует Deferred Shading
  45. [20:06] <Zeux> Поехали.
  46. [20:06] <Zeux> В Сталкере используется технология Deferred Shading
  47. [20:07] * DaGGeR (DaGGeR@62.63.193.ircnet-26975) has joined #gamedev_lecture
  48. [20:07] * ChanServ sets mode: +o DaGGeR
  49. [20:07] <Zeux> Я чуть-чуть расскажу о ней
  50. [20:07] <Zeux> чтобы людям, с ней не знакомым, было проще.
  51. [20:07] <Zeux> Основная идеология "обычного" (forward) рендеринга - для каждого меша
  52. [20:07] <Zeux> послать его на отрисовку, и в шейдерах (вершинном и пиксельном) выполнить освещение
  53. [20:08] <Zeux> Когда у вас появляются несколько источников - возникают несколько вариантов решения проблемы "как осветить меш не 1 источником, а 4"
  54. [20:08] <Zeux> В Doom 3 проблема решена так - каждый меш рисуется столько раз, сколько на него влияет источников (на самом деле, вроде немного больше).
  55. [20:08] <Zeux> Очевидно, с этим подходом возникают проблемы - увеличивается сложность трансформации геометрии
  56. [20:08] <Zeux> (особенно в случае "тяжелых" вершинных шейдеров - скелетная анимация)
  57. [20:09] <Zeux> Возрастает нагрузка на CPU
  58. [20:09] <Zeux> из-за увеличенного количества вызовов API
  59. [20:09] <Zeux> В Oblivion проблема решена чуть более хорошо, но все равно на каждый меш может приходиться до 4 кажется вызовов отрисовки
  60. [20:09] <Zeux> что не очень здорово.
  61. [20:09] <Zeux> Очевидно, если вам нужно осветить сцену большим количеством источников (50? 100?)
  62. [20:10] <Zeux> то про подобные подходы сразу можно забыть.
  63. [20:10] <Zeux> И еще одна проблема - проблема overdraw. Когда вы рисуете меш, и в пиксельном шейдере производите сложные вычисления, то не факт, что получившийся пиксель в итоге
  64. [20:10] <Zeux> (после отрисовки всей сцены)
  65. [20:10] <Zeux> будет виден на экране
  66. [20:11] <Zeux> Это решают сортировкой по расстоянию, дополнительным проходом, заполняющим глубину, и прочим
  67. [20:11] <Zeux> Deferred Shading предлагает другое решение обоих проблем
  68. [20:11] * Dgut (.@80.255.30.ircnet-3762) Quit (Connection reset by peer)
  69. [20:11] * Dgut (.@ircnet-29658.tcompressor.com) has joined #gamedev_lecture
  70. [20:11] <Zeux> Рендеринг разбивается на 2 стадии. 1 - заполнение т.н. G-buffer
  71. [20:11] <Zeux> G-buffer - это одна или несколько полноэкранных текстур
  72. [20:11] <Zeux> (размером с экран)
  73. [20:12] <Zeux> содержащих всю информацию, которая нужна для того
  74. [20:12] <Zeux> чтобы осветить сцену источником света, положить на нее тени
  75. [20:12] <Zeux> и т.д.
  76. [20:12] <Zeux> Например, очевидно, что если у вас есть в каждом пикселе его позиция в скажем world space
  77. [20:12] <Zeux> его нормаль
  78. [20:13] <Zeux> и diffuse color, взятый из диффузной текстуры
  79. [20:13] <Zeux> то этой информации достаточно, чтобы в каждом пикселе посчитать освещенность по модели скажем Фонга
  80. [20:13] <Zeux> Посчитать, находится ли он в тени (если используются Shadow maps, например)
  81. [20:13] <Zeux> и т.д.
  82. [20:14] <Zeux> Поэтому в первой стадии вся сцена рендерится в G-buffer
  83. [20:14] <Zeux> здесь происходит заполнение текстур позицией, нормалью, и прочим
  84. [20:14] <Zeux> потом для каждого источника на экран рисуется примитив (для простоты - full screen quad)
  85. [20:14] <Zeux> с хитрым пискельным шейдером
  86. [20:15] * resu_t (resu_t@82.200.198.ircnet-21895) Quit (Quit: KVIrc 3.2.6 Anomalies http://www.kvirc.net/)
  87. [20:15] * cppg (cppg@85.249.94.ircnet-3873) has joined #gamedev_lecture
  88. [20:15] * ChanServ sets mode: +o cppg
  89. [20:15] <Zeux> пиксельный шейдер читает информацию из G-buffer (позицию, нормаль, diffuse цвет, etc.)
  90. [20:15] <Zeux> и производит вычисление освещенности для данного источника
  91. [20:15] <Zeux> Если отрендерить 100 квадов с разными параметрами источника с аддитивным блендом
  92. [20:16] <Zeux> получится суммарная освещенность сцены от 100 источников.
  93. [20:16] <Zeux> Замечу, что при этом геометрическая стоимость - практически нулевая
  94. [20:16] <Zeux> (трансформировать 4 вершины на каждый источник)
  95. [20:16] <Zeux> Количество вызовов - по 1 на каждый источник
  96. [20:16] <Zeux> Однако, pixel cost - все еще большой
  97. [20:17] <Zeux> Главная проблема - если в forward renderer вы можете балансировать нагрузку между VS и PS
  98. [20:17] <Zeux> вынося часть вычислений освещенности в VS
  99. [20:17] <Zeux> то здесь вам приходится делать все в PS
  100. [20:17] <Zeux> с одной стороны - проблема, с другой - освещение юниформное - т.е. везде попиксельное :)
  101. [20:18] <Zeux> Общее введение в DS на этом я завершу. Я не рассчитываю, что тем, кто не знает, что такое DS, стало все понятно - это не цель лекции - по DS есть набор статей и tutorial-ов
  102. [20:18] <Zeux> Но надеюсь, что кто-то что-то понял. Сейчас я буду рассказывать, как DS реализован в сталкере - что-то станет более понятно (надеюсь): )
  103. [20:19] * [SpY]PiN (P@195.222.63.ircnet-22443) Quit (Ping timeout)
  104. [20:19] <Zeux> Итак.
  105. [20:19] <Zeux> В Сталкере G-buffer представлен тремя текстурами
  106. [20:20] <Zeux> все три - формата A16B16G16R16F
  107. [20:20] <Zeux> т.е. 4 канала, каждый канал - half (16-битный float)
  108. [20:20] * eHomo (eHomo@ircnet-29622.tcompressor.com) Quit (Ping timeout)
  109. [20:21] <Zeux> В первой текстуре находится нормаль в каналах RGB
  110. [20:21] <Zeux> нормаль - в view space
  111. [20:21] <Zeux> и, гм, hemi - в A
  112. [20:21] <Zeux> что такое hemi я потом скажу :)
  113. [20:22] <Zeux> во второй текстуре - позиция в каналах RGB
  114. [20:22] <Zeux> тоже view space
  115. [20:22] <Zeux> и индекс материала - в A
  116. [20:22] <Zeux> индексов 4 штуки.
  117. [20:22] <Zeux> т.е. 4 варианта материала
  118. [20:22] <Zeux> т.е. значений индекса - 4 :)
  119. [20:22] <Zeux> в третьей текстуре в RGB находится цвет
  120. [20:23] <Zeux> диффузный
  121. [20:23] <Zeux> в четвертом канале - gloss коэффициент
  122. [20:23] <Zeux> контролирующий количество спекуляра.
  123. [20:23] <Zeux> Итак, первой задачей является - заполнить эти 3 текстуры.
  124. [20:24] <Zeux> Для этого каждый видимый меш сцены рисуется в 3 текстуры с использованием MRT (из пиксельного шейдера возвращаются 3 цвета, каждый попадает в свою текстуру)
  125. [20:24] <Zeux> Теперь начинаются интересные вещи
  126. [20:25] * innochenti (innochenti@212.58.99.ircnet-13105) has joined #gamedev_lecture
  127. [20:25] <Zeux> Вершины в мешах типично занимают 32 байта для статической геометрии
  128. [20:25] <Zeux> 24 или 28 - для моделей персонажей и монстров
  129. [20:25] <Zeux> что в них хранится.
  130. [20:25] <Zeux> object space позиция вершины - float3 (12 байт)
  131. [20:26] <Zeux> нормаль - byte4 (точнее, d3dcolor; 4 байта)
  132. [20:26] <Zeux> касательная и бинормаль - так же
  133. [20:26] <Zeux> 2 текстурных координаты - каждая в short2 (4 байта)
  134. [20:27] <Zeux> это для статики, с монстрами потом
  135. [20:27] <Zeux> первая текстурная координата используется для выборки из всех текстур, кроме лайтмапа
  136. [20:27] * __Joe (bob.vilson@ircnet-16479.dp.ua) has joined #gamedev_lecture
  137. [20:27] <Zeux> вторая - для выборки из лайтмапа, в котором записано статическое освещение
  138. [20:27] <Zeux> лайтмап оригинально - с их старого рендера
  139. [20:28] <Zeux> который "статическое освещение" и про который рассказано не будет :)
  140. [20:28] <Zeux> текстурные координаты изначально имеют range -32768..32767 (потому как short)
  141. [20:28] <Zeux> для лайтмапа текс. координата просто делится на 32768
  142. [20:29] <Zeux> получается значение [-1, 1] (используется реально [0,1]), этого хватает, т.к. тайлинг не нужен
  143. [20:29] <Zeux> а лайтмапы - 2048х2048.
  144. [20:29] <Zeux> текстурные координаты делятся на 1024
  145. [20:29] <Zeux> получается значение [-32, 32]
  146. [20:29] <Zeux> так вот
  147. [20:30] <Zeux> как вы наверное заметили, в нормали, бинормали и касательной - остаются свободные компоненты
  148. [20:30] <Zeux> по 1 на вектор.
  149. [20:30] <Zeux> tangent.w и binormal.w - используются для повышения точности текстурных координат
  150. [20:30] <Zeux> в них хранится значение [0, 1], которое прибавляется к текстурной координате перед делением на 1024.
  151. [20:31] <Zeux> :)
  152. [20:31] <Zeux> В свободной компоненте нормали хранится дополнительный фактор освещенности - скорее всего, статически просчитанный Ambient Occlusion
  153. [20:31] <Zeux> поступил вопрос
  154. [20:31] <Zeux> [20:31] <MiF> iaoeaa oae caii?a?eaaouny? ;)
  155. [20:32] <Zeux> [20:31] <MiF> нафига так заморачиваться? ;)
  156. [20:32] <Zeux> отвечаю - в принципе, вроде как и незачем
  157. [20:32] <Zeux> т.е. скорее всего, это не заметно
  158. [20:32] <Zeux> но - увеличение точности ни к чему плохому привести не может, а боттлнек будет - далеко не в вершинном шейдере.
  159. [20:33] <Zeux> Итак, что же делает VS?
  160. [20:33] * egoruk (egoruk@90.189.132.ircnet-13759) Quit (Quit: )
  161. [20:33] <Zeux> 1. декодирование текстурных координат
  162. [20:34] <Zeux> 2. трансформация позиции в view space и в projection space
  163. [20:34] <Zeux> (view - для PS, projection - чтобы меш нарисовать где надо)
  164. [20:34] * aruslan (ruslan.abd@87.245.119.ircnet-13575) Quit (Quit: )
  165. [20:35] <Zeux> 3. создание матрицы, переводящей из tangent space в view space
  166. [20:35] <Zeux> (это матрица, переводящая из tangent в world (составленная из t, b, n векторов), умноженная на view матрицу)
  167. [20:36] <Zeux> 4. дополнительные данные для PS
  168. [20:36] <Zeux> а именно:
  169. [20:36] <Zeux> а. view-vector сразу в tangent space (нужен для parallax, скажу, когда будет PS)
  170. [20:37] * cppg (cppg@85.249.94.ircnet-3873) Quit (Ping timeout)
  171. [20:37] <Zeux> b. текстурная координата для detail текстуры (это текстурная координата для прочих текстур, умноженная на коэффициент тайлинга)
  172. [20:37] <Zeux> и все
  173. [20:37] <Zeux> :)
  174. [20:37] <Zeux> итак, на входе в PS:
  175. [20:37] <Zeux> view space позиция, 3 текстурные координаты (обычная, detail и lightmap), view vector в tangent space
  176. [20:38] <Zeux> и цвет, в котором normal.w (ambient occlusion coeff.)
  177. [20:38] <Zeux> в PS все еще хитрее
  178. [20:38] <Zeux> используются следующие текстуры:
  179. [20:39] <Zeux> albedo (диффузная текстура) - DXT1 формат
  180. [20:39] <Zeux> normal map (DXT5) + normal error map (DXT5)
  181. [20:39] <Zeux> detail map (DXT5)
  182. [20:39] * _ShaMan_ is now known as _ShaDer_
  183. [20:39] <Zeux> ну и лайтмап, тоже DXT5
  184. [20:40] <Zeux> в normal map находится нормаль во всех 4 каналах (сейчас скажу)
  185. [20:40] <Zeux> в normal error map в rgb находится значение
  186. [20:40] <Zeux> использующееся для корректировки нормали (сейчас скажу :)), в alpha - высота.
  187. [20:40] * Timai (timai@ircnet-6881.ufanet.ru) has joined #gamedev_lecture
  188. [20:40] * _Reystlin- (Reystlin@82.151.11.ircnet-20425) has left #gamedev_lecture
  189. [20:40] * cppg (cppg@85.249.94.ircnet-3873) has joined #gamedev_lecture
  190. [20:40] * ChanServ sets mode: +o cppg
  191. [20:41] <Zeux> сначала происходит семпл высоты из normal error map, который вместе с view vector используется для смещения
  192. [20:41] * _ShaMan_ (smwh@217.118.117.ircnet-13578) has joined #gamedev_lecture
  193. [20:41] * ChanServ sets mode: +o _ShaMan_
  194. [20:41] <Zeux> текстурной координаты на eye_vector * height * coeff.
  195. [20:41] <Zeux> это parallax mapping, на тему него есть пейпры.
  196. [20:41] * kaiko (K@ircnet-10063.trifle.net) has joined #gamedev_lecture
  197. [20:41] <Zeux> после этого по смещенной текстурной координате
  198. [20:42] <Zeux> делаются выборки из albedo, normal, normal error карт
  199. [20:42] <Zeux> нормаль считается следующим образом:
  200. [20:42] * Zakus (Zakus@ircnet-28053.farlep.net) has joined #gamedev_lecture
  201. [20:42] <Zeux> (normal.wzy - 0.5) + (normal_error.xyz - 0.5)
  202. [20:42] <Zeux> пояснения.
  203. [20:43] <Zeux> в карте нормалей нормаль хранится в виде, предложенном ATi
  204. [20:43] * ZiV (mir@ircnet-27305.tesnet.ru) Quit (Quit: Miranda IM! Smaller, Faster, Easier. http://miranda-im.org)
  205. [20:43] <Zeux> один канал - в альфе, остальные - в двух цветовых каналах
  206. [20:43] <Zeux> сделано для того, чтобы уменьшить ошибку от сжатия.
  207. [20:43] <Zeux> (от сжатия DXT)
  208. [20:43] <Zeux> обращаю особое внимание на то
  209. [20:43] <Zeux> что XYZ нормали хранится в ABG (wzy) каналах карты
  210. [20:44] <Zeux> это связано с тем, что свиззл wzyx поддерживается в ps.2.0
  211. [20:44] <Zeux> в отличие от wxyz и прочих
  212. [20:44] * suicide (NOMAIL@ircnet-13542.median.ru) has joined #gamedev_lecture
  213. [20:44] * _suicide (NOMAIL@ircnet-13542.median.ru) Quit (Ping timeout)
  214. [20:44] <Zeux> поэтому декодирование не занимает больше инструкций, чем должно
  215. [20:44] <Zeux> но, даже после этого все равно остаются ошибки из-за DXT сжатия
  216. [20:44] <Zeux> потому что DXT сжатие - lossy.
  217. [20:45] <Zeux> они корректируются дополнительным вектором из той самой normal error map.
  218. [20:45] <Zeux> Наверняка, есть отдельная утилитка, по карте нормалей и высот генерирующая эти карты.
  219. [20:45] <Zeux> Эта нормаль - в tangent space
  220. [20:45] <Zeux> он разный в разных пикселях модели
  221. [20:46] <Zeux> поэтому нормаль трансформируется в view space.
  222. [20:46] <Zeux> Замечу, что в normal error map использованы все 4 канала (значение для корректировки плюс высота), а в normal map - все, кроме красного
  223. [20:46] <Zeux> в красном канале находится gloss factor - попиксельный коэффициент для спекуляра
  224. [20:47] <Zeux> т.е. у нас есть нормаль (в view space), gloss factor и высота
  225. [20:48] <Zeux> кстати, в вычислении высоты в шейдере сталкера опечатка - она берется не из alpha канала normal error, а из blue.
  226. [20:48] <Zeux> далее, происходит семпл из detail текстуры
  227. [20:49] <Zeux> и финальный цвет считается как albedo.rgb * detail.rgb * 2
  228. [20:49] <Zeux> финальный gloss factor - gloss * detail.a * 2
  229. [20:49] <Zeux> умножение на 2 - затем, чтобы можно было как засветлять цвет (значения от 0.5 до 1)
  230. [20:49] <Zeux> так и затемнять (0-0.5)
  231. [20:50] <Zeux> наконец, выводим данные в G-buffer!
  232. [20:50] <Zeux> в первую текстуру идет, напомню, нормаль (которая нормализуется перед записью)
  233. [20:50] <Zeux> и hemi. hemi - это коэффициент освещенности, в случае наличия лайтмапа он считается как среднее между r, g, b каналами лайтмапа
  234. [20:51] <Zeux> в случае отсутствия берется из данных вершины (см. выше)
  235. [20:51] <Zeux> во вторую текстуру идет позиция и индекс материала
  236. [20:51] <Zeux> индекс материала - либо константа шейдера (если нет лайтмапа), либо alpha-канал лайтмапа
  237. [20:51] <Zeux> позиция считается хитро :)
  238. [20:52] * resu_t (resu_t@82.200.198.ircnet-21895) has joined #gamedev_lecture
  239. [20:52] <Zeux> все, наверное, в курсе, что есть такой displacement mapping
  240. [20:52] <Zeux> когда смещаются вершины на нормаль * высоту * коэффициент
  241. [20:52] <Zeux> если вершин много - получается красиво
  242. [20:53] <Zeux> так вот, выводится не оригинальная позиция, а позиция, смещенная на нормаль * высоту * коэффициент
  243. [20:53] <Zeux> понятное дело, это не сделает видимых выступов
  244. [20:53] <Zeux> но!
  245. [20:53] * zooLuus (Miranda@91.145.82.ircnet-23187) has joined #gamedev_lecture
  246. [20:53] <Zeux> эта модификация делает так, что тени при отбрасывании считаются так, как будто пиксели действительно сдвинуты
  247. [20:53] <Zeux> на указанную высоту
  248. [20:54] <Zeux> т.е. если у вас есть плоскость, на которой normal map
  249. [20:54] <Zeux> * normal mapping
  250. [20:54] <Zeux> то без этой модификации тень на плоскость будет ровной
  251. [20:54] <Zeux> а с ней - будет искривляться, как бы ложась на действительно искривленную поверхность
  252. [20:54] <Zeux> надеюсь, понятно
  253. [20:54] <Zeux> [20:54] <paladinrus> так это получается РОМ в упрощённом варианте?
  254. [20:54] <Zeux> если это про параллакс
  255. [20:55] <Zeux> то в принципе да, это POM в упрощенном варианте.
  256. [20:55] <Zeux> и, наконец
  257. [20:55] <Zeux> в третью текстуру выводится цвет в rgb и gloss factor в a (см. выше)
  258. [20:55] * _Reystlin- (Reystlin@82.151.11.ircnet-20425) has joined #gamedev_lecture
  259. [20:56] <Zeux> замечу, что тут есть очевидные вариации
  260. [20:56] <Zeux> может не быть normal map
  261. [20:56] <Zeux> может не быть detail map
  262. [20:56] <Zeux> может не быть light map
  263. [20:56] <Zeux> может не быть ничего, кроме albedo :)
  264. [20:56] <Zeux> и т.д.
  265. [20:56] * Zakus (Zakus@ircnet-28053.farlep.net) Quit (Quit: ChatZilla 0.9.78.1 [Firefox 2.0.0.1/2006120418])
  266. [20:56] <Zeux> все эти вариации очевидны, они разруливаются #ifdef в шейдерах
  267. [20:56] <Zeux> и останавливаться на них я не буду.
  268. [20:57] <Zeux> Есть несколько маленьких модификаций
  269. [20:57] <Zeux> Но я думаю, о них надо после перерыва.
  270. [20:57] * Zeux sets mode: -m
  271. [20:57] <Zeux> можно позадавать вопросы :)
  272. [20:57] <Zeux> минут 5.
  273. [20:57] <cppg> Ламерский вопрос: откуда ты знаешь, есть ли там ифдев? или он реально есть в сырцах?
  274. [20:58] <paladinrus> есть
  275. [20:58] <paladinrus> причём немало
  276. [20:58] <Zeux> тебя не было в начале лекции - к счастью, шейдеры хранятся в ресурсах в виде HLSL
  277. [20:58] <Zeux> и к счастью, есть распаковщик.
  278. [20:58] <paladinrus> %)
  279. [20:58] <Zeux> без этого информация была бы менее подробной и с большим количеством неточностей :)
  280. [20:58] <kas> пачиму дифузная текстура дхт1, они альфу неюзают?
  281. [20:58] <Zeux> ой, спасибо
  282. [20:59] <cppg> А когда он их компиляет? на старте, что тормозно, или on demand, что совсем пиздец?
  283. [20:59] <Zeux> при рендеринге решеток юзается DXT5
  284. [20:59] <Zeux> ну и прочего с альфой
  285. [20:59] <UFOnaut> кстати, да, как деферред живёт с прозрачностью в сталкере?
  286. [20:59] <Zeux> cppg, на старте вроде как
  287. [20:59] <kas> понятно
  288. [20:59] <Zeux> UFOnaut, то, что с альфа тестом - понятно, как живет
  289. [20:59] <Zeux> то, что надо блендить (частицы, огонь) - рендерится потом
  290. [20:59] <Zeux> и не освещается.
  291. [20:59] <UFOnaut> нет, с блендом
  292. [20:59] <UFOnaut> а, ок
  293. [20:59] <Zeux> решетки - только с альфа тестом, трава - тоже
  294. [21:00] <paladinrus> вопрос немного не в тему
  295. [21:01] <__Joe> G-buffer как расшифровывается?
  296. [21:01] <paladinrus> в чём отличие прорисовки травы в сталкере скажем от того же обливиона, ибо в сталкере она сделана довольно качественно и к тому ж е практически не тормозит
  297. [21:01] <_ShaMan_> __Joe в гугл
  298. [21:01] * tmp (svarog@91.122.5.ircnet-4017) has joined #gamedev_lecture
  299. [21:01] <Zeux> __Joe, geometry buffer
  300. [21:01] <Zeux> потому что в нем хранится информация о геометрии
  301. [21:01] <Zeux> я уже не помню, как трава рисовалась в обливионе
  302. [21:01] <Zeux> как рисуется в сталкере - скажу.
  303. [21:03] * kaiko (K@ircnet-10063.trifle.net) Quit (Ping timeout)
  304. [21:03] <Dorfe> а сколько DIP'ов в сталкере?..
  305. [21:03] <Zeux> скажу.
  306. [21:03] * Pik (1@ircnet-28190.p-t-k.net) has joined #gamedev_lecture
  307. [21:03] <Zeux> хотя, скажу сейчас, почему нет :)
  308. [21:03] <_ShaMan_> 5 минут прошло
  309. [21:03] <cppg> 5k!
  310. [21:03] <Zeux> в простом индоре - 1.5 тысячи
  311. [21:03] <Zeux> в аутдоре - 2.5
  312. [21:03] <Zeux> из-за теней.
  313. [21:04] <Zeux> не было бы теней, было бы 100-400 :)
  314. [21:04] <Dorfe> ужос =)
  315. [21:04] <Zeux> количество треугольников - от 700к до 1.2к примерно
  316. [21:04] <_ShaMan_> в батчи что-ли собираются?
  317. [21:04] <_ShaMan_> *700
  318. [21:05] <_ShaMan_> 700000 это уже как-то много :)
  319. [21:05] * innochenti (innochenti@212.58.99.ircnet-13105) Quit (Ping timeout)
  320. [21:05] * eHomo (eHomo@217.118.118.ircnet-13316) has joined #gamedev_lecture
  321. [21:05] <cppg> Кстати да, много вертексов
  322. [21:06] <Dale_ee> так сколько вертексов? :) 700к - 1200к?
  323. [21:06] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  324. [21:06] * ChanServ sets mode: +o ShTiRLiC
  325. [21:06] * REALxError (none@77.244.32.ircnet-11854) has joined #gamedev_lecture
  326. [21:06] * xError (none@77.244.40.ircnet-4313) Quit (Ping timeout)
  327. [21:06] <Zeux> треугольников столько
  328. [21:06] <Antoha2> ботднек все равно в ПС - вот они и решили наверно что можно геометрию усложнить :)
  329. [21:06] <Zeux> вершин не знаю
  330. [21:06] <ShTiRLiC> Через 5 минут??
  331. [21:06] <Zeux> количество треугольников в отдельных моделях
  332. [21:06] <Zeux> дерево - 720
  333. [21:06] <Zeux> куст - 250
  334. [21:07] <Zeux> персонажи - 4.5 к
  335. [21:07] <Zeux> оружие - 1.5 к примерно
  336. [21:07] * korak (KorakIRC@ircnet-358.mtu-net.ru) has joined #gamedev_lecture
  337. [21:07] <cppg> Вроде нормально
  338. [21:07] <UFOnaut> стрипы?
  339. [21:07] <Zeux> из 4.5 к 4к - тело, 0.5к - лицо
  340. [21:07] * kas changes topic to 'Лекция "R.E.N.D.E.R.", лектор - Zeuxт | Требуются лекторы | Логи лекций здесь: http://www.gamedev.ru/community/gamedev_lecture/articles/'
  341. [21:07] <MiF> на фоне этого руки выглядят несуразно
  342. [21:07] <Zeux> нет, не стрипы
  343. [21:07] * ShTiRLiC changes topic to 'Лекция "R.E.N.D.E.R.", лектор - Zeux | Требуются лекторы | Логи лекций здесь: http://www.gamedev.ru/community/gamedev_lecture/articles/'
  344. [21:07] * kas changes topic to 'Лекция "R.E.N.D.E.R.", лектор - Zeux | Требуются лекторы | Логи лекций здесь: http://www.gamedev.ru/community/gamedev_lecture/articles/'
  345. [21:07] <cppg> Короче обычный писишный бардак %)
  346. [21:08] * cppg changes topic to 'Лекция "R.E.N.D.E.R.", лектор - Zeux | Требуются лекторы | Логи лекций здесь: http://www.gamedev.ru/community/gamedev_lecture/articles'
  347. [21:08] <_ShaMan_> 0
  348. [21:08] <paladinrus> чо за нах ?
  349. [21:08] * Zeux sets mode: +m
  350. [21:09] <Zeux> на всякий случай, еще раз - шейдеры действительно компилируются при загрузке
  351. [21:09] <Zeux> каждый раз
  352. [21:09] * __sanek (Sanek@217.150.40.ircnet-2629) Quit (Quit: умоется кровавыми слезам тот, кто усомнится в нашем миролюбии)
  353. [21:09] <Zeux> проверить очень просто, я убирал блур для теней
  354. [21:09] <Zeux> чтобы понять, какого они реально разрешения :)
  355. [21:09] <Zeux> об этом позже, впрочем.
  356. [21:09] <Zeux> Итак, вариации.
  357. [21:09] <Zeux> 1. скиннинг
  358. [21:10] <Zeux> для скиннинга все в общем похоже, только текстурной координаты для лайтмапа нет в вершине
  359. [21:10] <Zeux> используются матрицы 3x4
  360. [21:10] <Zeux> максимум 78 штук
  361. [21:10] <Zeux> (vs.2.0)
  362. [21:10] <Zeux> (vs.3.0 точнее даже, да)
  363. [21:10] <Zeux> важное отличие
  364. [21:10] * REALxError (none@77.244.32.ircnet-11854) Quit (Ping timeout)
  365. [21:10] <Zeux> максимум 2 кости на вершину.
  366. [21:11] * ShTiRLiC sets mode: +q
  367. [21:11] * paladinrus (Rus@87.118.105.ircnet-13338) has left #gamedev_lecture (+q)
  368. [21:11] <Zeux> либо 1 кость, тогда в вершине хранится ее индекс
  369. [21:11] * Antoha2 (NeoRa_uzer@84.18.34.ircnet-12778) has left #gamedev_lecture (+q)
  370. [21:11] <Zeux> и вершина занимает 24 байта
  371. [21:11] <Zeux> либо 2 кости, тогда 2 индекса и 1 вес (второй считается как 1 - первый)
  372. [21:11] * zooLuus (Miranda@91.145.82.ircnet-23187) has left #gamedev_lecture (+q)
  373. [21:11] <Zeux> тогда 28 байт
  374. [21:11] * paladinrus (Rus@87.118.105.ircnet-13338) has joined #gamedev_lecture
  375. [21:12] <Zeux> позиция при скиннинге хранится в short4
  376. [21:12] <Zeux> и распаковывается до range в [-12, +12]
  377. [21:12] <Zeux> текс. координата - до [-16, +16] без трюков
  378. [21:12] <Zeux> больше интересного в скиннинге нет.
  379. [21:12] * zooLuus (Miranda@212.58.50.ircnet-22434) has joined #gamedev_lecture
  380. [21:12] <Zeux> 2. ландшафт
  381. [21:13] <Zeux> ландшафт рисуется патчами, размер патча - 50-200 треугольников
  382. [21:13] <Zeux> в кадре - 30-40 патчей где-то в среднем, если далеко не смотреть
  383. [21:13] <Zeux> патчи все одного размера, алгоритм точно не знаю, т.к. перфхуд отказывался показывать сетку для мешей
  384. [21:13] <Zeux> но скорее всего никакого lod нет :) хотя и не уверен.
  385. [21:14] <MiF> есть
  386. [21:14] <MiF> на глаз видно
  387. [21:14] * xError (chatzilla@ircnet-28527.net.ua) has joined #gamedev_lecture
  388. [21:14] <Zeux> ок, whatever
  389. [21:14] <Zeux> на ландшафт - 10 текстур.
  390. [21:14] <Zeux> т.е. на патч
  391. [21:14] <Zeux> 1 текстура - диффузный цвет всего уровня
  392. [21:14] <Zeux> 2048х2048
  393. [21:15] <Zeux> 1 текстура - RGBA маска для сплаттинга с весами
  394. [21:15] <Zeux> тоже 2048х2048 - они все 2048х2048.
  395. [21:15] <Zeux> и 4 слоя
  396. [21:15] <Zeux> на каждый слой - diffuse и normal map
  397. [21:15] * akaVoRoN (akavoron@ircnet-21318.novgorod.net) has left #gamedev_lecture (+q)
  398. [21:16] <Zeux> результирующий цвет считается как семпл из текстуры для всего уровня, умноженный на 2 и на взвешенную сумму диффузных цветов слоев
  399. [21:16] * Joric (joric@90.150.27.ircnet-11915) has left #gamedev_lecture (+q)
  400. [21:16] <Zeux> т.е. diffuse * 2 * (mask.r * diffuse0 + mask.g * diffuse1 + mask.b * diffuse2 + mask.a * diffuse3)
  401. [21:16] <Zeux> gloss хранится в альфа каналов normal map, считается аналогично
  402. [21:16] <Zeux> нормаль считается как взвешенная сумма нормалей
  403. [21:17] <Zeux> ну и делается более контрастный бамп делением .z компоненты нормали пополам.
  404. [21:18] <Zeux> 3. деревья, трава
  405. [21:18] <Zeux> тут два момента
  406. [21:18] <Zeux> во-первых, поддерживается инстансинг
  407. [21:18] <Zeux> shader-based
  408. [21:18] <Zeux> [21:18] <Dale_ee> Вопрос: зачем нормал мап на каждый слой сплаттинга?
  409. [21:19] <Zeux> ну, каждый слой представляет собой разный материал. Скажем, на одном - это песок с небольшими камнями
  410. [21:19] <Zeux> камни - выступы
  411. [21:19] <Zeux> на другом - трава какая-нибудь, там рельеф другой
  412. [21:19] <Zeux> т.е. это именно не общая приблизительная нормаль для ландшафта, а нормаль для каждого материала, причем на высоко детализированной текстуре
  413. [21:20] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  414. [21:20] <Zeux> итак, инстансинг
  415. [21:20] <Zeux> на каждый инстанс модели отводится 4 float4
  416. [21:20] * java661 (java661@ircnet-21318.novgorod.net) has joined #gamedev_lecture
  417. [21:21] <Zeux> 3 - world матрица
  418. [21:21] <Zeux> последний - дополнительные коэффициенты
  419. [21:21] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  420. [21:21] <Zeux> (тот самый hemi, индекс материала)
  421. [21:21] <Zeux> всего 200 коэффициентов отводится, т.е. можно по 50 инстансов за раз рисовать
  422. [21:21] * Filippok (FilSoftw@217.118.105.ircnet-12289) has joined #gamedev_lecture
  423. [21:22] * Joric (joric@90.150.27.ircnet-11915) has joined #gamedev_lecture
  424. [21:22] <Zeux> вершины - по 20 байт, позиция, текс. координата
  425. [21:22] <Zeux> номер инстанса
  426. [21:22] <Zeux> (индекс в табличке матриц)
  427. [21:22] <Zeux> и доп. коэффициент
  428. [21:23] <Zeux> показывающий, насколько вершина подвержена анимации (ветер)
  429. [21:23] <Zeux> анимация делается следующим образом - вершина в плоскости XZ сдвигается на вектор wind (направление вектора + сила), умноженный на коэффициент из вершины
  430. [21:23] <Zeux> и на время
  431. [21:24] <Zeux> поэтому анимация травы в сталкере такая... страшненькая.
  432. [21:24] <Zeux> впрочем, мне рассказали, что такое бывает в жизни. Может быть. :)
  433. [21:24] <Zeux> так
  434. [21:24] <Zeux> про заполнение G-buffer вроде все
  435. [21:25] <Zeux> теперь еще, спасибо MiF, напомнил
  436. [21:25] <Zeux> тут спрашивали про alpha blend
  437. [21:25] <Zeux> замечу, что alpha blend является реальной проблемой в deferred shading
  438. [21:25] <Zeux> когда у вас есть полупрозрачный объект
  439. [21:25] <Zeux> то в одном пикселе у вас есть 2 точки.
  440. [21:25] <Zeux> точка полупрозрачного объекта
  441. [21:25] <Zeux> и находящаяся ЗА ней
  442. [21:25] <Zeux> точка сплошного объекта
  443. [21:26] <Zeux> (или, не дай бог, еще одного полупрозрачного, и т.д.)
  444. [21:26] <Zeux> поскольку G-buffer должен хранить всю информацию о видимой части сцены, то все очень плохо
  445. [21:26] <Zeux> можно пытаться делать несколько слоев G-buffer
  446. [21:26] <Zeux> но
  447. [21:26] <Zeux> есть еще одна проблема deferred shading, о которой я не сказал.
  448. [21:26] <Zeux> память.
  449. [21:26] <Zeux> в сталкере используются 3 текстуры
  450. [21:27] <Zeux> каждый пиксель занимает 8 байт.
  451. [21:27] <Zeux> получаем 30 мегабайт в 1280x1024
  452. [21:27] <Zeux> только на G-buffer.
  453. [21:27] <Zeux> это и так - очень много
  454. [21:27] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  455. [21:27] <Zeux> а если делать даже два слоя - будет просто неподъемно
  456. [21:27] <Zeux> есть разные техники, позволяющие подправить положение с занимаемой памятью, я о них говорить не буду
  457. [21:28] <Zeux> но в целом - с  полупрозрачными объектами deferred shading работать практически не умеет.
  458. [21:28] <Zeux> В сталкере они рисуются отдельно.
  459. [21:28] <Zeux> Итак, я вроде все сказал про G-buffer. Давайте те, у кого остались вопросы именно по этой фазе
  460. [21:28] <Zeux> зададут их.
  461. [21:28] <Zeux> и двинемся дальше
  462. [21:28] * Zeux sets mode: -m
  463. [21:29] <vshabanov> а максимум 2 кости на вершину -- это не маловато?
  464. [21:29] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  465. [21:29] <Zeux> с моей точки зрения - можно было бы и больше
  466. [21:29] <Zeux> с другой стороны - персонажи в сталкере не настолько выразительные
  467. [21:29] <Zeux> наверное, им хватило :)
  468. [21:29] <Zeux> подозреваю
  469. [21:29] <Zeux> что изначально в старом рендере (dx8) было такое ограничение
  470. [21:29] <_ShaMan_> для всего скелета нормально. а вот для лицевой анимации =\
  471. [21:29] <MiF> артистов на это уламывали 5 лет назад ;)
  472. [21:29] <Zeux> да
  473. [21:30] <Zeux> а новый арт делать не будешь
  474. [21:30] <Zeux> _ShaMan_, там ее нет:)
  475. [21:30] * laticq (laticq@10.24.174.ircnet-27187) has left #gamedev_lecture (+q)
  476. [21:30] <_ShaMan_> Zeux угу. я в общем :)
  477. [21:30] <paladinrus> небольшое имхо по траве
  478. [21:31] <paladinrus> можно было бы сделать норм и при движении в одной плоскости
  479. [21:31] <Zeux> безусловно
  480. [21:31] <paladinrus> просто видимо плоскость двигается как-то дёргано
  481. [21:31] * Shai-Hulud (Shai-Hulud@83.167.73.ircnet-22380) has left #gamedev_lecture (+q)
  482. [21:31] <Zeux> у них просто линейное движение, одинаковое на все травинки видимо
  483. [21:31] <paladinrus> потому-что сам видел
  484. [21:31] <vshabanov> полупрозрачные объекты рисуются отдельно -- это, по старинке, уже после всего DS?
  485. [21:31] <Zeux> vshabanov, да
  486. [21:31] <paladinrus> в некоторых моментах обычно когда нет ветра %) трава движется очень даже неплохо
  487. [21:32] <paladinrus> а в порывах какое-то непонятное дёргание начинается
  488. [21:32] <cppg> Трава это pain
  489. [21:32] <WhiteWind> Мне показалось, или у них там плохо с отсечением невидимых объектов?
  490. [21:32] <Zeux> смотря что тебе показалось :)
  491. [21:32] <Zeux> occlusion culling у них нет
  492. [21:32] <Zeux> насколько я понимаю, в индорах у них порталы
  493. [21:33] <Zeux> в остальном - у них с ним нормально
  494. [21:33] <Zeux> точнее, Олесь в статье в GPU Gems 2 писал, что есть (occlusion culling) с использованием OQ, но я не заметил - мб убрали, мб это опция в конфиге, которую решили не ставить по-умолчанию.
  495. [21:33] * innochenti (innochenti@212.58.40.ircnet-12486) has joined #gamedev_lecture
  496. [21:34] <WhiteWind> А, мне так казалось, когда я не знал про DS. Торможу
  497. [21:34] <cppg> Жги уже дальше?
  498. [21:34] <paladinrus> ага дальше
  499. [21:34] <Zeux> Вопросы еще остались? :)
  500. [21:34] <paladinrus> а
  501. [21:34] <paladinrus> один
  502. [21:34] <paladinrus> можешь формулу расчёта нормали для ландщафта привечти
  503. [21:35] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  504. [21:35] <paladinrus> как для цвета привёл %)
  505. [21:35] <Zeux> float3 normal = mask.r * normal0 + mask.g * normal1 + mask.b * normal2 + mask.a * normal3;
  506. [21:35] <Zeux> normal.z /= 2;
  507. [21:36] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  508. [21:36] <Zeux> если точнее
  509. [21:36] <Zeux> normal.z /= 2; //. make bump twice as contrast (fake, remove me if possible)
  510. [21:36] <paladinrus> ок спасибо, так и думал в принципе
  511. [21:36] * Zeux sets mode: +m
  512. [21:36] <Zeux> ну что
  513. [21:36] <Zeux> у нас есть G-buffer - те самые три текстуры.
  514. [21:36] <Zeux> теперь хочется получить освещение от большого-большого количества источников :)
  515. [21:37] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  516. [21:37] <Zeux> сначала - чуть-чуть о тенях.
  517. [21:37] <Zeux> О тенях информация не очень полная по очевидным для тех, кто делал shadow maps причинам - нет доступа к коду
  518. [21:37] <Zeux> а основное - там :)
  519. [21:37] <Zeux> (к С++)
  520. [21:37] <Zeux> тем не менее.
  521. [21:37] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  522. [21:37] * ChanServ sets mode: +o ShTiRLiC
  523. [21:37] * innochenti (innochenti@212.58.40.ircnet-12486) has left #gamedev_lecture (+q)
  524. [21:37] <Zeux> Во-первых, используются несколько SM 2k x 2k
  525. [21:38] <cppg> Asm? %)
  526. [21:38] <Zeux> они работают как пул, т.е. в них размещаются шадовмапы меньшего размера (ну и иногда такого же)
  527. [21:38] <Zeux> cppg, оставлю это тебе ;)
  528. [21:38] <Zeux> для солнца вроде выделяется 1 2k x 2k
  529. [21:38] <Zeux> для остальных - меньшие
  530. [21:38] <Zeux> т.е. в итоге шадовмапа побита на куски
  531. [21:38] <Zeux> в каждом - шадовмапа для отдельного источника
  532. [21:38] <Zeux> картинок нет, к сожалению
  533. [21:38] * OOFOnaoot (kukunushki@ircnet-20855.nwgsm.ru) has joined #gamedev_lecture
  534. [21:39] <Zeux> форматы шадовмапов зависят от платформы
  535. [21:39] <Zeux> либо R32F (одноканальный float)
  536. [21:39] <Zeux> либо D24X8
  537. [21:39] <Zeux> (текстура глубины) - это на NVidia
  538. [21:39] * UFOnaut (kukunushki@ircnet-20318.nwgsm.ru) has left #gamedev_lecture (+q)
  539. [21:39] <Zeux> либо DF16/24 (какой - не знаю :)) - это на ATi
  540. [21:39] * laticq (laticq@ircnet-28841.net.ru) has joined #gamedev_lecture
  541. [21:40] * Pik (1@ircnet-28190.p-t-k.net) has left #gamedev_lecture (+q)
  542. [21:40] <Zeux> как происходит чтение из них.
  543. [21:40] <Zeux> сначала определяется примитив - "прочитать значение затененности с билинейным PCF 2x2"
  544. [21:40] * afkos (Kostya@ircnet-1713.photon.ru) has joined #gamedev_lecture
  545. [21:40] <Zeux> т.е. - прочитать 4 текселя
  546. [21:40] <Zeux> как в билинейной фильтрации
  547. [21:40] <Zeux> произвести сравнение с глубиной
  548. [21:40] <Zeux> смешать полученные 4 значения билинейно.
  549. [21:40] <Zeux> На NV этот примитив реализован в железе
  550. [21:41] <Zeux> поэтому это просто семпл из текстуры
  551. [21:41] * Pik (1@ircnet-28158.p-t-k.net) has joined #gamedev_lecture
  552. [21:41] <Zeux> на ATi делается FETCH4
  553. [21:41] <Zeux> (на новых ATi можно выбрать за 1 инструкцию сразу 4 пикселя (2х2) из одноканальной текстуры. Есть пейпры в ATi SDK)
  554. [21:41] <Zeux> либо просто 4 семпла со сравнением, если его нет
  555. [21:42] * zooLuus (Miranda@212.58.50.ircnet-22434) has left #gamedev_lecture (+q)
  556. [21:42] <Zeux> поправка, для ATi используется всегда DF24.
  557. [21:42] <Zeux> Дальше этот примитив используется 4 раза
  558. [21:43] <Zeux> семплинг с текс. координатой, сдвинутой на (+-1, +-1)
  559. [21:43] <Zeux> полученные 4 значения суммируются и делятся на 4
  560. [21:43] <Zeux> получается как бы PCF 4x4
  561. [21:43] <Zeux> не совсем так, но похоже :)
  562. [21:43] <Zeux> также для солнца поддерживается jittered sampling
  563. [21:43] * _Reystlin- (Reystlin@82.151.11.ircnet-20425) has left #gamedev_lecture (+q)
  564. [21:44] <Zeux> есть 2 текстуры со случайными смещениями (в каждом пикселе хранятся 2 float2 смещения)
  565. [21:44] <Zeux> смещения читаются из текстуры, используются для смещения текс. координаты
  566. [21:44] <Zeux> и делается уже выборка.
  567. [21:45] <Zeux> для этих текстур генерируются текс. координаты в зависимости от позиции
  568. [21:45] <Zeux> это известный метод, опять же - интересно - ищите пейпры :)
  569. [21:45] <Zeux> и кстати о нем говорил Семен в своей лекции, кажется.
  570. [21:45] * Zakus (Zakus@ircnet-28053.farlep.net) has joined #gamedev_lecture
  571. [21:45] <Zeux> Вопрос omni лайтов решается просто
  572. [21:45] <Zeux> omni лайт представлен 6 спот лайтами.
  573. [21:46] * zooLuus (Miranda@212.58.50.ircnet-22434) has joined #gamedev_lecture
  574. [21:46] <cppg> +
  575. [21:46] <cppg> сорри
  576. [21:47] <Zeux> тени съедают основную массу DIPs
  577. [21:47] <Zeux> порядка 1.5 тысяч.
  578. [21:47] <Zeux> в среднем.
  579. [21:47] * cppg sets mode: -o cppg
  580. [21:47] <Zeux> что касается техники, используемой для генерации матриц тени
  581. [21:48] <Zeux> по имеющейся информации, используются различные перспективные техники
  582. [21:48] <Zeux> более полной информации нет.
  583. [21:48] <Zeux> по очевидным причинам.
  584. [21:48] <Zeux> перспективность кстати легко заметить, если отключить фильтрацию теней
  585. [21:48] <Zeux> в шейдерах
  586. [21:48] <Zeux> при повороте камеры край теней даже от статических лампочек - будет плыть :)
  587. [21:49] <Zeux> так, с тенями все
  588. [21:49] <Zeux> теперь собственно освещение.
  589. [21:49] * resu_t (resu_t@82.200.198.ircnet-21895) has left #gamedev_lecture (+q)
  590. [21:49] <Zeux> Следующая фаза после заполнения G-buffer в сталкере - создание текстуры
  591. [21:49] <Zeux> формата A16B16G16R16F
  592. [21:49] <Zeux> с информацией о освещенности пикселей
  593. [21:49] <Zeux> конкретно, в альфа канале хранится спекулярная составляющая (бликовая т.е.)
  594. [21:49] <Zeux> в rgb - диффузная.
  595. [21:50] <Zeux> заполняется текстура очень просто - рендерятся примитивы, соответствующие источникам света
  596. [21:50] <Zeux> т.е.
  597. [21:50] <Zeux> цель в том
  598. [21:50] <Zeux> чтобы отрисовать такой примитив
  599. [21:50] <Zeux> который накроет все пиксели в G-buffer
  600. [21:50] <Zeux> которые могут получить свет от этого источника
  601. [21:50] <Zeux> и в каждом пикселе в пиксельном шейдере - посчитать освещение.
  602. [21:50] <Zeux> в forward rendererах
  603. [21:51] <Zeux> обычно для оптимизации освещения делают хитрые выборки
  604. [21:51] <Zeux> т.е. есть скажем omni источник, у него есть радиус
  605. [21:51] <Zeux> дальше него он не светит.
  606. [21:51] <Zeux> поэтому дополнительный проход с ним можно делать лишь для тех мешей
  607. [21:51] * OOFOnaoot (kukunushki@ircnet-20855.nwgsm.ru) has left #gamedev_lecture (+q)
  608. [21:51] <Zeux> чей bbox пересекается со сферой источника.
  609. [21:51] <Zeux> в deferred shading все проще - для omni источника рендерится сфера.
  610. [21:52] <Zeux> честная сфера, из полигонов.
  611. [21:52] <Zeux> она покрывает лишь те пиксели, которые могут быть освещены источником, очевидно
  612. [21:52] <Zeux> (сфера рендерится без depth test)
  613. [21:52] <Zeux> для directional light рендерится full screen quad
  614. [21:52] <Zeux> для spot - сектор шара
  615. [21:53] <Zeux> ну т.е. вырезанный из шара кусочек :)
  616. [21:53] <Zeux> [21:53] <paladinrus> вопрос:размер сфера зависит от расстояния до источника или как?
  617. [21:53] <Zeux> размер сферы зависит исключительно от источника
  618. [21:53] <Zeux> т.е. рисуется сфера
  619. [21:53] <Zeux> у которой центр - в позиции источника
  620. [21:53] <Zeux> и радиус - равный радиусу источника
  621. [21:53] <Zeux> если бы мы нарисовали ее просто в цвет в обычном рендерере
  622. [21:54] <Zeux> то она покрыла бы те пиксели, которые находятся внутри сферы
  623. [21:54] <Zeux> т.е. как раз то, что нам надо
  624. [21:54] <Zeux> надеюсь, ясно :)
  625. [21:54] <Zeux> итак, для каждого источника света рендерится такой примитив
  626. [21:54] <Zeux> в пискельном шейдере считается освещение (сейчас скажу, как)
  627. [21:55] <Zeux> и результат складывается с уже хранящимся в текстуре.
  628. [21:55] <Zeux> если карточка поддерживает блендинг для fp текстур, то используется просто аддитивный блендинг
  629. [21:55] <Zeux> если не поддерживает - 2 текстуры
  630. [21:55] <Zeux> и сложение в шейдере.
  631. [21:55] * eHomo (eHomo@217.118.118.ircnet-13316) has left #gamedev_lecture (+q)
  632. [21:55] <Zeux> т.е. отрендерили в одну, дальше отрендерили во вторую, складывая значение с цветом в первой
  633. [21:55] <Zeux> дальше отрендерили в первую, складывая значение с цветом из второй
  634. [21:55] <Zeux> etc.
  635. [21:56] <Zeux> итак
  636. [21:56] <Zeux> пиксельный шейдер.
  637. [21:56] <Zeux> хочу остановиться на вопросе различных материалов в deferred shading
  638. [21:56] <Zeux> если у нас есть объекты, для которых освещение считается по-разному
  639. [21:57] <Zeux> (скажем, phong на одном, blinn на другом, еще что-нибудь на третьем)
  640. [21:57] <Zeux> то в forward renderer ситуация решается очень просто - нужно поставить нужные шейдеры
  641. [21:57] <Zeux> и отрисовать.
  642. [21:57] <Zeux> поскольку в deferred shading мы считаем освещение для одного источника света разом
  643. [21:58] <Zeux> то для объектов с разными материалами в пиксельном шейдере придется как-то проверять, какой там материал
  644. [21:58] <Zeux> и делать соответствующие вычисления.
  645. [21:58] <Zeux> напомню, что информация о материале - есть
  646. [21:58] * eHomo (eHomo@ircnet-29622.tcompressor.com) has joined #gamedev_lecture
  647. [21:58] <Zeux> в одной из текстур G-buffer.
  648. [21:58] <Zeux> можно делать dynamic branching
  649. [21:58] <Zeux> (if material == 0 ... else if ... else ...)
  650. [21:58] <Zeux> но это дорого и грустно
  651. [21:58] <Zeux> в сталкере используется чудесный метод.
  652. [21:59] <Zeux> ставится ограничение на используемую BRDF
  653. [21:59] <Zeux> это должна быть ф-ия ровно от двух параметров
  654. [21:59] <Zeux> dot(N, L) и dot(N, H)
  655. [21:59] * laticq (laticq@ircnet-28841.net.ru) has left #gamedev_lecture (+q)
  656. [21:59] <Zeux> (зря я сказал про фонга и блинна, ну ладно)
  657. [22:00] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  658. [22:00] <Zeux> поэтому становится возможным следующий трик:
  659. [22:00] <Zeux> делается 3д текстура.
  660. [22:00] * Pik (1@ircnet-28158.p-t-k.net) has left #gamedev_lecture (+q)
  661. [22:00] <Zeux> по ширине и высоте - dot(N, L) и dot(N, H)
  662. [22:00] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  663. [22:00] * ChanServ sets mode: +o ShTiRLiC
  664. [22:00] <Zeux> по глубине - материал.
  665. [22:00] * laticq (laticq@10.24.174.ircnet-27187) has joined #gamedev_lecture
  666. [22:00] <Zeux> текстура размером 128х256х4
  667. [22:00] <Zeux> понятно, что никто не мешает делать больше материалов или меньше точность на dot(N, L) или dot(N, H)
  668. [22:00] <Zeux> или еще что-нибудь в таком стиле :)
  669. [22:01] <Zeux> формат текстуры - A8L8
  670. [22:01] <Zeux> в luminance хранится диффузная составляющая
  671. [22:01] <Zeux> в alpha - specular.
  672. [22:01] <Zeux> итак, в пиксельном шейдере рассчитываются dot(N, L) и dot(N, H)
  673. [22:01] <Zeux> делается семпл из 3д текстуры
  674. [22:02] <Zeux> полученные значения умножаются на коэффициент затененности
  675. [22:02] <Zeux> (если нет теней, он 1, если есть - я уже рассказывал, как он считается)
  676. [22:02] <Zeux> на attenuation
  677. [22:02] <Zeux> затухание квадратичное, формула - 1 - distance_to_light_source_squared / radius_of_light_source_squared
  678. [22:03] <Zeux> (очевидно, в случае направленных источников затухания нет)
  679. [22:03] <Zeux> еще на hemi, которое в G-buffer
  680. [22:03] <Zeux> спекуляр умножается еще и на gloss :)
  681. [22:03] <Zeux> который тоже в G-buffer
  682. [22:04] <Zeux> для солнца там все чуть хитрее, но в целом так же
  683. [22:04] <Zeux> еще на spot источниках
  684. [22:04] <Zeux> могут быть текстуры дополнительные
  685. [22:04] <Zeux> прожекторы.
  686. [22:04] <Zeux> либо просто текстура с белым кругом посредине
  687. [22:04] <Zeux> либо более хитрый круг (для фонаря)
  688. [22:04] <Zeux> либо совсем что-то необычное
  689. [22:04] <Zeux> если такое есть - rgb результата умножается еще и на значение в ней.
  690. [22:05] <Zeux> таким образом, считаются все компоненты освещенности
  691. [22:05] <Zeux> и результат записывается в ту самую текстуру
  692. [22:05] <Zeux> замечу
  693. [22:05] <Zeux> что поскольку используется пул для shadow map
  694. [22:05] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  695. [22:05] <Zeux> то есть вероятность того, что не для всех источников все SM влезут в пул разом.
  696. [22:06] <Zeux> в таком случае сначала рисуются в SM все источики, для которых места хватило
  697. [22:06] * Filippok is now known as Fil[insane]
  698. [22:06] <Zeux> потом делается заполнение текстуры с освещенностью
  699. [22:06] <Zeux> потом в SM рендерятся тени от источников, для которых места не хватило
  700. [22:06] <Zeux> опять делается заполнение текстуры
  701. [22:06] <Zeux> и т.д. :)
  702. [22:06] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  703. [22:06] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  704. [22:06] <Zeux> итак, резюмируя
  705. [22:07] <Zeux> после данного шага у нас есть:
  706. [22:07] <Zeux> 1. G-buffer с информацией о геометрии
  707. [22:07] <Zeux> 2. текстура с diffuse и specular компонентами освещенности
  708. [22:07] <Zeux> причем, отмечу, цвет в G-buffer и освещенность в текстуре - high dynamic range
  709. [22:07] <Zeux> (floating-point)
  710. [22:07] <Zeux> поступил вопрос
  711. [22:07] <Zeux> [22:07] <MiF> eaeea oai 4 aeaa oaeaeiaa?
  712. [22:08] <Zeux> [22:07] <MiF> какие там 4 вида шейдинга?
  713. [22:08] * ANDREYman (andreymand@ircnet-8005.spbnit.ru) has joined #gamedev_lecture
  714. [22:08] * SimpleProger (simpleprog@87.252.91.ircnet-13101) has joined #gamedev_lecture
  715. [22:08] <Zeux> не знаю. Знаю, что есть металлические поверхности, и обычные
  716. [22:08] <Zeux> какие еще 2 - не знаю
  717. [22:08] <Zeux> текстуру ту не нашел в ресурсах :)
  718. [22:08] <Zeux> наверное, плохо искал.
  719. [22:08] <Zeux> либо она генерится в рантайме
  720. [22:08] <Zeux> тоже вполне возможно.
  721. [22:09] * Doc-Allegator (Doc-Allega@ircnet-7189.keymachine.de) has left #gamedev_lecture
  722. [22:09] * Zeux sets mode: -m
  723. [22:09] <Zeux> вопросы по данной части?
  724. [22:09] * Zeux пошел ставить чайник
  725. [22:10] <paladinrus> со сферой немного недопонял
  726. [22:10] <paladinrus> для omni
  727. [22:10] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  728. [22:10] * ChanServ sets mode: +o ShTiRLiC
  729. [22:10] <paladinrus> то-естьона юзается только для того чтобы определеить считать-ли освещение в пикселях или нет?
  730. [22:10] <paladinrus> всмысле в тех которые внутри сферы оказались
  731. [22:10] <Zeux> ты рисуешь сферу
  732. [22:10] <Zeux> у тебя тем самым рисуются пиксели
  733. [22:10] <Zeux> которые внутри сферы
  734. [22:11] <Zeux> для этих пикселей выполняется тот самый пиксельный шейдер
  735. [22:11] <Zeux> который считает вклад в освещение от источника
  736. [22:11] <Zeux> можно рисовать квад для всех источников
  737. [22:11] <paladinrus> ну я это и имел ввиду :)
  738. [22:11] <Zeux> но так ты будешь обрабатывать больше пикселей
  739. [22:11] <Zeux> чем мог бы.
  740. [22:11] <Zeux> поэтому да - только для этого.
  741. [22:11] <paladinrus> логично предположить
  742. [22:12] <paladinrus> что диаметр сфера будет равен расстоянию на котором аттеньюация будет давать освещённость 0?
  743. [22:12] <paladinrus> *радиус
  744. [22:12] <Zeux> да
  745. [22:12] <Zeux> там формула
  746. [22:12] <WhiteWind> Zeux, ты знаком с модом Float32?
  747. [22:12] <Zeux> [22:02] <Zeux> затухание квадратичное, формула - 1 - distance_to_light_source_squared / radius_of_light_source_squared
  748. [22:12] <paladinrus> ок, спасибо
  749. [22:12] <Zeux> WhiteWind, знаю, что есть, но не смотрел
  750. [22:13] <Zeux> но
  751. [22:13] <Zeux> что там есть - знаю, наверное :)
  752. [22:13] <Zeux> дело в том, что все вычисления в сталкере производятся в half
  753. [22:13] <Zeux> думаю, что этот мод переводит все вычисления в float
  754. [22:13] <Zeux> формат текстур он почти наверняка не меняет.
  755. [22:13] <WhiteWind> Он сильно увеличивает производительность на динамическом освещении
  756. [22:13] <Zeux> ну, может быть там есть дополнительные оптимизации
  757. [22:14] <WhiteWind> И, как заявляет автор, улучшает качество картинки
  758. [22:14] <paladinrus> Zeux, если не затруднит пару слов об аномалиях, как мне кажется метод похож на heat faze или как там его, есть-ли различия?
  759. [22:14] <Zeux> улучшает - именно поэтому
  760. [22:14] <Zeux> paladinrus, различий в общем-то нет, я еще скажу об этом
  761. [22:14] <vshabanov> выходит, из-за 3Д текстуры честной глянцевости там не получается? pow( dot(N,H), <параметр, зависящий от меша> ) уже не проканает
  762. [22:14] <paladinrus> *haze
  763. [22:14] <paladinrus> ок
  764. [22:14] <Zeux> да, так нельзя
  765. [22:14] <Zeux> в принципе, тот параметр можно было бы запихнуть в G-buffer
  766. [22:15] <Zeux> но у ребят места и так не хватало :)
  767. [22:15] <Zeux> но
  768. [22:15] <Zeux> можно делать бОльшую 3д текстуру
  769. [22:15] <Zeux> скажем, ограничить степени - от 1 до 64
  770. [22:15] <Zeux> и сделать 64 материала.
  771. [22:15] <vshabanov> меня сразу удивило, что glossiness есть, а shininess нету
  772. [22:15] <Zeux> конечно, 3д текстура будет большая
  773. [22:15] <Zeux> но, увы.
  774. [22:15] * suicide (NOMAIL@ircnet-13542.median.ru) has left #gamedev_lecture (+q)
  775. [22:15] <Zeux> собственно, те материалы, которые есть - наверное и отличаются в основном степенью спекуляра :)
  776. [22:16] <vshabanov> а сильный ли прирост производительности дает DS
  777. [22:17] <Zeux> ответ на этот вопрос получить по сталкеру невозможно
  778. [22:17] <Zeux> потому что в нем DS и не DS рендеры отличаются по функциональности
  779. [22:17] <vshabanov> у него, как вижу, проблемы с прозрачностью, спекуляром. да и филрейт жрет по-ходу
  780. [22:18] <Zeux> вопрос применимости DS в принципе - зависит от
  781. [22:18] <Zeux> т.е. если хочется очень много источников
  782. [22:18] <Zeux> то DS будет более хорошим выбором
  783. [22:18] <Zeux> я еще скажу об одном забавном бонусе DS
  784. [22:18] <Zeux> который сделан в сталкере.
  785. [22:18] <Zeux> проблемы с прозрачностью на самом деле типичны для очень многих алгоритмов в CG :)
  786. [22:19] <Zeux> у него нет проблем с прозрачностью, есть только с полупрозрачностью
  787. [22:19] <Zeux> а полупрозрачные примитивы можно и не освещать ;)
  788. [22:19] <Zeux> т.е. DS - это не silver bullet
  789. [22:19] <Zeux> у него есть плюсы и минусы
  790. [22:19] <Zeux> и тех и тех - много
  791. [22:19] * VoidSeeker (vs@87.118.105.ircnet-13338) has left #gamedev_lecture (+q)
  792. [22:19] <Zeux> и что перевесит - зависит от приложения :)
  793. [22:20] <Zeux> еще вопросы по рассказанному куску, или я продолжаю?
  794. [22:20] <__Joe> в сталкере мало источников вроде
  795. [22:20] <Zeux> ну, как посмотреть
  796. [22:21] <Zeux> на комнатку в самом начале штук 10 что ли
  797. [22:21] <MiF> ага
  798. [22:21] <Zeux> Олесь сейчас скажу какие числа в статье своей пишет
  799. [22:21] <paladinrus> О_о
  800. [22:21] <cppg> [22:22:04] <Zeux> Олесь сейчас скажу - я подумал что __Joe это Олесь %)
  801. [22:22] <Zeux> пишет, 50 на кадр в индоре
  802. [22:22] <Zeux> 5 на пиксель
  803. [22:22] <Zeux> в аутдоре на пиксель кроме солнца - меньше 1 в среднем
  804. [22:22] <Zeux> плюс 2.5 overdraw rate
  805. [22:22] <Zeux> точнее, 1.5
  806. [22:23] <Zeux> если много overdraw - deferred shading может спасти.
  807. [22:23] <Zeux> и еще раз
  808. [22:23] <Zeux> про кол-во источников
  809. [22:23] <Zeux> те, кто выдержат до конца лекции
  810. [22:23] <Zeux> услышат о забавном бонусе DS :)
  811. [22:23] * Zeux sets mode: +m
  812. [22:24] <Zeux> Итак
  813. [22:24] * Innochenti (Innochenti@91.145.36.ircnet-20899) has joined #gamedev_lecture
  814. [22:24] <Zeux> теперь нам надо на основе G-buffer и текстуры с освещением (я ее буду называть L-buffer, а то долго писать)
  815. [22:24] <Zeux> получить собственно картинку.
  816. [22:25] <Zeux> для этог после заполнения L-buffer
  817. [22:25] <Zeux> происходит рендер полноэкранного квада в 2 текстуры
  818. [22:25] <Zeux> формата A8R8G8B8
  819. [22:25] <Zeux> в одну запишется LDR цвет, к которому применили tone mapping
  820. [22:25] <Zeux> точнее
  821. [22:25] <Zeux> результат применения tone mapping к HDR цвету
  822. [22:25] <Zeux> :)
  823. [22:26] <Zeux> в другой - HDR цвет для блума и рассчета общей освещенности сцены
  824. [22:26] * java661 (java661@ircnet-21318.novgorod.net) has left #gamedev_lecture (+q)
  825. [22:26] <Zeux> расчет происходит ак.
  826. [22:26] <Zeux> * так.
  827. [22:26] <Zeux> во-первых, делается т.н. hemispherical lighting
  828. [22:26] <Zeux> есть 2 текстуры с небом
  829. [22:26] <Zeux> точнее
  830. [22:26] <Zeux> с окружением
  831. [22:26] <Zeux> но в них в основном небо :)
  832. [22:26] <Zeux> текстуры - кубмапы, 32х32.
  833. [22:27] <Zeux> одна соответствует дневному окружению
  834. [22:27] <Zeux> другая - ночному
  835. [22:27] <Zeux> из каждой делается 2 выборки
  836. [22:27] <Zeux> первая - по нормали - показывает diffuse вклад окружения
  837. [22:27] <Zeux> вторая - по отраженному относительно нормали view вектору - показывает specular вклад окружения
  838. [22:28] <Zeux> затем считается вклад окружения (hdiffuse и hspecular) линейной интерполяцией между значениями для 2 текстур
  839. [22:28] <Zeux> коэффициент интерполяции - видимо, время суток :)
  840. [22:28] <Zeux> т.е. насколько текущее окружение соответствует дневному, насколько - ночному.
  841. [22:28] <Zeux> далее считается финальный цвет
  842. [22:28] <Zeux> вот так:
  843. [22:28] <Zeux> color = rgb * (lighting diffuse + hdiffuse) + (gloss * light specular) + hspecular;
  844. [22:28] <Zeux> rgb - это значение из G-buffer
  845. [22:29] <Zeux> lighting diffuse - .rgb из L-buffer
  846. [22:29] <Zeux> light specular - .a из L-buffer
  847. [22:29] <Zeux> hdiffuse, hspecular - только что посчитаны
  848. [22:29] <Zeux> gloss - из G-buffer
  849. [22:29] <Zeux> затем считается туман, просто distance-based
  850. [22:29] <Zeux> т.е. считается расстояние до камеры
  851. [22:30] <Zeux> и линейная интерполяция между color и fog_color (константа), коэффициент - fog factor
  852. [22:30] <Zeux> я кстати забыл сказать совсем.
  853. [22:30] <Zeux> а никто и не спросил!
  854. [22:30] <Zeux> сказать, почему позиция в G-buffer - view space
  855. [22:30] <Zeux> а не скажем world space
  856. [22:30] <Zeux> это очевидно? :)
  857. [22:31] * Innochenti (Innochenti@91.145.36.ircnet-20899) has left #gamedev_lecture (+q)
  858. [22:31] <Zeux> т.е. понятно
  859. [22:31] <Zeux> что ничего не мешало в принципе хранить и в world space.
  860. [22:32] <Zeux> причина - очень простая на самом деле
  861. [22:32] <Zeux> используется float16 (half) формат для позиции
  862. [22:32] <Zeux> у него - сильно ограничен диапазон
  863. [22:32] <Zeux> максимальное значение - 65504.0 вроде
  864. [22:32] <Zeux> где-то так
  865. [22:32] <Zeux> ну и точность непонятно, какая
  866. [22:32] <Zeux> т.е. точнее
  867. [22:32] <Zeux> чем дальше от 0
  868. [22:32] <Zeux> тем меньше точность
  869. [22:32] <Zeux> view space удобен тем
  870. [22:33] <Zeux> что чем ближе к камере позиция - тем меньше она
  871. [22:33] <Zeux> и тем больше для нее точность соответственно
  872. [22:33] <Zeux> ну и тем
  873. [22:33] <Zeux> что вне зависимости от положения камеры
  874. [22:33] <Zeux> размеров мира
  875. [22:33] <Zeux> и прочих детаалей
  876. [22:33] <Zeux> * деталей
  877. [22:33] <Zeux> значения позиции там будут в нормальном диапазоне
  878. [22:33] <Zeux> т.е. за 65 тысяч они могу вылезти только если у вас очень большой view distance
  879. [22:33] <Zeux> что вряд ли.
  880. [22:34] <Zeux> ну так вот, продолжим
  881. [22:34] <Zeux> после получения цвета
  882. [22:34] <Zeux> для него делается tone mapping
  883. [22:34] * cppg (cppg@85.249.94.ircnet-3873) has left #gamedev_lecture (+q)
  884. [22:34] <Zeux> tone mapping - это процесс получения LDR цвета из HDR
  885. [22:34] <Zeux> есть много разных формул
  886. [22:34] <Zeux> операторов
  887. [22:34] <Zeux> в статье написано, что сначала пробовали экспоненциальную зависимость от освещенности
  888. [22:34] <Zeux> как в DX SDK demo
  889. [22:34] <Zeux> а потом забили и стали делать линейную
  890. [22:35] <Zeux> из-за особенностей арта.
  891. [22:35] <Zeux> формула такая:
  892. [22:35] <Zeux> result = color * (coeff1 / (luminance * coeff2 + coeff3))
  893. [22:35] <Zeux> luminance - среднее значение яркости сцены с предыдущего кадра
  894. [22:35] <Zeux> точнее
  895. [22:35] <Zeux> не с предыдущего, а интерполированное
  896. [22:35] <Zeux> неважно
  897. [22:36] <Zeux> коэффициенты подбираются, в сталкере - 0.7, 0.7 и 0.3
  898. [22:36] <Zeux> вроде бы первый 0.7 - middle gray value, 0.7 и 0.3 - ремаппинг из [0,1] в [0.3, 1]
  899. [22:37] <Zeux> этот самый коэффициент при color
  900. [22:37] <Zeux> (coeff1 / (luminance * coeff2 + coeff3))
  901. [22:37] <Zeux> вот этот
  902. [22:37] <Zeux> хранится в R32F текстуре 1х1
  903. [22:37] <Zeux> как она заполняется, я скажу.
  904. [22:37] <Zeux> ну вот, в результате выводится в PS два цвета
  905. [22:37] * Bacek[away] (Coder2021@192.168.113.ircnet-10919) has left #gamedev_lecture (+q)
  906. [22:37] <Zeux> один - result
  907. [22:37] <Zeux> это фактически цвет, который пойдет в back buffer
  908. [22:38] <Zeux> если не учитывать bloom, motion blur и distortion
  909. [22:38] * java845 (java845@ircnet-21318.novgorod.net) has joined #gamedev_lecture
  910. [22:38] <Zeux> второй  считается как color / 8
  911. [22:38] <Zeux> тем самым мы отбрасываем младшие биты цвета
  912. [22:38] <Zeux> уменьшая точность
  913. [22:38] <Zeux> но позвляем динамический диапазон яркости в 8 раз больше, чем в обычном цвете в RGBA8
  914. [22:39] <Zeux> точность нам не так важна, т.к. этот цвет используется для:
  915. [22:39] * cppg (cppg@85.249.94.ircnet-3873) has joined #gamedev_lecture
  916. [22:39] * ChanServ sets mode: +o cppg
  917. [22:39] <Zeux> 1. блума (а там все равно отбрасываются маленькие значения, и все размывается)
  918. [22:39] <Zeux> 2. подсчета средней освещенности
  919. [22:39] * java845 (java845@ircnet-21318.novgorod.net) has left #gamedev_lecture (+q)
  920. [22:39] <Zeux> можно было естественно делать просто A16B16G16R16F текстуру
  921. [22:39] <Zeux> но - сделано так.
  922. [22:39] * _ShaDer_ (_ShaMan_@217.118.117.ircnet-12420) has left #gamedev_lecture (+q)
  923. [22:39] * java036 (java036@ircnet-21318.novgorod.net) has joined #gamedev_lecture
  924. [22:40] <Zeux> итак, затем наконец-то
  925. [22:40] * eHomo (eHomo@ircnet-29622.tcompressor.com) has left #gamedev_lecture (+q)
  926. [22:40] <Zeux> в текстуру с цветом
  927. [22:40] <Zeux> (там, где результат tone mapping)
  928. [22:40] <Zeux> рендерятся полупрозрачные объекты.
  929. [22:40] <Zeux> это частицы
  930. [22:41] <Zeux> это огонь (огонь кстати - анимированная текстура для языка пламени)
  931. [22:41] * Bacek (Coder2021@192.168.113.ircnet-13398) has joined #gamedev_lecture
  932. [22:41] <Zeux> это стекла
  933. [22:41] <Zeux> и т.д.
  934. [22:41] <Zeux> замечу
  935. [22:41] <Zeux> что поскольку они рисуются только в эту текстуру
  936. [22:41] <Zeux> то их вклад не учитывается при подсчете освещенности и при bloom
  937. [22:41] <Zeux> можно было их рисовать и в другую, деля цвет на 8 при выводе так же.
  938. [22:42] <Zeux> затем, производится блум и одновременно считается освещенность
  939. [22:42] <Zeux> сначала текстура с 8x dynamic range
  940. [22:42] <Zeux> даунсемплится в текстуру 256х256
  941. [22:43] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  942. [22:43] <Zeux> в дополнение к фильтрации используется усреднение 2х2
  943. [22:43] <Zeux> затем
  944. [22:43] <Zeux> эта текстура в еще 3 шага
  945. [22:43] <Zeux> даунсемплится до 1х1
  946. [22:43] <Zeux> 256x256 -> 64x64 -> 8x8 -> 1x1
  947. [22:44] <Zeux> когда у них была экспоненциальная зависимость от яркости
  948. [22:44] <Zeux> то они брали логарифм на первой стадии видимо
  949. [22:44] <Zeux> сейчас - не берут :)
  950. [22:44] <Zeux> да, на первой же стадии
  951. [22:45] <Zeux> из RGB получается luminance
  952. [22:45] * CEMEH (Miranda@ircnet-19728.microsoft.com) has joined #gamedev_lecture
  953. [22:45] * ChanServ sets mode: +o CEMEH
  954. [22:45] <Zeux> вторая стадия - фактически, обычное усреднение
  955. [22:45] <Zeux> третья - усреднение и одновременно подсчет финальной luminance
  956. [22:46] <Zeux> сначала считается значение на текущем кадре (по формуле, написанной выше - coeff1 / (luminance * coeff2 + coeff3))
  957. [22:46] <Zeux> потом из текстуры 1x1 с прошлого кадра читается luminance на нем
  958. [22:46] <Zeux> и линейно интерполируется между ними
  959. [22:46] <Zeux> это адаптация.
  960. [22:46] <Zeux> замечу
  961. [22:46] <Zeux> что здесь вторая найденная мной опечатка
  962. [22:47] <Zeux> они не клампят значение luminance
  963. [22:47] <Zeux> т.е. они хотят его заклампить
  964. [22:47] <Zeux> от 1/8 до 2
  965. [22:47] <Zeux> но не клампят.
  966. [22:47] <Zeux> после этого у нас есть текстура 1х1
  967. [22:48] <Zeux> в которой значение для tone mapping текущего кадра (которое будет использоваться на следующем :))
  968. [22:48] <Zeux> и мы почти готовы нарисовать наконец картинку в back buffer!
  969. [22:48] <Zeux> последняя стадия перед финальной - если видны объекты
  970. [22:48] <Zeux> для которых нужен distortion
  971. [22:48] <Zeux> то они рисуются в отдельную текстуру.
  972. [22:48] <Zeux> это аномалии
  973. [22:48] <Zeux> это огонь
  974. [22:49] <Zeux> это артефакты
  975. [22:49] <Zeux> в текстуру рисуются смещения (2 числа) текстурной координаты
  976. [22:49] <Zeux> смещения берутся из текстур
  977. [22:49] <Zeux> есть набор таких текстур в ресурсах
  978. [22:49] <Zeux> для разных объектов
  979. [22:49] <Zeux> для огня текстура - анимированная
  980. [22:49] <Zeux> ну и не только для него, наверное :)
  981. [22:50] <Zeux> получается отдельная ARGB8 текстура
  982. [22:50] <Zeux> и наконец
  983. [22:50] <Zeux> рисуется квад в backbuffer.
  984. [22:50] <Zeux> простой случай - в пиксельном шейдере делается выборка из текстуры с результатами tone mapping
  985. [22:50] <Zeux> ых, забыл
  986. [22:50] <Zeux> сорри
  987. [22:50] <Zeux> до этого есть еще размытие bloom текстуры
  988. [22:51] <Zeux> но оно самое обычное - 2-х проходный Гаусс
  989. [22:51] <Zeux> вертикальный и горизонтальный
  990. [22:51] <Zeux> каждый проход - усреднение 15 семплов
  991. [22:51] <Zeux> 7 влево, 7 вправо.
  992. [22:51] <Zeux> получается 15х15 блур
  993. [22:51] <Zeux> так вот
  994. [22:51] * java036 (java036@ircnet-21318.novgorod.net) has left #gamedev_lecture (+q)
  995. [22:51] <Zeux> простой случай
  996. [22:51] <Zeux> выборка из текстуры с результами tone mapping
  997. [22:51] <Zeux> смешивание ее с результатом выборки из bloom текстуры
  998. [22:52] <Zeux> текстурная координата либо тупо [0,1] из вершины
  999. [22:52] <Zeux> либо смещенная на значение в текстуре с distortion
  1000. [22:52] <Zeux> случай сложнее - есть motion blur
  1001. [22:52] <Zeux> в этом случае есть 2 матрицы
  1002. [22:52] <Zeux> с прошлого кадра и с этого
  1003. [22:53] <Zeux> ими трансформируется позиция из G-buffer
  1004. [22:53] <Zeux> между ними берется разность (и обрезается константами)
  1005. [22:53] <Zeux> это типа скорость.
  1006. [22:53] <Zeux> дальше кроме 1 семпла из текстуры с цветом
  1007. [22:53] <Zeux> делаются еще 11.
  1008. [22:53] * __Joe (bob.vilson@ircnet-16479.dp.ua) has left #gamedev_lecture (+q)
  1009. [22:53] <Zeux> в направлении этой скорости
  1010. [22:54] <Zeux> т.е. texcoord + velocity * coeff * 1, texcoord + velocity * coeff * 2, ...
  1011. [22:54] <Zeux> ну и усредняются
  1012. [22:54] * as (as@87.252.91.ircnet-12619) has joined #gamedev_lecture
  1013. [22:54] <Zeux> и наконец
  1014. [22:54] <Zeux> у deferred shading есть еще одна проблема.
  1015. [22:54] * zooLuus426 (Miranda@91.145.108.ircnet-23130) has joined #gamedev_lecture
  1016. [22:54] <Zeux> о которой я не сказал
  1017. [22:55] <Zeux> с ним очень плохо совместим хардварный антиальясинг
  1018. [22:55] <Zeux> я бы сказал, вообще не совместим - если DX9, по кр. мере
  1019. [22:55] <Zeux> это плохо.
  1020. [22:55] * _VEL- (AntVelm@193.30.54.ircnet-3860) has left #gamedev_lecture (+q)
  1021. [22:55] <Zeux> понятно, что финальное изображение в back buffer можно отрисовать с АА - но это не даст нужного эффекта, очевидно
  1022. [22:55] <cppg> FP16?
  1023. [22:55] * skom[mobil] (~skommobil@81.18.36.ircnet-3475) has left #gamedev_lecture (+q)
  1024. [22:55] * zooLuus (Miranda@212.58.50.ircnet-22434) has left #gamedev_lecture (+q)
  1025. [22:55] <Zeux> т.к. нужно - размыть края полигонов
  1026. [22:56] <Zeux> cppg, MRT
  1027. [22:56] * binstream (binstream@vpn-pool-82-78.tomtel.ru) has left #gamedev_lecture (+q)
  1028. [22:56] <Zeux> вопрос по моушен блюру
  1029. [22:56] <Zeux> [22:55] <paladinrus> я так понимаю вектор скорости один только для камеры?
  1030. [22:56] <Zeux> [22:55] <paladinrus> то-есть движение других объектов на моушн блюр не влияет?
  1031. [22:56] <Zeux> да.
  1032. [22:56] <Zeux> это не per object
  1033. [22:57] <Zeux> так вот
  1034. [22:57] <Zeux> проблему очевидно решать можно
  1035. [22:57] <Zeux> например, сделать supersampling.
  1036. [22:57] <Zeux> было 30 метров на G-buffer
  1037. [22:57] <Zeux> стало 60 или 120.
  1038. [22:57] <Zeux> не очень практично, зато работает.
  1039. [22:57] <Zeux> в Сталкере пошли другим путем
  1040. [22:58] <Zeux> у них есть не совсем АА
  1041. [22:58] <Zeux> но алгоритм, размывающий границы полигонов
  1042. [22:58] <Zeux> т.е. эффект нужный в общем-то достигается
  1043. [22:58] <Zeux> замечу - оно по умолчанию выключено
  1044. [22:58] <Zeux> но можно включить, r2_aa on в консоли
  1045. [22:58] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1046. [22:58] * ChanServ sets mode: +o ShTiRLiC
  1047. [22:58] <Zeux> делается так.
  1048. [22:59] <Zeux> для нормалей и для глубин пикселей получается значение, характеризующее
  1049. [22:59] <Zeux> насколько в данном пикселе разные глубины/нормали у соседей
  1050. [22:59] <Zeux> считается таким образом:
  1051. [22:59] <Zeux> для нормалей
  1052. [22:59] <Zeux> делаются семплы соседей слева/справа/сверху/снизу
  1053. [22:59] <Zeux> (соседних пикселей)
  1054. [23:00] <Zeux> считается 4 скалярных произведения нашей нормали и нормалей соседей
  1055. [23:00] <Zeux> дальше считается, сколько из этих 4-х достаточно отклонены от нашей
  1056. [23:00] * as (as@87.252.91.ircnet-12619) has left #gamedev_lecture (+q)
  1057. [23:00] <Zeux> (это threshold на dot, если dot > threshold - считается, что не отклонены
  1058. [23:00] <Zeux> если <= - отклонены
  1059. [23:00] <Zeux> threshold = 0.8 по умолчанию)
  1060. [23:01] * Dgut (.@ircnet-29658.tcompressor.com) has left #gamedev_lecture (+q)
  1061. [23:01] * Dgut (.@80.255.30.ircnet-3762) has joined #gamedev_lecture
  1062. [23:01] <Zeux> полученное число умножается на коэффициент (который 1/4 :))
  1063. [23:01] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1064. [23:01] <Zeux> получается число от 0 до 1, 0 - у всех соседей сильно другие нормали, 1 - у всех похожие
  1065. [23:01] <Zeux> для глубин то же самое
  1066. [23:02] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1067. [23:02] * ChanServ sets mode: +o ShTiRLiC
  1068. [23:02] <Zeux> только анализируются 8 пикселей
  1069. [23:02] <Zeux> (еще соседи по диагоналям)
  1070. [23:02] <Zeux> анализируются только пары напротив
  1071. [23:02] <Zeux> (т.е. считается, насколько отличается сумма глубин в пикселях, симметричных относительно нашего
  1072. [23:02] <Zeux> от удвоенной глубины в нашем)
  1073. [23:02] <Zeux> ну и вместо dot используется разность.
  1074. [23:02] * laticq (laticq@10.24.174.ircnet-27187) has left #gamedev_lecture (+q)
  1075. [23:03] <Zeux> дальше считается коэффициент для AA, это (1 - normal_discontinuity_factor * depth_discontinuity_factor) * aa_coeff
  1076. [23:03] <Zeux> факторы - это только что посчитанные числа
  1077. [23:03] <Zeux> и делается смешивание цвета в данном пикселе
  1078. [23:03] <Zeux> с средним арифметическим цветов в 4-х соседях
  1079. [23:03] <Zeux> с коэфициентом, посчитанным по указанной формуле.ю
  1080. [23:04] <Zeux> скорость от AA у меня практически не просаживается
  1081. [23:04] <Zeux> "у меня" - это на 8800 GTX.
  1082. [23:04] <Zeux> уф.
  1083. [23:04] <Zeux> наконец, поверх всего этого безобразие рисуется GUI
  1084. [23:04] <Zeux> * безобразия
  1085. [23:04] * MiF (mifmyth@ircnet-16757.qwerty.ru) has left #gamedev_lecture (+q)
  1086. [23:05] <Zeux> GUI рисуется по дипу за контрол, текстура - одна большая на все контролы
  1087. [23:05] <Zeux> VB один, впрочем
  1088. [23:05] <Zeux> ну и если есть бинокль
  1089. [23:05] <Zeux> то рисуется текстура бинокля.
  1090. [23:05] <Zeux> с блендом
  1091. [23:05] <Zeux> шрифты рисуются как обычно, ничего особенного.
  1092. [23:05] <Zeux> Я рассказал все, кроме обещанного клевого бонуса от DS.
  1093. [23:05] * Zeux sets mode: -m
  1094. [23:06] <Zeux> вопросы по рассказанному?
  1095. [23:06] <WhiteWind> Почему лекция так поздно? :)
  1096. [23:06] * Dgut (.@80.255.30.ircnet-3762) has left #gamedev_lecture (+q)
  1097. [23:06] <ShTiRLiC> Лекцыя с 20 часов
  1098. [23:06] <_ShaMan_> 0
  1099. [23:06] <ShTiRLiC> Как раз пока все дома
  1100. [23:06] <Zeux> лекция с 8 идет, да
  1101. [23:07] <WhiteWind> У нас уже 4 часа ночи :)
  1102. [23:07] <ShTiRLiC> Тока я один пропинал её =((
  1103. [23:07] <Zeux> ну, сорри :)
  1104. [23:07] <Zeux> еще минут 20 и закончим.
  1105. [23:07] <ShTiRLiC> Ну блин, земля сцуко круглая и разная
  1106. [23:07] <_ShaMan_> ну было же написано, что по московскому времени
  1107. [23:07] <Zeux> да, под все часовые пояса не подстроишься
  1108. [23:07] <Zeux> еще вопросы? %)
  1109. [23:07] <ShTiRLiC> =)))
  1110. [23:07] <_ShaMan_> бонус давай
  1111. [23:07] <Joric> насчет подстраивания есть =)
  1112. [23:07] <vshabanov> запоздавший вопрос по ландшафту: а нафиг 4 текстуры в шейдере мешать, одну сгенерить никак
  1113. [23:07] <paladinrus> у мя 3 ночи я ж не возбухаю )
  1114. [23:07] * bga (Miranda@ircnet-5032.SkyLink.RU) has joined #gamedev_lecture
  1115. [23:07] <ShTiRLiC> Что такое g-buffer?
  1116. [23:07] <Zeux> vshabanov, память
  1117. [23:07] <_ShaMan_> ShTiRLiC в гугл c
  1118. [23:08] <Zeux> ShTiRLiC, geometry buffer, читай начало лекции
  1119. [23:08] <bga> Всем здаров!
  1120. [23:08] <ShTiRLiC> Чорт
  1121. [23:08] <ShTiRLiC> Злые вы
  1122. [23:08] <paladinrus> Привет
  1123. [23:08] <Joric> в каком порядке фичи включаются на low-medium-high quality?
  1124. [23:08] <ShTiRLiC> Zeux, а логи когда будут?
  1125. [23:08] <ShTiRLiC> Я почти час пропустил
  1126. [23:08] <Zeux> логи через час где-то
  1127. [23:08] <Zeux> vshabanov, т.е. сплаттинг тем и ценен
  1128. [23:08] <ShTiRLiC> Не, я ваще все пропустил из-за жутких кошмариков с инетом
  1129. [23:08] <Zeux> что экономит память.
  1130. [23:08] * zooLuus426 (Miranda@91.145.108.ircnet-23130) has left #gamedev_lecture (+q)
  1131. [23:08] <Zeux> я поясню, я момент этот пропустил
  1132. [23:08] <vshabanov> так одна текстура -- это меньше памяти
  1133. [23:08] <Zeux> т.к. думал, что ясно
  1134. [23:08] <Zeux> те текстуры слоев
  1135. [23:08] <Zeux> они очень сильно тайлятся.
  1136. [23:09] <Zeux> т.е. детализация цвета и нормалей получается хорошая
  1137. [23:09] <Zeux> маленькая детализация - только на маску
  1138. [23:09] <bga> Всех с днем Победы! :)
  1139. [23:09] <Zeux> но там пофиг
  1140. [23:09] <vshabanov> теперь понял
  1141. [23:09] <Zeux> т.е. с такой же детализацией без сплаттинга было бы гораздо больше памяти :)
  1142. [23:10] <vshabanov> ну да. я что-то про тайлинг не подумал
  1143. [23:10] <cppg> bga тебя тоже, чувак
  1144. [23:10] <Zeux> Joric
  1145. [23:10] <Zeux> не знаю.
  1146. [23:10] <Zeux> %)
  1147. [23:10] <ShTiRLiC> Лектор допускает пробелы!
  1148. [23:10] <Zeux> зато честно в них сознается
  1149. [23:11] <ShTiRLiC> +1
  1150. [23:11] <WhiteWind> Я так понял, что там вообще нет Dynamic Branching?
  1151. [23:11] <Zeux> не знаю, надо смотреть. Меня, как я уже сказал, интересовал вопрос high quality исключительно
  1152. [23:11] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1153. [23:11] <Zeux> WhiteWind, вроде как совсем нет, если и есть - то по мелочи.
  1154. [23:11] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1155. [23:12] <vshabanov> а на 8800 бранчинг по прежнему дикий тормоз?
  1156. [23:12] <Zeux> не могу сказать, не тестировал.
  1157. [23:12] <cppg> Первый интересный вопрос whenever
  1158. [23:13] <Zeux> думаю, что нет.
  1159. [23:13] <Zeux> однако, сталкер не делался с расчетом на 8800 :)
  1160. [23:13] <Zeux> рендеру уже года 2 думаю.
  1161. [23:13] <Zeux> а то и 3
  1162. [23:13] <WhiteWind> А было бы быстрее, если бы источники света рендерились не по одному, а за один проход с циклом в шейдере?
  1163. [23:14] <cppg> Судя по году выпуска, мог бы, имхо
  1164. [23:14] <Zeux> если поддерживается fp16 blend - думаю, не было бы
  1165. [23:14] <Zeux> если не поддерживается - вполне могло.
  1166. [23:14] <cppg> 3 года назад топовой картой была 6800?
  1167. [23:14] <Zeux> я откуда знаю :)
  1168. [23:15] <Zeux> не понимаю вопроса т.е.
  1169. [23:15] <cppg> Историю не помнишь ) ну да неважно %)
  1170. [23:15] <WhiteWind> Где обещаный бонус?
  1171. [23:16] <Zeux> вопросы еще есть?
  1172. [23:16] <Zeux> ну впрочем ладно, можно в самом конце
  1173. [23:16] * Zeux sets mode: +m
  1174. [23:16] <Zeux> Во-первых, то, что я забыл сказать (интересная вещь)
  1175. [23:17] <Zeux> при расчетах, для которых нужна та самая текстура 1х1
  1176. [23:17] <Zeux> с tone mapping коэффициентом
  1177. [23:17] <Zeux> если поддерживается VTF
  1178. [23:17] <Zeux> она читается в вершинном шейдере
  1179. [23:17] <Zeux> и передается в пиксельный значение.
  1180. [23:17] <Zeux> чтобы избавиться от лишней выборки
  1181. [23:17] * Darth is now known as Darth|away
  1182. [23:17] <Zeux> Во-вторых, то, что я забыл сказать.
  1183. [23:17] <Zeux> небо и облака.
  1184. [23:17] * ChanServ sets mode: +o ShTiRLiC
  1185. [23:18] <Zeux> небо и облака рендерятся отдельно (не в G-buffer), сразу в те 2 текстуры
  1186. [23:18] <Zeux> с результатом tone mapping и с HDR 8x
  1187. [23:18] <Zeux> небо - 2 текстуры (кубмапы, дневное-ночное), интерполяция между ними
  1188. [23:18] <Zeux> и tone mapping
  1189. [23:18] <Zeux> облака - 2 текстуры облаков, семпл по разным координатам
  1190. [23:18] <Zeux> (они скроллятся)
  1191. [23:19] * cppg (cppg@85.249.94.ircnet-3873) has left #gamedev_lecture (+q)
  1192. [23:19] <Zeux> умножение на константный цвет
  1193. [23:19] <Zeux> и tone mapping
  1194. [23:19] <Zeux> и наконец, бонус.
  1195. [23:19] * yevgen (chatzilla@219.248.157.ircnet-21108) has joined #gamedev_lecture
  1196. [23:19] <Zeux> Про бонус уже было сказано - это много источников света за меньшую цену, чем могло бы быть.
  1197. [23:19] * WhiteWind is now known as WhiteWind|
  1198. [23:19] <Zeux> в сталкере есть экспериментальный режим
  1199. [23:19] <Zeux> который это использует.
  1200. [23:19] <Zeux> Это эмуляция GI (global illumination)
  1201. [23:20] <Zeux> я оптику совсем не знаю, но тем не менее скажу
  1202. [23:20] <Zeux> в общем-то, суть global illumination такая - есть источник
  1203. [23:20] <Zeux> лучи, идущие от него - первичные лучи
  1204. [23:20] <Zeux> когда они падают на объект
  1205. [23:20] <Zeux> то то место, куда они упали - освещается
  1206. [23:20] <Zeux> это то, что мы привыкли рисовать
  1207. [23:20] <Zeux> dot(N, L) и т.д.
  1208. [23:21] <Zeux> но этот луч света отражается от поверхности
  1209. [23:21] <Zeux> рассеивается
  1210. [23:21] <Zeux> и получается много других лучей.
  1211. [23:21] <Zeux> они слабее, но они есть
  1212. [23:21] <Zeux> это вторичные лучи
  1213. [23:21] <Zeux> они падают еще на какие-то объекты, и т.д.
  1214. [23:21] <Zeux> так вот, в сталкере сделана попытка проэмулировать этот процесс в реалтайме.
  1215. [23:21] <Zeux> для каждого источника света
  1216. [23:22] <Zeux> на CPU пускается набор лучей в случайных направлениях
  1217. [23:22] <Zeux> для каждого ищется пересечение с уровнем
  1218. [23:22] <Zeux> туда ставится специальный источник
  1219. [23:22] <Zeux> во-первых, источник не совсем точечный
  1220. [23:23] <Zeux> но и не совсем направленный - что-то вроде спотлайта в общем
  1221. [23:23] <Zeux> во-вторых, у него меньше интенсивность
  1222. [23:23] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1223. [23:23] <Zeux> дальше процесс можно повторить уже для новых источников
  1224. [23:23] <Zeux> получив еще набор
  1225. [23:23] <Zeux> и т.д.
  1226. [23:23] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1227. [23:23] * ChanServ sets mode: +o ShTiRLiC
  1228. [23:23] <Zeux> дальше, когда закончилось кол-во итераций (фиксированное)
  1229. [23:23] <Zeux> то из этих дополнительно сгенеренных источников мы выбираем сколько-то с макс. интенсивностью
  1230. [23:24] <Zeux> остальные удаляем
  1231. [23:24] <Zeux> и освещаяем сцену новым набором.
  1232. [23:24] <Zeux> не забываем для сгенеренных отключить тени
  1233. [23:24] <Zeux> ну и еще у тех источников нет спекуляра
  1234. [23:25] <Zeux> и они не зависят от материала
  1235. [23:25] * Shai-Hulud (Shai-Hulud@83.167.73.ircnet-22380) has joined #gamedev_lecture
  1236. [23:25] <ShTiRLiC> Сколько при этом получается FPS?
  1237. [23:25] <Zeux> т.е. при их отрисовке не производится выборка из той 3д текстуры
  1238. [23:25] <Zeux> это оптимизация.
  1239. [23:25] <Zeux> Падение FPS у меня - от 70 до 16 в индоре.
  1240. [23:25] <Zeux> Это не 30, но уже близко.
  1241. [23:25] <Zeux> и это на максимальной детализации, в достаточно высоком разрешении :)
  1242. [23:25] <ShTiRLiC> Просто интересно, может, удалось бы и спекулары и тени сделать от вторичных
  1243. [23:26] <ShTiRLiC> Видимо, не в этом году
  1244. [23:26] <Zeux> тени - мешают.
  1245. [23:26] <Zeux> сначала там были тени
  1246. [23:26] <Zeux> их отрубили и из эстетических соображений тоже
  1247. [23:26] <ShTiRLiC> Слишком мягкие?
  1248. [23:26] <ShTiRLiC> %)
  1249. [23:26] <Zeux> нет, они там просто есть.
  1250. [23:26] <Zeux> это мешает
  1251. [23:27] <Zeux> сбивает с толку :)
  1252. [23:27] <Zeux> замечу
  1253. [23:27] <Zeux> что в финале это отключено
  1254. [23:27] <Zeux> под это тупо не настроен арт
  1255. [23:27] <Zeux> все получается пересвеченное
  1256. [23:27] <Zeux> по очевидным причинам.
  1257. [23:27] <Zeux> включить можно в консоли, r2_gi on
  1258. [23:27] <Zeux> в аутдоре эффект не виден, тоже очевидно почему
  1259. [23:28] <Zeux> и последнее
  1260. [23:28] <Zeux> я забыл картинку про тени показать.
  1261. [23:28] <Zeux> с убранной фильтрацией почти полностью (только хардварный PCF остался)
  1262. [23:28] * bga (Miranda@ircnet-5032.SkyLink.RU) has left #gamedev_lecture (+q)
  1263. [23:28] <Zeux> http://zeux.info/pub/temp/stalker_shadows.jpg
  1264. [23:29] <Zeux> теперь вроде все
  1265. [23:29] <Zeux> Вопросы? :)
  1266. [23:29] * Zeux sets mode: -m
  1267. [23:29] <ShTiRLiC> Гм
  1268. [23:29] <ShTiRLiC> А што на этой картинке такого?
  1269. [23:29] <_ShaMan_> бугак
  1270. [23:29] <_ShaMan_> блин
  1271. [23:29] <ShTiRLiC> Заметно
  1272. [23:30] <NULL_PTR> Zeux зачем открыта консоль?
  1273. [23:30] <Zeux> NULL_PTR, принтскрином не работал скриншот
  1274. [23:30] <NULL_PTR> fraps!
  1275. [23:30] <Zeux> открыта - чтобы скриншот снять
  1276. [23:30] <ShTiRLiC> А забиндить?
  1277. [23:30] <Zeux> поздно!
  1278. [23:30] <ShTiRLiC> И ножать?
  1279. [23:30] <Zeux> блин
  1280. [23:30] <ShTiRLiC> Эх-эх
  1281. [23:30] <Zeux> поменяйте шейдеры
  1282. [23:30] <Zeux> забиндите
  1283. [23:30] <Zeux> и нажмите :)
  1284. [23:30] <Zeux> тут просто была информация про попиксельные тени, я ее проверял.
  1285. [23:30] <paladinrus> у тя сталкер английский??
  1286. [23:30] <paladinrus> F12
  1287. [23:30] <paladinrus> скрины делать вроде
  1288. [23:30] <ShTiRLiC> F12 по дефолту везде, да
  1289. [23:31] <ShTiRLiC> А на самом деле там што?
  1290. [23:31] <Zeux> то, что на экране, очевидно
  1291. [23:31] <paladinrus> F12
  1292. [23:31] <Zeux> попиксельные - это в смысле качества
  1293. [23:31] <paladinrus> а
  1294. [23:31] <paladinrus> попутал =)
  1295. [23:31] <ShTiRLiC> А на экране што?
  1296. [23:31] <ShTiRLiC> Тени как тени
  1297. [23:31] <ShTiRLiC> Неплохие такие
  1298. [23:31] <_ShaMan_> Зеух показал тени от деревьев без фильтрации
  1299. [23:31] <Zeux> так
  1300. [23:32] <_ShaMan_> хардварные т.е.
  1301. [23:32] <Zeux> сегодня будут нормальные вопросы? %)
  1302. [23:32] <ShTiRLiC> Будут логи - будут вопросы!
  1303. [23:32] <_ShaMan_> =D
  1304. [23:32] <Zeux> логи будут через пол часа где-то
  1305. [23:32] <kas> я вот логи ничитал, но спрошу
  1306. [23:32] <kas> там гдето больше 3-4 лампочек юзается?
  1307. [23:32] <kas> на модельках в игре
  1308. [23:32] <Zeux> 5 лампочек на пиксель в среднем в индоре
  1309. [23:33] <WhiteWind|> Мой голова полпятого утра не мочь думать и спрашивать :(
  1310. [23:33] <paladinrus> %)
  1311. [23:33] <[ENRIX]> Неплохая лекция.. вроде расзжовано все
  1312. [23:33] <vmr>  неплохо, спасибо Zeux
  1313. [23:33] <paladinrus> хорошая лекция была
  1314. [23:34] <_ShaMan_> kas ждём GI в TheEngine %)
  1315. [23:34] <vmr> жалко что Float32 мод не смотрел (
  1316. [23:34] <paladinrus> да, Zeux, спасибо
  1317. [23:34] <kas> нафиг оно там
  1318. [23:34] <vshabanov> сколько времени ушло на то, чтобы так разобраться в рендере сталкера?
  1319. [23:34] <Zeux> мало
  1320. [23:34] <paladinrus> надеюсь я не сильно тупые вопросы задавал )
  1321. [23:34] * denton (kianovev@62.33.179.ircnet-3074) has left #gamedev_lecture (+q)
  1322. [23:34] <[ENRIX]> GI это опасная штука...лучше её не трогать пока не будет хардварной обработки
  1323. [23:34] <Zeux> 4 полных дня наверное
  1324. [23:35] <_ShaMan_> paladinrus норм
  1325. [23:35] <Zeux> с обливионом было дольше :)
  1326. [23:35] <Zeux> хардварной не будет
  1327. [23:35] <Zeux> ну т.е. не скоро
  1328. [23:35] <Zeux> судя по текущим тенденциям.
  1329. [23:35] <ShTiRLiC> Стоп
  1330. [23:35] <ShTiRLiC> _ShaMan_
  1331. [23:35] <ShTiRLiC> [23:35:15] <_ShaMan_> kas ждём GI в TheEngine %)
  1332. [23:35] <ShTiRLiC> Это што значит???
  1333. [23:36] <Zeux> я обращаю внимание на всякий случай
  1334. [23:36] <Zeux> в аутдоре ценность GI - нулевая фактически
  1335. [23:36] <WhiteWind|> Как не будет хардварной? А Geometry Shader на что?
  1336. [23:36] <Zeux> там основной вклад - это окружение
  1337. [23:36] <Zeux> которое сделано и в сталкере, и которое делается очень дешево :)
  1338. [23:36] <paladinrus> может это ценность касательно сталкеровского алгоритма?
  1339. [23:36] <Zeux> WhiteWind|, и что с тем Geometry Shader?
  1340. [23:36] <_ShaMan_> ShTiRLiC кас в SkyFallen работает. их движок называется TheEngine
  1341. [23:36] <Zeux> это ценность вообще GI
  1342. [23:37] <Zeux> потому что в индоре
  1343. [23:37] <Zeux> отраженные лучи улетают в стенки
  1344. [23:37] <Zeux> а в аутдоре - преимущественно в небо.
  1345. [23:37] <Zeux> т.е. понятно, в пещерах, домах и прочее (внутри) - видно будет
  1346. [23:37] <paladinrus> хм вспоминается картинка из какой-то игры про мотоциклы на ixbt
  1347. [23:37] <Zeux> там не GI
  1348. [23:37] <Zeux> там SH
  1349. [23:37] <Zeux> если я думаю про ту картинку
  1350. [23:37] * cppg (cppg@85.249.94.ircnet-3873) has joined #gamedev_lecture
  1351. [23:37] <Zeux> а оно не про то совсем
  1352. [23:37] * ChanServ sets mode: +o cppg
  1353. [23:37] <WhiteWind|> Есть у меня одна мысль, и я её думаю. Все видели Dynamic Ambient Occlusion?
  1354. [23:37] <Zeux> оно про дешевое освещение большим кол-вом источников :)
  1355. [23:38] <kas> как это не про то?
  1356. [23:38] <Zeux> ну, ок, про то тоже
  1357. [23:38] <kas> что запечёшь то и будет
  1358. [23:38] <kas> ты ври да не завирайся!
  1359. [23:38] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1360. [23:38] <Zeux> т.е. может использоваться для GI, да
  1361. [23:38] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1362. [23:38] <paladinrus> там снаружи было
  1363. [23:38] <paladinrus> если я правильно понял понятия индор/аутдор =)
  1364. [23:38] <paladinrus> ща найду
  1365. [23:38] <Zeux> но вряд ли для realtime :)
  1366. [23:38] <Zeux> да, снаружи
  1367. [23:38] <[ENRIX]> ну все люди, пока. Спасибо еще раз Zeux за лекцию(не зря я тут пробыл)
  1368. [23:38] <Zeux> из Moto GP 3 вроде
  1369. [23:39] * nsf (nsf@82.193.88.ircnet-21649) has left #gamedev_lecture (+q)
  1370. [23:39] <Zeux> WhiteWind|, видели когда-то
  1371. [23:39] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1372. [23:39] * [ENRIX] (XXX@217.20.47.ircnet-4855) has left #gamedev_lecture (+q)
  1373. [23:39] <paladinrus> http://www.ixbt.com/video2/terms2k5.shtml#rs
  1374. [23:39] <paladinrus> ага
  1375. [23:39] <paladinrus> мотогп3
  1376. [23:39] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1377. [23:39] <paladinrus> мотогп2
  1378. [23:39] <paladinrus> точнее
  1379. [23:40] <WhiteWind|> Zeux, Дык это половина пути реальной модели освещения.
  1380. [23:40] <cppg> Опубликовано - 15 февраля 2006 г. -- баян
  1381. [23:40] <Zeux> AO опять же не совсем про то :)
  1382. [23:40] <Zeux> GI оно per light, а AO - per model
  1383. [23:40] * Qiller (void@ircnet-15850.ameritech.net) has joined #gamedev_lecture
  1384. [23:40] <Zeux> хотя конечно AO - это тоже GI
  1385. [23:40] * ChanServ sets mode: +o Qiller
  1386. [23:40] <Zeux> и в сталкере AO есть
  1387. [23:40] <Zeux> просто не на динамике.
  1388. [23:41] <Zeux> AO главное от источников не зависит, поэтому не так интересно
  1389. [23:41] * Antoha2 (NeoRa_uzer@84.18.34.ircnet-12778) has joined #gamedev_lecture
  1390. [23:41] <WhiteWind|> AO до сих пор использовалось только как реальное освещение от одного источника - неба
  1391. [23:41] * _TwilighT_ (immolation@89.109.83.ircnet-11616) has joined #gamedev_lecture
  1392. [23:42] <Zeux> не от неба, а от окружения тоже, никто не мешает
  1393. [23:42] <WhiteWind|> А если дать возможность каждому вертексу возможность освещать каждый...
  1394. [23:42] <kas> с каких пор ао от неба был? О_о
  1395. [23:42] <cppg> Zeux для совсем тупых, что такое A0?
  1396. [23:42] <kas> амбиент оклюжен
  1397. [23:42] <Zeux> Ambient Occlusion
  1398. [23:42] <cppg> а
  1399. [23:42] * denton|Drinking (kianovev@62.33.179.ircnet-3074) has joined #gamedev_lecture
  1400. [23:42] <neteraser> привет торчки
  1401. [23:43] <kas> йоу
  1402. [23:43] * denton|Drinking is now known as denton
  1403. [23:43] <neteraser> лекция была клевая, пасибо
  1404. [23:43] <cppg> Ты сам торчок, мы легально расслабляемся
  1405. [23:43] <_ShaMan_> =D
  1406. [23:43] <neteraser> :)
  1407. [23:43] * cppg чокаеццо с denton|drinkin
  1408. [23:43] <Qiller> Логи уже лежат где-то или еще не?
  1409. [23:43] <Zeux> спасибо еще раз всем, что пришли :)
  1410. [23:43] <kas> пока нет
  1411. [23:43] <Zeux> Qiller, минут через 15
  1412. [23:43] <kas> зеух незачто!
  1413. [23:43] <denton> интересно было
  1414. [23:43] <WhiteWind|> Ambient Occlusion это загороженность точки её окружением. Загороженность от неба. Кривой перевод, какой-то
  1415. [23:43] <Zeux> сегодня кстати рекорд посещаемости #gamedev_lecture
  1416. [23:43] <kas> в следующий раз я могу опять придти!
  1417. [23:44] <cppg> Zeux чувак, спасибо тебе за легцио
  1418. [23:44] <cppg> Да.
  1419. [23:44] <Zeux> kas, спасибо тебе в особенности!!!
  1420. [23:44] <_ShaMan_> обмен любезностями :)
  1421. [23:44] <kas> дыда
  1422. [23:44] <Zeux> WhiteWind|, ну речь о том, что окружение - не обязательно небо :)
  1423. [23:44] <kas> ао с небо нисвязано ровно никак
  1424. [23:44] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1425. [23:44] <kas> *небом
  1426. [23:45] <cppg> _ShaMan_ ну надо же хоть что-то хорошее зеуксу сказать, не зря же он старался
  1427. [23:45] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has joined #gamedev_lecture
  1428. [23:45] <WhiteWind|> Естественно, просто изначально светящим считалось только небо
  1429. [23:45] * ShTiRLiC (boyan@195.133.156.ircnet-2508) has left #gamedev_lecture (+q)
  1430. [23:45] <kas> у кого считалос?
  1431. [23:45] <_ShaMan_> cppg угу
  1432. [23:46] <cppg> [23:46:56] -ChanServ-    Users record: 57 user(s) at May 09 19:06:54 2007 CEST [2 hour(s), 39 minute(s) and 47 second(s) ago.]
  1433.  


Editing is locked.