diff --git a/VulkanTutorial.cpp b/VulkanTutorial.cpp index 2181801..846a615 100644 --- a/VulkanTutorial.cpp +++ b/VulkanTutorial.cpp @@ -111,6 +111,8 @@ void HelloTriangleApplication::initVulkan() { createSwapChain(); creatImageView(); + + createGraphicPipeline(); } @@ -561,6 +563,74 @@ void HelloTriangleApplication::creatImageView() } } +std::vector HelloTriangleApplication::readFile(const std::string& filename) +{ + std::ifstream file(filename, std::ios::ate | std::ios::binary); + + if (!file.is_open()) + { + throw std::runtime_error("failed to open file!"); + } + + rsize_t fileSize = (rsize_t)file.tellg(); + std::vector buffer(fileSize); + + file.seekg(0); + file.read(buffer.data(), fileSize); + file.close(); + return buffer; + +} + +VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector code) +{ + VkShaderModuleCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + createInfo.codeSize = code.size(); + createInfo.pCode = reinterpret_cast(code.data()); + + VkShaderModule shaderModeul; + if (vkCreateShaderModule(device,&createInfo,nullptr,&shaderModeul) != VK_SUCCESS) + { + throw std::runtime_error("failed to create shader module!"); + } + + return shaderModeul; + +} + + +void HelloTriangleApplication::createGraphicPipeline() +{ + auto vertShaderCode = readFile("../../../shaders/triangleVert.spv"); + auto fragShaderCode = readFile("../../..//shaders/triangleFrag.spv"); + + std::cout << "vertShader size:" << vertShaderCode.size() << "\nfragShader size:" << fragShaderCode.size() << std::endl; + + VkShaderModule vertShaderModule = createShaderModule(vertShaderCode); + VkShaderModule fragShaderModule = createShaderModule(fragShaderCode); + + //指定管线vertex阶段 + VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; + vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + //指定模块和入口点 + vertShaderStageInfo.module = vertShaderModule; + vertShaderStageInfo.pName = "main"; + //指定管线fragment阶段 + VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; + fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + fragShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + fragShaderStageInfo.module = fragShaderModule; + fragShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo shaderStages[] = { vertShaderStageInfo,fragShaderStageInfo }; + + + //管道创建完成后销毁着色器模块 + vkDestroyShaderModule(device, fragShaderModule, nullptr); + vkDestroyShaderModule(device, vertShaderModule, nullptr); +} bool HelloTriangleApplication::checkValidationLayerSupport() { diff --git a/VulkanTutorial.h b/VulkanTutorial.h index df26063..90e15a8 100644 --- a/VulkanTutorial.h +++ b/VulkanTutorial.h @@ -19,6 +19,8 @@ #include #include +#include + VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,const VkAllocationCallbacks* pAllocator,VkDebugUtilsMessengerEXT* pDebugMessenger); @@ -124,6 +126,10 @@ private: void creatImageView(); + void createGraphicPipeline(); + + static std::vector readFile(const std::string& filename); + }; HelloTriangleApplication::HelloTriangleApplication() diff --git a/shaders/shaderCompile.bat b/shaders/shaderCompile.bat new file mode 100644 index 0000000..c56aae6 --- /dev/null +++ b/shaders/shaderCompile.bat @@ -0,0 +1,3 @@ +E:\vulkanSDK\Bin\glslc.exe triangle.vert -o triangleVert.spv +E:\vulkanSDK\Bin\glslc.exe triangle.frag -o triangleFrag.spv +pause \ No newline at end of file diff --git a/shaders/triangle.frag b/shaders/triangle.frag new file mode 100644 index 0000000..a9fa08d --- /dev/null +++ b/shaders/triangle.frag @@ -0,0 +1,10 @@ +#version 450 + +layout(location = 0) out vec4 outColor; + +layout(location = 0) in vec3 fragColor; + +void main(){ + outColor = vec4(fragColor,1.0); + +} \ No newline at end of file diff --git a/shaders/triangle.vert b/shaders/triangle.vert new file mode 100644 index 0000000..e352619 --- /dev/null +++ b/shaders/triangle.vert @@ -0,0 +1,20 @@ +#version 450 + +layout(location = 0) out vec3 fragColor; + +vec2 positions[3] = vec2[]( + vec2(0.0f, -0.5f), + vec2(0.5f, 0.5f), + vec2(-0.5f, 0.5f) +); + +vec3 colors[3] = vec3[]( + vec3(1.0,0.0,0.0), + vec3(0.0,1.0,0.0), + vec3(0.0,0.0,1.0) +); + +void main(){ + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); + fragColor = colors[gl_VertexIndex]; +} \ No newline at end of file diff --git a/shaders/triangleFrag.spv b/shaders/triangleFrag.spv new file mode 100644 index 0000000..da37f7e Binary files /dev/null and b/shaders/triangleFrag.spv differ diff --git a/shaders/triangleVert.spv b/shaders/triangleVert.spv new file mode 100644 index 0000000..a41dd2c Binary files /dev/null and b/shaders/triangleVert.spv differ