Войти
ПрограммированиеФорумГрафика

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

Страницы: 1 2 3 4 5 Следующая »
#0
22:46, 15 сен 2016

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

Это сообщение сгенерировано автоматически.

#1
22:46, 15 сен 2016

Старый добрый геймдев - куча непонятного кода на C++, но ощущение такое, что прикоснулся к чему-то великому.
Спасибо, бро, статья зачётная!

#2
23:34, 15 сен 2016

Skyblade
> куча непонятного кода на C++
Самому так казалось поначалу. Но после пары дней изучения сабжа - начинаешь понимать синтаксис функции едва ли на нее взглянув.
Тут сложность скорее не в куче кода, а тонких зависимостях между аргументами спрятанными глубоко-глубоко в жопеконтейнере очередного дескриптора.

#3
12:49, 16 сен 2016

Во-первых, спасибо за статью!

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

#4
12:53, 16 сен 2016

Кстати, можешь добавить в конец статьи под спойлер вот такой код-снипет, который оборачивает два вызова 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);
#5
12:58, 16 сен 2016

Да, и еще удобно делать вот так:

VkSwapchainCreateInfoKHR vk_SwapchainCreateInfoKHR = { VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR };

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

—-—

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

—-—

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

—--—

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

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

#6
14:14, 16 сен 2016

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

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

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

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

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

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

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

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

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

#7
14:49, 16 сен 2016

The Player
Я еще не дочитал )

#8
14:58, 16 сен 2016

Следующая порция (буду добавлять по мере чтения);

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

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

WTF?

—-—

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

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

#9
15:19, 16 сен 2016

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

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

#10
15:44, 16 сен 2016

The Player
  А почему бы просто не написать:

init_vulkano();
draw_triangle();

?

#11
15:50, 16 сен 2016

равен
Первостепенной целью я ставил линейность кода, без лишних вызовов функций и оберток.
В таком случае легко понять где создается, используется и удаляется объект. Легче понять что нужно для функционирования той или иной сущности.
Если бы я все разбивал на отдельные модули (как те же лунары), то опять получилась бы каша из кучи запутанных структур с указателями на используемые объекты.

#12
17:20, 16 сен 2016

чтобы статья содержала чуть меньше кода, предлагаю функцию создания окна заменить на

auto handle = CreateWindow("static", "window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 600, 0, 0, 0, 0);
SetWindowLong(handle, GWL_WNDPROC, ...);
#13
17:29, 16 сен 2016

The Player
> Этот функционал эквивалентен OpenGLосвкому GL_PRIMITIVE_RESTART (разбиение
> стрипов на отдельные примитивы).
Не-не, по коду я понял о чем речь. Я здесь прикопался к тому, как про это написано.

#14
20:20, 16 сен 2016

The Player
> ограждений
А что это?

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.