Skip to content

Instantly share code, notes, and snippets.

@MBkkt
Last active January 26, 2021 00:47
Show Gist options
  • Save MBkkt/0ff3878266f57f8f45830282d0b58752 to your computer and use it in GitHub Desktop.
Save MBkkt/0ff3878266f57f8f45830282d0b58752 to your computer and use it in GitHub Desktop.
Немного про skia

Первое что стоит понимать, у Skia апи, которое соотвествует скорее софтварной растеризации, а бекенд под OpenGL, Vulkan, etc появился позже. Хотя возможно правильнее называть это path renderer. Поэтому если вам не нужны например кривые безье, то кажется можно меньшеми усилиями и возможно с лучшим первом добиться аналогичного результа.

Нас интересует метод drawPath, а именно как рисуется Round/Miter/Bevel соединения ребер. Они создают треугольники в тесселяционном шейдере: Из явных плюсов создания треугольников на лету, меньшее потребление памяти, загруженность шины, из минусов, большее количество вычислений, загрузка гпу.

В целом гпу рендер работает как-то так:

  1. тесселяция пути
  2. рисование в стенсил
  3. рисование цвета Собственно вот ссылочка на статью https://www.researchgate.net/publication/262357352_GPU-accelerated_Path_Rendering с более подробным описанием.

https://skia.googlesource.com/skia/+/refs/heads/master/src/gpu/tessellate/GrStrokeTessellateShader.h#26 https://github.com/google/skia/blob/master/src/gpu/tessellate/GrStrokeTessellateShader.cpp#L271 Собственно то что нас инетересует как происходит соединение сегметов. Тут мы видим передается в шейдер сколько не полноценных сегментов нам понадобится. Для round 0 так как зависит от угла. Бтв я делал по другому, считал честные треугольники сегмента линии, в угле двигая смежные вершины на биссектрису и добавляя доп треугольник(и), но это не будет работать с не линями. Собственно статья на тему с пояснениям, что да как https://arxiv.org/pdf/2007.00308.pdf https://github.com/google/skia/blob/master/src/gpu/tessellate/GrStrokeTessellateShader.cpp#L822

По поводу софтварной реализации, как-то ничего не нашел (есть такое: https://github.com/google/skia/blame/master/src/gpu/ops/GrAAConvexTessellator.cpp#L589, но это не совсем то, как минимум потому что про другое, а как максимум потому что нет Round) Есть подозрения, что ничего не мешает им запускать тесселяцию в своих шейдерах на процессоре (https://skia.googlesource.com/skia/+/refs/heads/master/src/gpu/tessellate/GrStrokeTessellateShader.h#31), хотя возможно я не прав.

https://github.com/google/skia/tree/master/src/gpu/ccpr если вдруг заинтересует это про их метод пиксельного сглаживания пути, эти нехорошие люди даже патент вроде получили лол, метод основывается на каком то хитром подсчете площади покрытия пикселя путем.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment