Vulkan API — урок 53. Наложение текстур (+ листинг)

И последний шаг — доработать шейдеры, для получения цветов из текстуры. Для начала изменим vertex shader, для того, что бы он пропускал через себя координаты для fragment shader: layout(location = 0) in vec2 inPosition; layout(location = 1) in vec3 inColor;… Continue Reading

Vulkan API — урок 52. Координаты текстуры

Это будет коротенький, но важный урок перед завершением очередного этапа. Существует еще один важный компонент, необходимый для отображения текстур – фактические координаты каждой вершины. Координаты определяют, как изображение будет на самом деле отражено на геометрии. Добавим vec2 в структуру Vertex для координат… Continue Reading

Vulkan API — урок 51. Обновление дескрипторов

Для получения шейдером изображения через объект sampler нам понадобится дескриптор (descriptor). Ранее в уроках uniform buffers дескрипторы уже встречались, сейчас же посмотрим с новый тип дескрискриптора: combined image sampler. Необходимо изменить следующие дескрипторы: макета (layout), пула (pool) и набора (set). Перейдем… Continue Reading

Vulkan API — урок 50. Samplers

Шейдеры могут читать тексели непосредственно из изображения, но это не часто практикуется, когда изображения являются текстурами. Текстуры, как правило, доступны через модели (samplers), которые будут использовать различные фильтрации и преобразования, что в итоге и создаст конечный цвет. Эти фильтры полезны… Continue Reading

Vulkan API — урок 49. Texture image view

Ранее, когда работали над swap chain и буфером кадров, мы видели, что изображения доступны через mage views, но не напрямую. Аналог необходим и для изображения текстуры. Добавим новый член класса VkImageView для изображения текстуры и создадим функцию createTextureImageView, где создадим его: VDeleter… Continue Reading

Vulkan API — урок 48. Вспомогательные функции

Копирование изображений Перед тем, как вернуться к createTextureImage, создадим еще одну вспомогательную функцию copyImage: void copyImage(VkImage srcImage, VkImage dstImage, uint32_t width, uint32_t height) { VkCommandBuffer commandBuffer = beginSingleTimeCommands(); endSingleTimeCommands(commandBuffer); } Подобно буферам, необходимо указать, какая часть изображения должна быть скопирована в… Continue Reading

Vulkan API — урок 47. Изменение формата

Функция, что мы собираемся написать сейчас, включает запись и повторное выполнение буфера коман, так что теперь самое время переместить логику во вспомогательную функцию, или две: VkCommandBuffer beginSingleTimeCommands() { VkCommandBufferAllocateInfo allocInfo = {}; allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; allocInfo.commandPool =… Continue Reading

Vulkan API — урок 46. Изображение текстуры

Этот урок идет скорее не как отдельный, а как небольшое дополнение к предыдущему. Теперь абстрагируем создание изображения в функции createImage, как это было сделано ранее для буферов. Создадим функцию и переместим все операции создания в неё. Параметры width, height, format, tiling… Continue Reading

Vulkan API — урок 45. Промежуточное изображение

Теперь создадим изображение в общедоступной памяти. Пиксели в объекте изображения известны как тексели (texel(s)), так и и будем называть впредь. Добавим следующие две следующие переменные в функцию createTextureImage: VDeleter<VkImage> stagingImage{device, vkDestroyImage}; VDeleter<VkDeviceMemory> stagingImageMemory{device, vkFreeMemory}; Параметры для изображения определяются в структуре… Continue Reading

Vulkan API — урок 44. Текстурирование (texture mapping), предисловие

До этого момента геометрию просто окрашивали по вершинам, что является очень ограниченным подходом, теперь же перейдем к отображению текстурам. Это так же позволит загружать 3D модели, что так же будет описано. Нужно добавить текстуру в приложение, для этого выполним следующие… Continue Reading