From 3869ee1ecc141216aae4dc407b3a2bff45fc92a5 Mon Sep 17 00:00:00 2001 From: Bazsalanszky Date: Mon, 12 Aug 2019 21:17:49 +0200 Subject: [PATCH] fixed functions --- Vulkan/main.cpp | 139 +++++++++++++++++++++++++++++++++++++ Vulkan/shaders/compile.bat | 3 + Vulkan/shaders/frag.spv | Bin 0 -> 608 bytes Vulkan/shaders/shader.frag | 10 +++ Vulkan/shaders/shader.vert | 21 ++++++ Vulkan/shaders/vert.spv | Bin 0 -> 1540 bytes shaders/compile.bat | 3 + shaders/frag.spv | Bin 0 -> 608 bytes shaders/shader.frag | 10 +++ shaders/shader.vert | 21 ++++++ shaders/vert.spv | Bin 0 -> 1540 bytes 11 files changed, 207 insertions(+) create mode 100644 Vulkan/shaders/compile.bat create mode 100644 Vulkan/shaders/frag.spv create mode 100644 Vulkan/shaders/shader.frag create mode 100644 Vulkan/shaders/shader.vert create mode 100644 Vulkan/shaders/vert.spv create mode 100644 shaders/compile.bat create mode 100644 shaders/frag.spv create mode 100644 shaders/shader.frag create mode 100644 shaders/shader.vert create mode 100644 shaders/vert.spv diff --git a/Vulkan/main.cpp b/Vulkan/main.cpp index 03aa598..09b0c52 100644 --- a/Vulkan/main.cpp +++ b/Vulkan/main.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #define GLFW_INCLUDE_VULKAN #include @@ -42,6 +43,20 @@ struct SwapChainSupportDetails { std::vector presentModes; }; +static std::vector 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!"); + } + size_t fileSize = (size_t)file.tellg(); + std::vector buffer(fileSize); + file.seekg(0); + file.read(buffer.data(), fileSize); + file.close(); + + return buffer; +} VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) { @@ -94,6 +109,7 @@ private: std::vector swapChainImageViews; + VkPipelineLayout pipelineLayout; void initWindow() { glfwInit(); @@ -109,6 +125,7 @@ private: pickPhysicalDevice(); createLogicalDevice(); createSwapChain(); + createGraphicsPipeline(); } @@ -119,6 +136,7 @@ private: } void cleanup() { + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); for (auto imageView : swapChainImageViews) { vkDestroyImageView(device, imageView, nullptr); } @@ -507,8 +525,129 @@ private: } } } + void createGraphicsPipeline() { + auto vertShaderCode = readFile("shaders/vert.spv"); + auto fragShaderCode = readFile("shaders/frag.spv"); + VkShaderModule vertShaderModule = createShaderModule(vertShaderCode); + VkShaderModule fragShaderModule = createShaderModule(fragShaderCode); + + 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"; + + VkPipelineShaderStageCreateInfo fragShaderStageInfo = {}; + fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; + fragShaderStageInfo.module = fragShaderModule; + fragShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo shaderStages[] = { vertShaderStageInfo, fragShaderStageInfo }; + + + + VkPipelineVertexInputStateCreateInfo vertexInputInfo = {}; + vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + vertexInputInfo.vertexBindingDescriptionCount = 0; + vertexInputInfo.pVertexBindingDescriptions = nullptr; // Optional + vertexInputInfo.vertexAttributeDescriptionCount = 0; + vertexInputInfo.pVertexAttributeDescriptions = nullptr; // Optional + + VkPipelineInputAssemblyStateCreateInfo inputAssembly = {}; + inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + inputAssembly.primitiveRestartEnable = VK_FALSE; + + VkViewport viewport = {}; + viewport.x = 0.0f; + viewport.y = 0.0f; + viewport.width = (float)swapChainExtent.width; + viewport.height = (float)swapChainExtent.height; + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + + VkRect2D scissor = {}; + scissor.offset = { 0, 0 }; + scissor.extent = swapChainExtent; + + VkPipelineViewportStateCreateInfo viewportState = {}; + viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewportState.viewportCount = 1; + viewportState.pViewports = &viewport; + viewportState.scissorCount = 1; + viewportState.pScissors = &scissor; + + VkPipelineRasterizationStateCreateInfo rasterizer = {}; + rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + rasterizer.depthClampEnable = VK_FALSE; + rasterizer.rasterizerDiscardEnable = VK_FALSE; + rasterizer.polygonMode = VK_POLYGON_MODE_FILL; + + rasterizer.lineWidth = 1.0f; + rasterizer.cullMode = VK_CULL_MODE_BACK_BIT; + rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE; + + rasterizer.depthBiasEnable = VK_FALSE; + rasterizer.depthBiasConstantFactor = 0.0f; // Optional + rasterizer.depthBiasClamp = 0.0f; // Optional + rasterizer.depthBiasSlopeFactor = 0.0f; // Optional + + VkPipelineMultisampleStateCreateInfo multisampling = {}; + multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + multisampling.sampleShadingEnable = VK_FALSE; + multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + multisampling.minSampleShading = 1.0f; // Optional + multisampling.pSampleMask = nullptr; // Optional + multisampling.alphaToCoverageEnable = VK_FALSE; // Optional + multisampling.alphaToOneEnable = VK_FALSE; // Optional + + + VkPipelineColorBlendAttachmentState colorBlendAttachment = {}; + colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + colorBlendAttachment.blendEnable = VK_FALSE; + + VkPipelineColorBlendStateCreateInfo colorBlending = {}; + colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorBlending.logicOpEnable = VK_FALSE; + colorBlending.logicOp = VK_LOGIC_OP_COPY; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + colorBlending.blendConstants[0] = 0.0f; + colorBlending.blendConstants[1] = 0.0f; + colorBlending.blendConstants[2] = 0.0f; + colorBlending.blendConstants[3] = 0.0f; + + VkPipelineLayoutCreateInfo pipelineLayoutInfo = {}; + pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipelineLayoutInfo.setLayoutCount = 0; // Optional + pipelineLayoutInfo.pSetLayouts = nullptr; // Optional + pipelineLayoutInfo.pushConstantRangeCount = 0; // Optional + pipelineLayoutInfo.pPushConstantRanges = nullptr; // Optional + + if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) { + throw std::runtime_error("failed to create pipeline layout!"); + } + + + vkDestroyShaderModule(device, fragShaderModule, nullptr); + vkDestroyShaderModule(device, vertShaderModule, nullptr); + + } + VkShaderModule 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 shaderModule; + if (vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) { + throw std::runtime_error("failed to create shader module!"); + } + return shaderModule; + } + }; diff --git a/Vulkan/shaders/compile.bat b/Vulkan/shaders/compile.bat new file mode 100644 index 0000000..0928f72 --- /dev/null +++ b/Vulkan/shaders/compile.bat @@ -0,0 +1,3 @@ +glslc.exe shader.vert -o vert.spv +glslc.exe shader.frag -o frag.spv +pause \ No newline at end of file diff --git a/Vulkan/shaders/frag.spv b/Vulkan/shaders/frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..966c212f61f5d58a14bea19c0a8c0da73941a873 GIT binary patch literal 608 zcmYk2%SyvQ6o!vY)7IABEa*-uE`{PkMGzGg$tF-Q4=}`J)RCBkBo*BGY(AA6!T%o< z$-v2(^Urr~aawy_ku~YcP-gOXrqY5UGLVk-p8w!4iZWUp9vzSviDN-BV`R4BX>Wl^ z_^=M!fK9+rM+4j(R2BI`QX7QltIPW0pgHo&FC5Uvc(#KaFmIawU8E?7t{2LW! znJUVUSgY71T16%YW!^QpUV}497_Xux;DTt*=89|QOIPJ}8mBo%g5uhFpYq_j7CmHf zj~xOyjJZ=C&#(>m*|nRAy>H>(fi{P2gXi9i*?*3251xOH`e_xj2Q~72c=C+N58&~; ztWKUWXP~x^nCu89@_BKL9XJnr@vz1>6c_#sDr*m6%)f)m+;OGB{cDp-V~?7fRvPQy ZVtUTM31dEazH^RqbmcyL`@xhauwNUpJDmUk literal 0 HcmV?d00001 diff --git a/Vulkan/shaders/shader.frag b/Vulkan/shaders/shader.frag new file mode 100644 index 0000000..1730b4f --- /dev/null +++ b/Vulkan/shaders/shader.frag @@ -0,0 +1,10 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +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/Vulkan/shaders/shader.vert b/Vulkan/shaders/shader.vert new file mode 100644 index 0000000..0439d32 --- /dev/null +++ b/Vulkan/shaders/shader.vert @@ -0,0 +1,21 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) out vec3 fragColor; + +vec2 positions[3] = vec2[]( + vec2(0.0, -0.5), + vec2(0.5, 0.5), + vec2(-0.5, 0.5) +); + +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/Vulkan/shaders/vert.spv b/Vulkan/shaders/vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..1989c28edb6f2c880b40fd10e52d82faac810fad GIT binary patch literal 1540 zcmYk5>rd2B5XJ94y30dAM8F4P0mTQnq5?57Y7k5{*#wltuT9;pSW~;3wixx3|Cxz@ zm0wIezqWU?mkcxK%$eSqd+#>t8*O81rfp`-zA4wdsf#gY+O!Jqbx*sUEbn)A_jXXs znnoc+GiN4>xT*hNgD3&4%Qj_?WDWh*<^M?BG?T{b`Ume{`B^v&(jX80>~qi$Q-ARB zOW4aZG*f82<72P;+V2gAewP1;LqCp^(Ck6O6{z;gA2-7_LE-1F-iOE%;5Zf;FoI}A!Nq!pr zRCm;rIc8VxFph>tQI-cuFC67KMRMnHJjyvbFV2reKb)g9WixM+J{>U&XZtA)&JO8a z@f&fjJZrjiBaZ&y@K#4(aP(j~VmQvtQ^u7?=ZT>Ya`!9D{;M+9f>h|%RKqujmlU<+ zUD>kg^~efLZc&(58qD%=;Uk z;fk;^ztm5wsJ$u#N8gy`uT|LQEPs7WOAem>R%CpOIyCfqL!Q04Z+i#aX-&o*+>|E| zx2njMw>9K2?q*G%nOzxkf!Ael-1UaME33)a2YgG$qW-o#Ie6;9n-xd?u44M&4#6FH zzD+OSoeFc-)Ps4SXvja2r=I-2-U4rsnOSK5igDy$2=S)4TVn2pb9*i|z1@+~*MZdZ zbWesJ9u58R`+$EZ4SQ}?oZN`pt~h2sQ5ADMkf9~VJ#%;L!>kWwoF`{SUtsjMug8jQ aU(C8Iqjz{T%)KXrr=GI`|I?{ImHh|t<9I3n literal 0 HcmV?d00001 diff --git a/shaders/compile.bat b/shaders/compile.bat new file mode 100644 index 0000000..0928f72 --- /dev/null +++ b/shaders/compile.bat @@ -0,0 +1,3 @@ +glslc.exe shader.vert -o vert.spv +glslc.exe shader.frag -o frag.spv +pause \ No newline at end of file diff --git a/shaders/frag.spv b/shaders/frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..966c212f61f5d58a14bea19c0a8c0da73941a873 GIT binary patch literal 608 zcmYk2%SyvQ6o!vY)7IABEa*-uE`{PkMGzGg$tF-Q4=}`J)RCBkBo*BGY(AA6!T%o< z$-v2(^Urr~aawy_ku~YcP-gOXrqY5UGLVk-p8w!4iZWUp9vzSviDN-BV`R4BX>Wl^ z_^=M!fK9+rM+4j(R2BI`QX7QltIPW0pgHo&FC5Uvc(#KaFmIawU8E?7t{2LW! znJUVUSgY71T16%YW!^QpUV}497_Xux;DTt*=89|QOIPJ}8mBo%g5uhFpYq_j7CmHf zj~xOyjJZ=C&#(>m*|nRAy>H>(fi{P2gXi9i*?*3251xOH`e_xj2Q~72c=C+N58&~; ztWKUWXP~x^nCu89@_BKL9XJnr@vz1>6c_#sDr*m6%)f)m+;OGB{cDp-V~?7fRvPQy ZVtUTM31dEazH^RqbmcyL`@xhauwNUpJDmUk literal 0 HcmV?d00001 diff --git a/shaders/shader.frag b/shaders/shader.frag new file mode 100644 index 0000000..1730b4f --- /dev/null +++ b/shaders/shader.frag @@ -0,0 +1,10 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +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..0439d32 --- /dev/null +++ b/shaders/shader.vert @@ -0,0 +1,21 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) out vec3 fragColor; + +vec2 positions[3] = vec2[]( + vec2(0.0, -0.5), + vec2(0.5, 0.5), + vec2(-0.5, 0.5) +); + +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/vert.spv b/shaders/vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..1989c28edb6f2c880b40fd10e52d82faac810fad GIT binary patch literal 1540 zcmYk5>rd2B5XJ94y30dAM8F4P0mTQnq5?57Y7k5{*#wltuT9;pSW~;3wixx3|Cxz@ zm0wIezqWU?mkcxK%$eSqd+#>t8*O81rfp`-zA4wdsf#gY+O!Jqbx*sUEbn)A_jXXs znnoc+GiN4>xT*hNgD3&4%Qj_?WDWh*<^M?BG?T{b`Ume{`B^v&(jX80>~qi$Q-ARB zOW4aZG*f82<72P;+V2gAewP1;LqCp^(Ck6O6{z;gA2-7_LE-1F-iOE%;5Zf;FoI}A!Nq!pr zRCm;rIc8VxFph>tQI-cuFC67KMRMnHJjyvbFV2reKb)g9WixM+J{>U&XZtA)&JO8a z@f&fjJZrjiBaZ&y@K#4(aP(j~VmQvtQ^u7?=ZT>Ya`!9D{;M+9f>h|%RKqujmlU<+ zUD>kg^~efLZc&(58qD%=;Uk z;fk;^ztm5wsJ$u#N8gy`uT|LQEPs7WOAem>R%CpOIyCfqL!Q04Z+i#aX-&o*+>|E| zx2njMw>9K2?q*G%nOzxkf!Ael-1UaME33)a2YgG$qW-o#Ie6;9n-xd?u44M&4#6FH zzD+OSoeFc-)Ps4SXvja2r=I-2-U4rsnOSK5igDy$2=S)4TVn2pb9*i|z1@+~*MZdZ zbWesJ9u58R`+$EZ4SQ}?oZN`pt~h2sQ5ADMkf9~VJ#%;L!>kWwoF`{SUtsjMug8jQ aU(C8Iqjz{T%)KXrr=GI`|I?{ImHh|t<9I3n literal 0 HcmV?d00001