嵌入式 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::array
s。
我正在尝试通过添加 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::array
s。