Создание буфера вершин
This commit is contained in:
		
							parent
							
								
									b7f9d0cb50
								
							
						
					
					
						commit
						c3f0d2dc35
					
				@ -27,6 +27,8 @@ class Vulkan
 | 
			
		||||
        VkPipeline graphicsPipeline; // Графический конвейер
 | 
			
		||||
        VkCommandPool commandPool; // Пул команд
 | 
			
		||||
        std::vector<VkCommandBuffer> commandBuffers; // Буферы команд
 | 
			
		||||
        VkBuffer vertexBuffer; // Буфер вершин
 | 
			
		||||
        VkDeviceMemory vertexBufferMemory; // Память буфера вершин
 | 
			
		||||
 | 
			
		||||
        // Структура для хранения флагов
 | 
			
		||||
        struct 
 | 
			
		||||
@ -47,6 +49,7 @@ class Vulkan
 | 
			
		||||
        void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных
 | 
			
		||||
        void createCommandPool(); // Создание пула команд
 | 
			
		||||
        void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
 | 
			
		||||
        void createVertexBuffer(); // Создание буфера вершин
 | 
			
		||||
};  
 | 
			
		||||
 | 
			
		||||
#endif // VK_H
 | 
			
		||||
							
								
								
									
										40
									
								
								src/vk.cpp
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								src/vk.cpp
									
									
									
									
									
								
							@ -20,11 +20,15 @@ void Vulkan::init(GLFWwindow* window)
 | 
			
		||||
    createRenderpass(); // Создание проходов рендера
 | 
			
		||||
    createGraphicPipeline(); // Создание графического конвейера
 | 
			
		||||
    createCommandPool(); // Создание пула команд
 | 
			
		||||
    createVertexBuffer(); // Создание буфера вершин
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// завершение работы
 | 
			
		||||
void Vulkan::destroy()
 | 
			
		||||
{
 | 
			
		||||
    vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин
 | 
			
		||||
    vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин
 | 
			
		||||
 | 
			
		||||
    vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула
 | 
			
		||||
    
 | 
			
		||||
    vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера
 | 
			
		||||
@ -845,3 +849,39 @@ void Vulkan::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize siz
 | 
			
		||||
    // Освобождение командного буфера копирования
 | 
			
		||||
    vkFreeCommandBuffers(logicalDevice, commandPool, 1, &commandBuffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Создание вершинного буфера
 | 
			
		||||
void Vulkan::createVertexBuffer()
 | 
			
		||||
{
 | 
			
		||||
    //Вершины, записываемые в буфер
 | 
			
		||||
    Vertex vertices[] = {
 | 
			
		||||
                            { {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f} },
 | 
			
		||||
                            { { 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f} },
 | 
			
		||||
                            { { 0.5f,  0.5f}, {0.0f, 0.0f, 1.0f} },
 | 
			
		||||
                            { {-0.5f,  0.5f}, {1.0f, 1.0f, 1.0f} }
 | 
			
		||||
                        };
 | 
			
		||||
    // Размер буфера в байтах
 | 
			
		||||
    VkDeviceSize bufferSize = sizeof(Vertex) * 4;
 | 
			
		||||
 | 
			
		||||
    // Промежуточный буфер для переноса на устройство
 | 
			
		||||
    VkBuffer stagingBuffer;
 | 
			
		||||
    VkDeviceMemory stagingBufferMemory;
 | 
			
		||||
    createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
 | 
			
		||||
 | 
			
		||||
    // Отображение памяти буфера
 | 
			
		||||
    void* data;
 | 
			
		||||
    vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
 | 
			
		||||
    // Копирование вершин в промежуточный буфер
 | 
			
		||||
    memcpy(data, vertices, (size_t) bufferSize);
 | 
			
		||||
    // Прекращение отображения памяти буфера
 | 
			
		||||
    vkUnmapMemory(logicalDevice, stagingBufferMemory);
 | 
			
		||||
 | 
			
		||||
    // Создание буфера вершин
 | 
			
		||||
    createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory);
 | 
			
		||||
    // Копирование из промежуточного в буфер вершин
 | 
			
		||||
    copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
 | 
			
		||||
   
 | 
			
		||||
    // Освобождение памяти и уничтожение буферов
 | 
			
		||||
    vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
 | 
			
		||||
    vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user