Vulkan API "Hello Triangle" (комментарии)
Это сообщение сгенерировано автоматически.
Старый добрый геймдев - куча непонятного кода на C++, но ощущение такое, что прикоснулся к чему-то великому.
Спасибо, бро, статья зачётная!
Skyblade
> куча непонятного кода на C++
Самому так казалось поначалу. Но после пары дней изучения сабжа - начинаешь понимать синтаксис функции едва ли на нее взглянув.
Тут сложность скорее не в куче кода, а тонких зависимостях между аргументами спрятанными глубоко-глубоко в жопеконтейнере очередного дескриптора.
Во-первых, спасибо за статью!
Пока только начал читать, но уже несколько замечаний:
1) форматирование кода: код практически не читаем из-за обилия переносов строк;
2) зачем ты издеваешься над нами, пытаясь, например, перевести слово "инстанс"? :)
Я так думаю, целевая аудитория поймет без перевода, а всякие "образцы цепочек обмена" только затрудняют понимание.
Кстати, можешь добавить в конец статьи под спойлер вот такой код-снипет, который оборачивает два вызова enumerate (первый, чтобы узнать кол-во, второй, чтобы получить):
template <class EnumeratedClass, class Holder, typename Function, typename ReturnClass> struct VulkanObjectsEnumerator; template <class EnumeratedClass, class Holder, typename Function> struct VulkanObjectsEnumerator<EnumeratedClass, Holder, Function, VkResult> { Vector<EnumeratedClass> operator ()( const Holder& holder, Function callable) { uint32_t count = 0; Vector<EnumeratedClass> objects; VULKAN_CALL( callable( holder, &count, nullptr)); if ( count > 0) { objects.resize( count); VULKAN_CALL( callable( holder, &count, objects.data( ))); } return objects; } }; template <class EnumeratedClass, class Holder, typename Function> struct VulkanObjectsEnumerator<EnumeratedClass, Holder, Function, void> { Vector<EnumeratedClass> operator ( )( const Holder& holder, Function callable) { uint32_t count = 0; Vector<EnumeratedClass> objects; callable( holder, &count, nullptr); if ( count > 0) { objects.resize( count); callable( holder, &count, objects.data( )); } return objects; } }; template <class EnumeratedClass, class Holder, typename Function> Vector<EnumeratedClass> enumerateVulkanObjects( const Holder& holder, Function callable) { using ReturnClass = decltype( callable( holder, nullptr, nullptr)); VulkanObjectsEnumerator<EnumeratedClass, Holder, Function, ReturnClass> enumerator; return enumerator( holder, callable); }
Пример использования:
queueProperties = enumerateVulkanObjects<VkQueueFamilyProperties>(physicalDevice, vkGetPhysicalDeviceQueueFamilyProperties);
Да, и еще удобно делать вот так:
VkSwapchainCreateInfoKHR vk_SwapchainCreateInfoKHR = { VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR };
Тип структуры записывается сразу, а все ненужные поля автоматом заполняются нулями.
—-—
Может стоит вместо дублирования структур из vulkan.h заменить их ссылками на доку?
—-—
Серьёзно, убери этот адский перевод слов :)
—--—
> Так же, после создания, нам потребуется обнулить пул.
Не понятно - зачем?
> разрешим доступ к памяти на чтение (VkAccessFlagBits::VK_ACCESS_MEMORY_READ_BIT).
Опять таки - зачем?
Sergio
> 1) форматирование кода: код практически не читаем из-за обилия переносов строк;
Специально писал в стиле под коллапсирование блоков.
Если включить в студии опцию свертывания {}, то выглядит очень компактно. Всякие мелочные действие не захламляют ни экран ни скоуп.
> 2) зачем ты издеваешься над нами, пытаясь, например, перевести слово "инстанс"?
Окей-окей, вот тут я и сам много раз думал стоил ли.
В принципе, для конкретного случая, я не против оставить "инстанс" вместо "образец". Но для "конвейеров", "очередей" и "ограждений" тебе придется привести аргументы посолиднее.
> Я так думаю, целевая аудитория поймет без перевода, а всякие "образцы цепочек
> обмена" только затрудняют понимание.
Ну англоязычную аудиторию же не затрудняет. Не холивар : )
> код-снипет
Нет. Я специально писал без лишних оборачиваний в классы и автоматизации, для облегчения понимания.
> Да, и еще удобно делать вот так
Удобно, когда пишешь реальный код. В туториале все должно я хочу чтобы все было как можно прозрачнее.
> Может стоит вместо дублирования структур из vulkan.h заменить их ссылками на
> доку?
А вот ссылки добавлю!
> Не понятно - зачем?
Тут мой промах. Как потом оказалось, там где-то 100 строчек можно на помойку выбросить за ненадобностью. Поправлю.
> Опять таки - зачем?
Как мне казалось, слои ругались если не выставить. Проверю и если будет надо - поправлю.
Спасибо за фидбек!
The Player
Я еще не дочитал )
Следующая порция (буду добавлять по мере чтения);
Из кода загрузки шейдера:
if(size % 4 != 0) throw std::exception( "");
WTF?
—-—
> Эта часть описывает тип выводимых примитивов (точки, линии, треугольники, etc.) и режим повторения (для рисования стрипами):
> режим повторения (для рисования стрипами):
вот это вообще не понятно, что бы это не значило.
Sergio
> WTF?
Для меня это тоже казалось странным, но SPIR-V шейдеры грузятся не байтами, а DWORDами (4 байта).
Там даже где-то в спецификации должен быть пункт на эту тему.
> вот это вообще не понятно, что бы это не значило.
Понимаю, но не знаю стоит ли влезать в детали.
Этот функционал эквивалентен OpenGLосвкому GL_PRIMITIVE_RESTART (разбиение стрипов на отдельные примитивы).
Стоит ли описывать это в "Hello Triangle"?
The Player
А почему бы просто не написать:
init_vulkano();
draw_triangle();
?
равен
Первостепенной целью я ставил линейность кода, без лишних вызовов функций и оберток.
В таком случае легко понять где создается, используется и удаляется объект. Легче понять что нужно для функционирования той или иной сущности.
Если бы я все разбивал на отдельные модули (как те же лунары), то опять получилась бы каша из кучи запутанных структур с указателями на используемые объекты.
чтобы статья содержала чуть меньше кода, предлагаю функцию создания окна заменить на
auto handle = CreateWindow("static", "window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 600, 0, 0, 0, 0); SetWindowLong( handle, GWL_WNDPROC, ...);
The Player
> Этот функционал эквивалентен OpenGLосвкому GL_PRIMITIVE_RESTART (разбиение
> стрипов на отдельные примитивы).
Не-не, по коду я понял о чем речь. Я здесь прикопался к тому, как про это написано.
The Player
> ограждений
А что это?
Тема в архиве.