From b6a7ed9d6d0cf8358958b4dc5d3f4327feccea86 Mon Sep 17 00:00:00 2001 From: InkSoul Date: Fri, 1 Mar 2024 23:28:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9B=BE=E5=83=8F=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E4=B8=AD=E7=9D=80=E8=89=B2=E5=99=A8=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VulkanTutorial.cpp | 70 ++++++++++++++++++++++++++++++++++++++ VulkanTutorial.h | 6 ++++ shaders/shaderCompile.bat | 3 ++ shaders/triangle.frag | 10 ++++++ shaders/triangle.vert | 20 +++++++++++ shaders/triangleFrag.spv | Bin 0 -> 572 bytes shaders/triangleVert.spv | Bin 0 -> 1504 bytes 7 files changed, 109 insertions(+) create mode 100644 shaders/shaderCompile.bat create mode 100644 shaders/triangle.frag create mode 100644 shaders/triangle.vert create mode 100644 shaders/triangleFrag.spv create mode 100644 shaders/triangleVert.spv 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 0000000000000000000000000000000000000000..da37f7ede672fe162b5322c32f5938a7836409a7 GIT binary patch literal 572 zcmYk2PfNo<6vUrx)7IAhv!FMrcod2U6+zU4NG^dYet=MtD1q3NHWj@2+5A*q1n0LV z(uK*}H#=`OEEHA71Yeo8+BI6MPEqd}+{a8uKdhAl0+aGA( z6gLqLrRPob_)qk0tMXUiuge|}IP@J=^z`Vvs`?d4G32BH#;R0mT<^MFnDF)EG3?WD_tXer-10N+zk@OW-Q!$6U%CCwBbK=EWe5;z^DZB6pD_lbols z;A~j*!x>3aHS;kY(h;+8ZeOy&`7ymK{vghmXU$b^!qFcb-s$KIjvgFG49B?z%J}l= z0x|SK?oo}|e?!JvmI~dbYWN26s-mvEFI!W+9#DzNtqAiXd>L!E#+MXRzb-s0PYs+e z%-(zt{$-81PdMuF^D>sh3l;pmr?cT(i!wCuPIE=E)*Gi;5`e=TcU3Vp71u3$SQh4c z=*ctVHF^4QGps0vb2F^gd3a_3^ZuGMTo*Rxm-^|JwKs&|=o@qV%^JI$<8L*zhH;ugQp(6Q*-1WD5ekY5ZsgJ+w=n7uQ6v$J(%~2hWvAR>d7DJE${}JnT6)B z7*GDS5O0dRCFX88w^vfr+kF{*y_K4t9?H(LSvj4QYY=-~< literal 0 HcmV?d00001