Как «проинструктируется» графический процессор для рендеринга изображения? - PullRequest
0 голосов
/ 03 августа 2020

Если этот вопрос не задан, дайте мне знать, так как я не хочу загромождать платформу оффтопными c вопросами!

В любом случае, мне сложно найти информацию о что на самом деле происходит, когда изображение рендерится из-за некоторого кода, который я написал.

Скажем, я хотел сложить числа 5 и 3. ЦП записал 5 в один регистр и 3 в другой. ALU позаботится о вычислениях и выводе 8. Ничего страшного, CPU использует MOVE и ADD для получения результата.

Однако я не нахожу никакой информации о том, что происходит, когда я хочу чтобы нарисовать прямоугольник. Для большинства языков программирования существуют импортируемые фреймворки, которые позволяют вам это делать. В SpriteKit (Swift & Obj c), например, вы должны написать что-то вроде

let node = SKSpriteNode(color: .white, size: CGSize(width: 200, height: 300))

и добавить node к SKScene (просто сцена, содержащая childNodes) и белый прямоугольник "волшебным образом" будет отображаться. Я хотел бы знать, что происходит под капотом. Почему именно эта структура позволяет рисовать прямоугольник? Какой ассемблерный код (скажем, для Intel Core M) заставляет GPU вычислять, как будет выглядеть этот прямоугольник? И как SpriteKit опирается на основы Swift / Objective C, чтобы на самом деле это делать (и могу ли я сделать это сам)?

Может быть, странный вопрос, но я чувствую, что должен знать (да, иногда мне тоже любопытно). Спасибо.

PS Мне бы очень хотелось получить действительно подробный ответ, а не «CPU 'говорит' GPU рисовать прямоугольник» - CPU не могут разговаривать!

1 Ответ

0 голосов
/ 03 августа 2020

Есть много способов визуализировать выпуклый многоугольник . В прошлом наиболее часто использовался алгоритм ScanLine , при котором вы просто растеризовали все линии окружности в левый / правый буферы, а затем просто отображали с использованием горизонтальных линий и интерполировали другие координаты по пути (например, z, r, g , b, tx, ty, nx, ny, nz ...). Это подходило для однопоточного рендеринга программного обеспечения на базе CPU.

С распараллеливанием (как на GPU) другой подход становится более популярным. Он просто отображает только треугольники (поэтому вам нужно триангулировать ваши многоугольники) и отображает его следующим образом:

  1. вычислить AABB

    так просто min, max из x,y вершины треугольника.

  2. l oop через AABB

    это выполняется параллельно и выполняется интерполяторами графического процессора. Каждый интерполированный (зацикленный) «пиксель» называется фрагментом (поскольку он обычно содержит не только цвет)

  3. для каждого фрагмента

    вычислить barycentri c координаты и по результату определите, находится ли фрагмент внутри (s+t<=1) или снаружи (s+t>1) треугольника. Если внутри вызвать фрагментный шейдер.

Все это делается непосредственно перед этапом фрагментного шейдера, и обычно все это (или большая часть) реализуется в HW, поэтому кода нет.

В настоящее время рендеринг на графическом процессоре выполняется путем передачи геометрии самому драйверу gfx. То, что драйверы делают под капотом, для нас - это всего лишь предположение, но, скорее всего, они также просто передают параметры геометрии и конфигурации в нужные места на графическом процессоре (память, регистры, ...).

...