Vulkan错误:必须写gl_Position

时间:2018-05-17 15:04:21

标签: c++ vulkan

您好!

我已经按照本教程关于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的代码(包含着色器模块)

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

度过愉快的一天。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您是否忘记在着色器中为gl_position分配值?你的顶点着色器应该有一些像:

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

如果不是这样,您可以发布顶点着色器代码吗?