diff --git a/include/vk.h b/include/vk.h index 5eddab3..a3cefb4 100644 --- a/include/vk.h +++ b/include/vk.h @@ -23,7 +23,7 @@ class Vulkan std::vector swapChainImages; // Изображения из списка показа std::vector swapChainImageViews; // Информация об изображениях из списка показа VkRenderPass renderPass; // Проходы рендера - + // Структура для хранения флагов struct { @@ -38,6 +38,7 @@ class Vulkan void createWindowSurface(GLFWwindow* window); // Создание поверхности окна void createSwapchain(GLFWwindow* window); // Создание цепочки показа void createRenderpass(); // Создание проходов рендера + VkShaderModule createShaderModule(const char * filename); // Создание шейдерного модуля }; #endif // VK_H \ No newline at end of file diff --git a/shaders/shader.frag b/shaders/shader.frag new file mode 100644 index 0000000..13009da --- /dev/null +++ b/shaders/shader.frag @@ -0,0 +1,9 @@ +#version 450 + +layout(location = 0) in vec3 fragColor; + +layout(location = 0) out vec4 outColor; + +void main() { + outColor = vec4(fragColor, 1.0); +} \ No newline at end of file diff --git a/shaders/shader.vert b/shaders/shader.vert new file mode 100644 index 0000000..cb40e1e --- /dev/null +++ b/shaders/shader.vert @@ -0,0 +1,11 @@ +#version 450 + +layout(location = 0) in vec2 inPosition; +layout(location = 1) in vec3 inColor; + +layout(location = 0) out vec3 fragColor; + +void main() { + gl_Position = vec4(inPosition, 0.0, 1.0); + fragColor = inColor; +} \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 8a4ed9a..f57601c 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -513,4 +513,52 @@ void Vulkan::createRenderpass() { throw std::runtime_error("Unable to create render pass"); } + +} + +#include +// Считывание бинарного файла, содержащего шейдер +void readFile(const char * filename, std::vector& buffer) +{ + // откроем файл как бинарный и установим курсор в конец файла + std::ifstream file(filename, std::ios::ate | std::ios::binary); + // если файл не открыт - генерируем исключение + if (!file.is_open()) + { + throw std::runtime_error("Can't open file"); + } + // определим размер файла + size_t fileSize = (size_t) file.tellg(); + // создадим буфер + buffer.resize(fileSize); + + // перенесем курсор в начало файла + file.seekg(0); + // считаем данные в буфер + file.read(buffer.data(), fileSize); + // закроем файл + file.close(); +} + +// Создание шейдерного модуля +VkShaderModule Vulkan::createShaderModule(const char * filename) +{ + // буфер для чтения из файла + std::vector buffer; + // считаем шейдер из файла + readFile(filename, buffer); + + // Информация о создаваемом шейдерном модуле + VkShaderModuleCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + createInfo.codeSize = buffer.size(); + createInfo.pCode = reinterpret_cast(buffer.data()); + + // Создание шейдерного модуля + VkShaderModule shaderModule; + if (vkCreateShaderModule(logicalDevice, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) { + throw std::runtime_error("Unable to create shader module"); + } + + return shaderModule; }