Vulkan error: must write gl_Position

Vulkan error: must write gl_Position

您好!

我已遵循有关 Vulkan 的教程:https://vulkan-tutorial.com。但问题是,当我启动我的应用程序时,出现了这个错误:

Validation layer: Vertex info
-----------
(0) : error C5145: must write to gl_Position

Failed to create graphics pipeline

当图形管道也被创建时会发生这种情况。 我只找到了 OpenGL 的答案,但没有找到 Vulkan 的答案。 我试图重写读取文件的代码,但什么也没有。 这里的代码VkShader.cpp(包含Shader Module)

IOManager::FIOManagerFile shaderCode = IOManager::ReadBinaryFile(filename);

vk::ShaderModuleCreateInfo createInfo = vk::ShaderModuleCreateInfo()
    .setCodeSize(shaderCode.Size)
    .setPCode(reinterpret_cast<const uint32*>(shaderCode.Contents));

if (context->GetDevice().createShaderModule(&createInfo, nullptr, &ShaderModule) != vk::Result::eSuccess)
{
    throw std::runtime_error("Failed to create shader module for shader " + filename);
}

和IOManager.h

struct FIOManagerFile
{
    size_t Size;
    char* Contents;
};

static inline FIOManagerFile ReadBinaryFile(const std::string& filename)
{
    std::ifstream file(filename, std::ios::ate | std::ios::in | std::ios::binary);

    if (file.is_open())
    {
        size_t fileSize = (size_t)file.tellg();
        char *buffer = new char[fileSize];
        file.seekg(0, std::ios::beg);
        file.read(buffer, fileSize);
        file.close();

        FIOManagerFile f;
        f.Size = fileSize;
        f.Contents = buffer;
        return f;
    }
    else
    {
        throw std::runtime_error("Failed to open file " + filename);
    }
}

祝你有愉快的一天。

文件 IO 代码不太可能与此错误有关。听起来您没有将顶点着色器附加到管道,或者您为顶点着色器编译的 GLSL 不正确。

将 GLSL 编译为 Spir-V 时,您的顶点着色器输入文件应具有扩展名 .vert,或者您需要在命令行中指定您正在编译顶点着色器。在构建图形管道时,您至少需要添加两个着色器模块,一个顶点着色器和一个片段着色器,每个着色器都使用 vk::PipelineShaderStageCreateInfo 来包装您正在创建的着色器模块。

您是否忘记了在着色器中为 gl_position 赋值?你的顶点着色器应该有一些像这样的行:

void main() {
      gl_Position = mvp * vec4(inPosition, 1.0);
}

如果不是这样,你能post你的顶点着色器代码吗?