嵌入式 spv 着色器在 运行 程序时抛出错误

Embeded spv shaders throws error while running program

我正在尝试通过添加 there 将我的 hello 三角形程序的 spv 着色器包含在可执行文件中。当我 运行 程序时,我得到以下断言,从 debug_heap.cpp:

抛出

Expression: is_block_type_valid(header->block_use)

这是我的代码:

Shaders.h:

#pragma once

const unsigned char triangle_frag_spv[] = {/* shader code */};
const unsigned triangle_frag_spv_size = sizeof(triangle_frag_spv);
const unsigned char triangle_vert_spv[] = {/* shader code */};
const unsigned triangle_vert_spv_size = sizeof(triangle_vert_spv);

注意: 我去掉了着色器的代码,因为它很长。

如果您想查看它,请转至 Sascha Willems' Vulkan Samples 并复制 SPV 的十六进制值。

main.cpp:

#include <vulkan/vulkan.h>

#include "shaders.h"

extern "C" const unsigned char triangle_vert_spv[];
extern "C" const unsigned char triangle_frag_spv[];
extern "C" const unsigned triangle_vert_spv_size;
extern "C" const unsigned triangle_frag_spv_size;

...

std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages{};

shaderStages[0].module = loadSPIRVShader(triangle_vert_spv, triangle_vert_spv_size);
shaderStages[1].module = loadSPIRVShader(triangle_frag_spv, triangle_frag_spv_size);

...

VkShaderModule loadSPIRVShader(const unsigned char shaderCode[], const unsigned shaderSize)
{
    VkShaderModuleCreateInfo moduleCreateInfo{};
    moduleCreateInfo.sType    = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
    moduleCreateInfo.codeSize = shaderSize;
    moduleCreateInfo.pCode    = (uint32_t *) shaderCode;

    VkShaderModule shaderModule;
    VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));

    delete[] shaderCode;

    return shaderModule;
}

那么将着色器嵌入我的可执行文件并引用它们的正确方法是什么?

您正在 delete[]ing 静态变量。那是无效的事情。

传递 arr[] 就像传递指针一样。如果您对 C 数组感到困惑(这是可以理解的),请尝试使用 std::arrays。