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

SSBO vs VBO

#0
(Правка: 11:51) 11:08, 16 сен. 2020

Прочитал тут статейку
https://wickedengine.net/2017/06/05/should-we-get-rid-of-vertex-buffers/
Мысль в том, чтоб выкинуть VAO и прочие InputLayout, а в шейдере напрямую из буфера читать через vertex ID. Как-то так:

+ Показать

В той же статье написано, что на GTX 960 DX11 автор получил просадки fps при таком подходе. Я решил проверить, как оно в GL будет, наговнокодил тест, на моей GT 1030 разницы нет вообще.
Замерял так
+ Показать

Сам тест (менять режим на пробел)

Может я как-то замерял неправильно? Или правда можно VBO выкинуть?
Для теста 1717440 вершин не мало?


#1
(Правка: 11:13) 11:12, 16 сен. 2020

во-первых, так производиетльность рендера никто не замеряет. ты замеряешь время API вызовов, которое может вообще никакой корреляции не иметь с вренем на исполнения команд, которые вообще не обязаны выполняться, как только ты их вызываешь.

во-вторых, если верить легендам, разница может быть при распаковывании SINT8 нормалей во float3, потому что эта распаковка происходит в отдельном аппаратном модуле, а на ту же операцию в шейдере тебе придётся тратить какие-то ресурсы ресурсы.

чтобы проверить нормально, отрендерь стресс-тест, который упрётся в обработку именно вершин — например, сотню миллионов точек, которые не попадают во вьюпорт, в вершинный буфер затолкай.

#2
11:15, 16 сен. 2020

Suslik
> ты замеряешь время API вызовов
glQueryCounter(query[1], GL_TIMESTAMP); это же время на гпу

#3
(Правка: 11:20) 11:18, 16 сен. 2020

/A\
> glQueryCounter(query[1], GL_TIMESTAMP); это же время на гпу
я затупил (увидел только линию с SDL_GetTicks()). но всё равно самый надёжный способ такое тестить, особенно на opengl — это от смены кадра до смены кадра, потому что это исключает возможность что-то там накосячить с метками.

#4
11:20, 16 сен. 2020

Dimich
> Или правда можно VBO выкинуть?
На видеокартах с меш шейдерами и рейтрейсом VBO и так не используют)

#5
11:51, 16 сен. 2020

Мой тест на 60 млн треугольников работает одинаково с VBO и с SSB

#6
13:54, 16 сен. 2020

Dimich
на семерке и GTX700
VBO - 0.57 ms
SSBO 1.17 ms
больше чем в два раза медленнее SSBO.

#7
13:56, 16 сен. 2020

/A\
> Мой тест на 60 млн треугольников работает одинаково с VBO и с SSB
На какой видеокарте?

#8
14:09, 16 сен. 2020

Dimich
> На какой видеокарте?
gtx 1070

#9
14:12, 16 сен. 2020

Может на Паскале и выше разницы нет...

#10
(Правка: 15:58) 15:28, 16 сен. 2020

Suslik
> во-вторых, если верить легендам, разница может быть при распаковывании SINT8
> нормалей во float3, потому что эта распаковка происходит в отдельном аппаратном
> модуле, а на ту же операцию в шейдере тебе придётся тратить какие-то ресурсы
> ресурсы.

Аппаратные ускорятели вертекс фетча и конвертации форматов у амд повыбрасывали еще после перехода с тераскейл на гцн (Точнее, окончательно выкинули в веге) во за год до анонсирования пс4 новинкой, то есть почти 10 лет назад. И заменили невидимым софтом в прологе вертекс-шейдера.

http://developer.amd.com/wordpress/media/2013/10/evergreen_cayman… ing_guide.pdf

http://developer.amd.com/wordpress/media/2013/10/si_programming_guide_v2.pdf

У нвидии, думается, произошло примерно то же, отсюда и разница в этом треде среди разных поколений.

#11
(Правка: 16:12) 16:05, 16 сен. 2020

И да, первое, что приходит в голову - можно сделать наконец независимую индексацию по позиции нормали и текстурным координатам отдельными тремя индексами без удвоения вершин вообще. Прямо как в 2001 году на геймкубе. А для моделей меньше 1к полигонов можно врубить максимального еврея-наркомана и передавать единственную GL_UNSIGNED_INT_2_10_10_10_REV "вершину" в качестве входного аттрибута. А если задействовать более тяжелую наркоту, то можно вообще рендерить дравколами из таких вот вот пачек из 1к вершин, введя и меняя перед каждой пачкой  еще один униформ , задающий смещения.

#12
18:05, 16 сен. 2020

nonamezerox
> то можно вообще рендерить дравколами из таких вот вот пачек из 1к вершин
изобретаешь меш шейдер?

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