Войти
ПрограммированиеФорумГрафика

G-Buffer (6 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#75
20:10, 15 июня 2021

Eugene
> Ах да, удачи передавать 10 источников света в один шейдер на мобилке. Когда
> источников света действительно мало, отдельные проходы могут оказаться дешевле,
> чем вся та избыточная инфраструктура, которая нужна, чтобы засунуть все
> источники света в один проход.
А что не так с передачей десяти источников на мобилки? У меня всё отлично передается, никакой избыточной инфраструктуры не нужно. Отрисовать 10 раз меш - точно быстрее не будет.


#76
20:14, 15 июня 2021

MikeNew
> Ну как сказать.. вот скрин из Kingdom Come:
Ты в Kingdom Come на 710 играешь?

#77
20:20, 15 июня 2021

MrShoor
Времена были другие. Во первых раньше, на комбайнера, sm1 и sm2 только так и можно было делать, поэтому делали как привычнее. Во вторых тайловых-кластерных техник ещё не изобрели(первую вроде в 2007 придумали). В третьих - делать цикл по всем лайтам на sm3 достаточно проблематично, структур буфферов нету, индексинг в констант буффер - жопа, на gf7000 проблемы с ddx/ddy и прочие весёлости эпохи ранней шэйдерности.

#78
(Правка: 20:42) 20:41, 15 июня 2021

Battle Angel Alita
> Времена были другие. Во первых раньше, на комбайнера, sm1 и sm2 только так и
> можно было делать, поэтому делали как привычнее.
Ну я как бы жил в то время и писал код под sm1 и sm2. До sm3 можно было легко упереться в число инструкций шейдера, и да, 10 источников света туда не пропихнешь как минимум из-за количества инструкций (хотя 2-3 запросто).

Battle Angel Alita
> Во вторых тайловых-кластерных техник ещё не изобрели(первую вроде в 2007
> придумали).
Тайловые техники то тут причём? Мы же обсуждаем цикл в шейдере vs рисовать по 10 раз.

Battle Angel Alita
> В третьих - делать цикл по всем лайтам на sm3 достаточно проблематично,
> структур буфферов нету, индексинг в констант буффер - жопа
Чего чего? Какая жопа? Я на sm3 во всю использовал массивы для юниформ переменных. Никакой жопы там не было.

Battle Angel Alita
> на gf7000 проблемы с ddx/ddy и прочие весёлости эпохи ранней шэйдерности.
Не совсем понимаю о каких проблемах ddx ddy ты говоришь, но это не важно, потому что ddx ddy используются для освещения чуть менее чем никак.

#79
22:20, 15 июня 2021

MrShoor
> А что не так с передачей десяти источников на мобилки?
На WebGL 1 гарантируется 16 vec4-констант в пиксельном шейдере. Их физически не хватит больше чем на 1-2 источника света. Хз какие лимиты на мобилках, но, возможно, сравнимые.

> никакой избыточной инфраструктуры не нужно
Как обрабатываешь light cookies, в терминологии Unity? Как передаешь разные типы источников?
Серьезно, скинь код как ты это делаешь, а я подумаю как это адаптировать и какие могут быть проблемы.

#80
22:41, 15 июня 2021

Eugene
> MrShoor
> > А что не так с передачей десяти источников на мобилки?
> На WebGL 1 гарантируется 16 vec4-констант в пиксельном шейдере. Их физически не
> хватит больше чем на 1-2 источника света. Хз какие лимиты на мобилках, но,
> возможно, сравнимые.
Можно данные источников, материалов хранить в текстуре, выбирать типа как из атласа.

#81
22:41, 15 июня 2021

Eugene
> На WebGL 1 гарантируется 16 vec4-констант в пиксельном шейдере. Их физически не
> хватит больше чем на 1-2 источника света. Хз какие лимиты на мобилках, но,
> возможно, сравнимые.
https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices

The minimum requirements for WebGL are quite low. In practice, effectively all systems support at least the following:
MAX_FRAGMENT_UNIFORM_VECTORS: 64

Так же можешь чекнуть:
https://webglreport.com/ сколько на твоём железе поддерживается этих самых юниформов.

Но даже если вдруг ты упираешься в ограничения по константам (а я упирался, правда не в источниках света) - всегда можно упаковать нужные тебе данные в текстуру. Там лимиты становятся практически безграничными.

> Как обрабатываешь light cookies, в терминологии Unity?
Не знал что такое лайт куки, загуглил. И причем тут Light Cookies? Как они собственно мешают передать массив источников света и сделать цикл в шейдере?

#82
(Правка: 22:52) 22:51, 15 июня 2021

betauser
> Можно данные источников, материалов хранить в текстуре, выбирать типа как из
> атласа.
Можно. Ты знаешь, как эффективно обновлять динамическую текстуру с ЦПУ? Я — вообще хер знает, но это вроде было не так просто, как динамический буфер. Ну и собственно вот — дополнительная инфраструктура. И -1 текстурный слот, которых и так всего 8 — а это очень мало.

MrShoor
> всегда можно упаковать нужные тебе данные в текстуру
ditto

> Как они собственно мешают передать массив источников света и сделать цикл в
> шейдере?
У каждого источника может быть (а может и не быть) своя текстура, которую нужно сэмплить.
Так что по факту тебе все равно нужно будет по дипу на каждую уникальную текстуру + дип на без текстур. Это, разумеется, быстрее, чем по проходу на каждый источник, но вот кода уже заметно больше.

#83
(Правка: 23:06) 23:05, 15 июня 2021

Eugene
> Можно. Ты знаешь, как эффективно обновлять динамическую текстуру с ЦПУ?
glTexImage2D и glTexSubImage2D один раз на фрейм чем тебе не эффективно?

> Я — вообще хер знает, но это вроде было не так просто, как динамический буфер.
Это будет в тысячу раз быстрее, чем менять кучу раз юниформ переменные на каждый дроуколл

> У каждого источника может быть (а может и не быть) своя текстура, которую нужно сэмплить.
И? Мы вроде уже говорили об этом. Передавай либо несколько текстур в шейдер, либо если текстурные слоты кончились - упакуй в атлас.

> Так что по факту тебе все равно нужно будет по дипу на каждую уникальную
> текстуру + дип на без текстур.
Не нужно.

> Это, разумеется, быстрее, чем по проходу на каждый источник, но вот кода уже заметно больше.
В шейдере - да, кода чуть больше. На CPU наоборот - кода меньше.

#84
(Правка: 23:30) 23:21, 15 июня 2021

MrShoor
> glTexImage2D и glTexSubImage2D один раз на фрейм чем тебе не эффективно?
У них нет usage хинтов. Остается только молиться чтобы драйвер догадался аллоцировать текстуру в каком-нибудь круговом буфере.

> Передавай либо несколько текстур в шейдер, либо если текстурные слоты кончились
> - упакуй в атлас.
Если у тебя WYSWYG редактор, от которого требуется поддерживать любые пользовательские шейдеры и любые пользовательские текстуры, упаковка нескольких источников света в один проход — усложнение либо кода редактора, либо придумывать какую-то автоматическую упаковку в атлас on demand в начале отрисоки. Ах да, а еще размера алтаса может не хватить. Сколько там реалистично, 1к, 2к текстуры максимум на мобилках? Ах да (2), второго текстурного слота тоже нет.

Понятно, что в реальности light cookies так никто не использует. Но дженерик-движок типа Юнити должен уметь рисовать в том числе и такие кривые сцены.

#85
23:39, 15 июня 2021

Eugene
> У них нет usage хинтов. Остается только молиться чтобы драйвер догадался
> аллоцировать текстуру в каком-нибудь круговом буфере.
Каком круговом буфере? Ты о чём вообще? Знаешь как glTexSubImage2D работает под капотом?
Ну и обновление один раз на фрейм. Эти 300 байт (или сколько там у тебя на источники света уйдет) можно хоть по одному битику заливать, оно всё равно будет быстрее, чем обновление констант на каждый дроуколл.

> либо придумывать какую-то автоматическую упаковку в атлас on demand в начале
> отрисоки.
Да, именно так. Это же невероятно сложные 50 строк кода, которые упаковывают атласы: https://blackpawn.com/texts/lightmaps/

> Сколько там реалистично, 1к, 2к текстуры максимум на мобилках?
Да чо уж там. 32 на 32 пикселя.
https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices
MAX_TEXTURE_SIZE: 4096

> Ах да (2), второго текстурного слота тоже нет.
Аж интеерсно как юнити одним текстурным слотом и модельки текстурирует и световые печеньки накладывает.
https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices
MAX_TEXTURE_IMAGE_UNITS: 8

#86
(Правка: 23:56) 23:53, 15 июня 2021

MrShoor
> Каком круговом буфере? Ты о чём вообще? Знаешь как glTexSubImage2D работает под
> капотом?
Я вообще хрен знает. Как? Я знаю что динамические буферы круговым буфером делаются.

> https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices
Интересно, мобильные браузеры входят в эту статистику?

> Эти 300 байт (или сколько там у тебя на источники света уйдет) можно хоть по
> одному битику заливать
Погоди-погоди, какие 300 байт? У тебя же на каждый объект свой список источников света. Так что это либо 300 байт на объект, либо нужно дополнительно передавать массив индексов или что-то в духе. Я хрен знает как это делают обычно.

> MAX_TEXTURE_IMAGE_UNITS: 8
Всего восемь текстурных слотов. Один слот на печеньку это уже много. Два или три?.. Вообще никак. Кстати, если использовать две текстуры, то как между ними выбирать? Я не уверен что на мобилках есть сonditional texture lookup.

#87
0:09, 16 июня 2021

Eugene
> Я вообще хрен знает. Как?
Конечно это зависит от драйвера, но в большинстве случаев так:
1. Драйвер проверяет используется ресурс в данный момент или нет. Если не используется - просто обновляет сразу данные в текстуре.
2. Если используется - то драйвер аллоцирует у себя временную память, и вставляет команду на обновление ресурса из этой самой памяти в очередь.
3. После обновления текстуры кусочек памяти связанный с этими данными освобождается.

> Интересно, мобильные браузеры входят в эту статистику?
Да, входят. Эти бест практики написаны как раз с учетом того, чтобы код работал и на десктопах, и на мобилках.

> Погоди-погоди, какие 300 байт? У тебя же на каждый объект свой список
> источников света.
Нет конечно. Нафига мне на каждый объект делать отдельный список источников света? Вот есть у меня в сцене пусть 50 источников света. Для каждого источника есть свой float4 color, float3 pos, float range, float3 dir, float2 angles. 52 байта на источник света. 52*50 = 2600 байт (ладно, ладно, не 300 байт, но 2600 байт - тоже ниочем).
> либо нужно дополнительно передавать массив индексов или что-то в духе. Я хрен знает как это делают обычно.
Собственно да, все эти источники запихиваются в текстуру. А когда рисуется объект, то просто передаются индексы источников, которые на него влияют.

> Кстати, если использовать две текстуры, то как между ними выбирать? Я не уверен что на мобилках есть сonditional texture lookup.
Используй атлас, выбирать между текстурами не придется.

#88
(Правка: 2:58) 1:05, 16 июня 2021

Eugene
> > Можно данные источников, материалов хранить в текстуре, выбирать типа как из
> > атласа.
> Можно. Ты знаешь, как эффективно обновлять динамическую текстуру с ЦПУ? Я —
> вообще хер знает, но это вроде было не так просто, как динамический буфер. Ну и
> собственно вот — дополнительная инфраструктура. И -1 текстурный слот, которых и
> так всего 8 — а это очень мало.
Текстура обновляется также как и буфер, создается с флагом динамическая. То что 8 выборок - это каменный век какой-то, впрочем всё же 24 значения есть.

#89
10:46, 16 июня 2021

betauser
> Текстура обновляется также как и буфер, создается с флагом динамическая
Какой в OpenGL флаг говорит, что текстура динамическая?.. Не помню такого.

> То что 8 выборок - это каменный век какой-то
Максимум 8 текстур — стандартный минимум для сегодняшних мобилок.
Я даже для PBR не использовал lookup-текстуру потому что слотов не было.

Страницы: 13 4 5 6 7 8 Следующая »
ПрограммированиеФорумГрафика