Vulkan Learning — 8. Multipass Rendering

Суть отрисовки в несколько проходов (multipass rendering) мы описали довольно подробно в заметке Vulkan Learning — 3. Swapchain. Depth Buffer. Render Pass. Framebuffers. Один проход (subpass) — суть запуск одного определенного пайплайна и получение на выходе некоего результата в виде фреймбуфера, который затем используется в следующем проходе (subpass’е), который запускает совсем другой пайплайн. Самый последний проход выдает нам буфер цвета, который мы отправляем в presentation engine. Ну а сейчас перейдем к техническим деталям. Начнем с рисунка, который показывает, какие части Читать дальше …

Vulkan Learning — 7. Дескрипторы. Запись команд в командный буфер

Итак, нам осталось рассмотреть привязку данных наших трехмерных объектов (mesh, uniform variables, textures etc.) к пайплайну. Делается это при помощи различных команд, которые записываются в командный буфер. Начнем рассмотрение записи команд в буфер с некоего базового скелета: // Record commands to the command buffers. // The commands bind resources (pipeline, uniforms, textures) and do drawing. // The usual practice is to prerecord a set of commands to the command buffer once // and then in the rendering loop submit them Читать дальше …

Vulkan Learning — 6. 3d модель. Буферы памяти и изображения

Итак, нам осталось отрисовать трехмерную модель. Прежде всего, посмотрим, что модель собой представляет (рис. 1). Модель состоит из трех кусков данных: Mesh. Модель по сути представляет собой множество треугольников. Каждый треугольник задается тремя вершинами (vertices), а каждая вершина характеризуется тремя координатами в в локальной системе координат нашей модели. Таким образом у нас должен быть массив вершин. Чтобы задать треугольник, нам надо указать три индекса (indices) в массиве вершин. Чтобы задать множество треугольников, нам нужно указать множество троек таких индексов. Таким Читать дальше …

Vulkan Learning — 5. Acquiring Swapchain Image. Submitting Command Buffer. Presenting Image. Synchronization. Swapchain Recreation

В этой заметке рассмотрим тот кусок кода, который непосредственно берет изображение из нашего свопчейна, заставляет видеопроцессор нарисовать в нем что-то и отправляет готовое изображение на экран монитора. Command Buffer Программы, которые мы пишем, используя графические API, состоят из вызовов функций. Вероятно, большинство из них (в OpenGL это команды, такие как glDrawElements, glBindBuffer, glUseProgram и другие) изменяют состояние GPU, заставляют GPU что-то нарисовать… Такие функции отправляют видеопроцессору команды что-то сделать. Во всех API эти команды буферизуются, т. е. накапливаются в некоем Читать дальше …

Vulkan Learning — 4. Pipeline. Descriptor Sets. Push Constants

Следующий большой объект в объектной модели Vulkan — это Pipeline. Представляет он собой некий конвейер, через который проходят данные (вершины, текстуры и прочее), чтобы на выходе получилось изображение (то, которое мы увидим на экране). Несколько стадий пайплайна (и очень важных стадий) являются программируемыми — для них пишутся программы, которые называются «шейдеры». Этих стадий сейчас четыре: Vertex shader Geometry shader Tesselation shader Fragment shader Но есть и не программируемые, однако конфигурируемые стадии, например следующие: Primitive assembly Clipping Rasterization Blending Depth test Читать дальше …

Vulkan Learning — 3. Swapchain. Depth Buffer. Render Pass. Framebuffers

Речь пойдет об инфраструктуре предназначенной сугубо для отрисовки и отображения графики на экране. Напомним, что отрисовка изображения суть присваивание значений всем его пикселям. Изображение хранится в оперативной памяти, а, будучи отрисованным, отображается на экране монитора. Участок памяти, в котором хранится изображение, часто называется фреймбуфером. Традиционно используется как минимум два фреймбуфера — один из них отображается на экране а то время как GPU рисует изображение в другом, после чего фреймбуферы меняются местами (swap). Это называется двойная (потому что буферов два) буферизация. Читать дальше …

Vulkan Learning — 2. Surface. Physical Device. Logical Device. Command Queues

Поверхность (Surface) Следующий шаг после создания Instance — создание поверхности (Surface). Vulkan использует абстракцию Surface для представления нативной оконной подсистемы имеющейся операционной системы. В каждой операционной системе имеется своя функция для создания поверхности и, соответственно, свое расширение (extension), частью которого является эта функция. Для Windows существует расширение VK_KHR_win32_surface. Однако поддержка поверхностей как таковых сама является расширением (поскольку не во всех случаях графику нужно выводить на экран — см. offscreen rendering) — VK_KHR_surface. // THE FOLLOWING IS PSEUDOCODE! // Field vk::SurfaceKHR Читать дальше …

Vulkan Learning — 1. Установка. Инициализация. Instance. Отладка

Недавно я завершил прохождение видеокурса по Vulkan, и спешу законспектировать информацию, пока она не выветрилась из моей дырявой головы. Литература Vulkan Tutorial LunarG Vulkan Samples Tutorial API without Secrets: Introduction to Vulkan by Pavel Lapinski Understanding Vulkan Objects Vulkan Guide Writing an efficient Vulkan renderer Samsung GameDev Resources Vulkan Specification Мой репозиторий для поделок на Vulkan Установка Vulkan SDK Скачивается с сайта LunarG. Кроссплатформенный SDK, переносим на разные платформы на уровне исходного кода (в коде присутствуют директивы условной компиляции). Включает Читать дальше …