Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Vulkan API "Hello Triangle" (комментарии)

Vulkan API "Hello Triangle" (комментарии)

Поделиться
Страницы: 1 2 3 4 5 Следующая »
The PlayerУчастникwww15 сен. 201622:46#0
Vulkan API "Hello Triangle" (комментарии)
Это сообщение сгенерировано автоматически.
SkybladeУчастникwww15 сен. 201622:46#1
Старый добрый геймдев - куча непонятного кода на C++, но ощущение такое, что прикоснулся к чему-то великому.
Спасибо, бро, статья зачётная!
The PlayerУчастникwww15 сен. 201623:34#2
Skyblade
> куча непонятного кода на C++
Самому так казалось поначалу. Но после пары дней изучения сабжа - начинаешь понимать синтаксис функции едва ли на нее взглянув.
Тут сложность скорее не в куче кода, а тонких зависимостях между аргументами спрятанными глубоко-глубоко в жопеконтейнере очередного дескриптора.
SergioУдалёнwww16 сен. 201612:49#3
Во-первых, спасибо за статью!

Пока только начал читать, но уже несколько замечаний:
1) форматирование кода: код практически не читаем из-за обилия переносов строк;
2) зачем ты издеваешься над нами, пытаясь, например, перевести слово "инстанс"? :)
Я так думаю, целевая аудитория поймет без перевода, а всякие "образцы цепочек обмена" только затрудняют понимание.

SergioУдалёнwww16 сен. 201612:53#4
Кстати, можешь добавить в конец статьи под спойлер вот такой код-снипет, который оборачивает два вызова 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);

Правка: 16 сен. 2016 12:53

SergioУдалёнwww16 сен. 201612:58#5
Да, и еще удобно делать вот так:
VkSwapchainCreateInfoKHR vk_SwapchainCreateInfoKHR = { VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR };

Тип структуры записывается сразу, а все ненужные поля автоматом заполняются нулями.

—-—

Может стоит вместо дублирования структур из vulkan.h заменить их ссылками на доку?

—-—

Серьёзно, убери этот адский перевод слов :)

—--—

> Так же, после создания, нам потребуется обнулить пул.
Не понятно - зачем?

> разрешим доступ к памяти на чтение (VkAccessFlagBits::VK_ACCESS_MEMORY_READ_BIT).
Опять таки - зачем?

Правка: 16 сен. 2016 13:33

The PlayerУчастникwww16 сен. 201614:14#6
Sergio
> 1) форматирование кода: код практически не читаем из-за обилия переносов строк;
Специально писал в стиле под коллапсирование блоков.
Если включить в студии опцию свертывания {}, то выглядит очень компактно. Всякие мелочные действие не захламляют ни экран ни скоуп.

> 2) зачем ты издеваешься над нами, пытаясь, например, перевести слово "инстанс"?
Окей-окей, вот тут я и сам много раз думал стоил ли.
В принципе, для конкретного случая, я не против оставить "инстанс" вместо "образец". Но для "конвейеров", "очередей" и "ограждений" тебе придется привести аргументы посолиднее.

> Я так думаю, целевая аудитория поймет без перевода, а всякие "образцы цепочек
> обмена" только затрудняют понимание.
Ну англоязычную аудиторию же не затрудняет. Не холивар : )

> код-снипет
Нет. Я специально писал без лишних оборачиваний в классы и автоматизации, для облегчения понимания.

> Да, и еще удобно делать вот так
Удобно, когда пишешь реальный код. В туториале все должно я хочу чтобы все было как можно прозрачнее.

> Может стоит вместо дублирования структур из vulkan.h заменить их ссылками на
> доку?
А вот ссылки добавлю!

> Не понятно - зачем?
Тут мой промах. Как потом оказалось, там где-то 100 строчек можно на помойку выбросить за ненадобностью. Поправлю.

> Опять таки - зачем?
Как мне казалось, слои ругались если не выставить. Проверю и если будет надо - поправлю.

Спасибо за фидбек!

Правка: 16 сен. 2016 14:16

SergioУдалёнwww16 сен. 201614:49#7
The Player
Я еще не дочитал )
SergioУдалёнwww16 сен. 201614:58#8
Следующая порция (буду добавлять по мере чтения);

Из кода загрузки шейдера:

if(size % 4 != 0) throw std::exception("");
WTF?

—-—

> Эта часть описывает тип выводимых примитивов (точки, линии, треугольники, etc.) и режим повторения (для рисования стрипами):

> режим повторения (для рисования стрипами):
вот это вообще не понятно, что бы это не значило.

Правка: 16 сен. 2016 15:05

The PlayerУчастникwww16 сен. 201615:19#9
Sergio
> WTF?
Для меня это тоже казалось странным, но SPIR-V шейдеры грузятся не байтами, а DWORDами (4 байта).
Там даже где-то в спецификации должен быть пункт на эту тему.

> вот это вообще не понятно, что бы это не значило.
Понимаю, но не знаю стоит ли влезать в детали.
Этот функционал эквивалентен OpenGLосвкому GL_PRIMITIVE_RESTART (разбиение стрипов на отдельные примитивы).
Стоит ли описывать это в "Hello Triangle"?

равенПостоялецwww16 сен. 201615:44#10
The Player
  А почему бы просто не написать:
init_vulkano();
draw_triangle();

?

The PlayerУчастникwww16 сен. 201615:50#11
равен
Первостепенной целью я ставил линейность кода, без лишних вызовов функций и оберток.
В таком случае легко понять где создается, используется и удаляется объект. Легче понять что нужно для функционирования той или иной сущности.
Если бы я все разбивал на отдельные модули (как те же лунары), то опять получилась бы каша из кучи запутанных структур с указателями на используемые объекты.
XProgerПостоялецwww16 сен. 201617:20#12
чтобы статья содержала чуть меньше кода, предлагаю функцию создания окна заменить на
auto handle = CreateWindow("static", "window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 600, 0, 0, 0, 0);
SetWindowLong(handle, GWL_WNDPROC, ...);

SergioУдалёнwww16 сен. 201617:29#13
The Player
> Этот функционал эквивалентен OpenGLосвкому GL_PRIMITIVE_RESTART (разбиение
> стрипов на отдельные примитивы).
Не-не, по коду я понял о чем речь. Я здесь прикопался к тому, как про это написано.
SuperInoyПостоялецwww16 сен. 201620:20#14
The Player
> ограждений
А что это?
Страницы: 1 2 3 4 5 Следующая »

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр