完成图像关系中着色器模块创建

master
InkSoul 2024-03-01 23:28:51 +08:00
parent 9a189740e3
commit b6a7ed9d6d
7 changed files with 109 additions and 0 deletions

View File

@ -111,6 +111,8 @@ void HelloTriangleApplication::initVulkan() {
createSwapChain();
creatImageView();
createGraphicPipeline();
}
@ -561,6 +563,74 @@ void HelloTriangleApplication::creatImageView()
}
}
std::vector<char> 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<char> buffer(fileSize);
file.seekg(0);
file.read(buffer.data(), fileSize);
file.close();
return buffer;
}
VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector<char> code)
{
VkShaderModuleCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
createInfo.codeSize = code.size();
createInfo.pCode = reinterpret_cast<const uint32_t*>(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() {

View File

@ -19,6 +19,8 @@
#include <limits>
#include <algorithm>
#include <fstream>
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,const VkAllocationCallbacks* pAllocator,VkDebugUtilsMessengerEXT* pDebugMessenger);
@ -124,6 +126,10 @@ private:
void creatImageView();
void createGraphicPipeline();
static std::vector<char> readFile(const std::string& filename);
};
HelloTriangleApplication::HelloTriangleApplication()

View File

@ -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

View File

@ -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);
}

View File

@ -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];
}

Binary file not shown.

Binary file not shown.