Arseny Kapoulkine:
Advanced Visual Effects with DirectX 11: Vertex Shader Tricks - New Ways to Use the Vertex Shader to Improve Performance.
Speaker: Bill Bilodeau (AMD)
Если бы я работал в AMD и послушал или прочитал этот доклад, я бы подумал о том чтобы автора уволить. Стыдно.
Автор попытался рассказать, как писать быстрый код в VS и вообще оптимизировать эту часть пайплайна.
Рассказал, что на AMD железе нужно выплевывать 4 или меньше атрибута из каждой шейдерной стадии в следующую для скорости.
Рассказал, что выборка из текстур в вершинном шейдере имеет latency, которую можно скрывать группировкой фетчей рядом в коде, и вставлением ALU операций между использованием результата и фетчем.
Дальше начались "откровения".
Рассказал, что существует pre-VS кеш (данных) и post-VS кеш (трансформированных вершин).
И значит маленькие вершинки и индексы это хорошо.
Потом рассказал что SV_VertexID это прикольная штука которая увеличивается на 1 при рендеринге индексированной геометрии (а???)
И конечно показал на слайде некомпилирующийся код.
Потом рассказал что GS медленный и инстансинг в принципе тоже медленный, и для geometry amplification надо стараться использовать SV_VertexID.
См. выше про партиклы, пример производительности - на 1M квадов:
AMD: indexed triangles w/SV_VertexID 1.02 ms, GS 2.7 ms, instanced 3.54 ms.
NVidia: indexed triangles w/SV_VertexID 1.5 ms, GS 1.6 ms, instanced 2.91 ms.
Потом 4 слайда рассказывал как рисовать full-screen triangle без vertex buffer.
Потом рассказал что существует мощная техника merge instancing.
(нормальное описание вот тут http://www.humus.name/Articles/Persson_GraphicsGemsForGames.pdf)
Про склеивание разных мешей в один draw call.
В оригинальной статье для этого нужно в вершинном шейдере самому реализовывать input assembler логику, чтобы работать с индексированными мешами, объяснение автора поддержку индексов не предусматривало.
Автор привел пример как техника ускорила какую-то игру в которой было 13.5M треугольников (40M вершин)
Я спросил, измеряли ли они в сравнении с обычным инстансингом с индексированными треугольниками, сказали - нет.
Потом рассказал что VS могут сами писать данные в память, и привел пример skinning (мол, stream out не нужен больше)
Его спросили, чем запись из VS и последующее использование результата лучше чем скиннинг в CS заранее.
Он над этим не задумывался.
И в довершение в качестве еще одного примера пользы записи из VS в произвольное место памяти был приведен пример в котором VS считал bounding box через 6 interlocked операций с UAV.
На этом я умолкаю на сегодня, что-то я утомился :) Продолжение завтра!
Arseny Kapoulkine:
Он еще так все это рассказывал как будто его на GDC притащили, долго били палкой и вообще собралась толпа странных людей слушать про всякие глупости.
Может так оно и есть впрочем.
Баженов Кирилл:
доклады на GDC не просто так читаются, видимо dev-relations у AMD уже насмотрелись всякого и хотят, чтобы хоть базовые вещи правильно были сделаны:)