Vulkan ошибка: необходимо написать gl_Position - PullRequest
0 голосов
/ 17 мая 2018

Здравствуйте!

Я следовал этому уроку о Вулкане: 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 голосов
/ 24 мая 2018

Возможно, вы забыли присвоить значение gl_position в своем шейдере?Ваш вершинный шейдер должен иметь несколько строк вроде:

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

Если это не так, не могли бы вы опубликовать свой код вершинного шейдера?

0 голосов
/ 17 мая 2018

Маловероятно, что код ввода-вывода файла как-то связан с этой ошибкой. Похоже, вы не присоединяете вершинный шейдер к конвейеру или неправильно скомпилировали GLSL для вершинного шейдера.

При компиляции GLSL в Spir-V ваш входной файл вершинного шейдера должен иметь расширение .vert или вам нужно указать в командной строке, что вы компилируете вершинный шейдер. При построении графического конвейера вам нужно, как минимум, добавить два шейдерных модуля, один вершинный шейдер и один фрагментный шейдер, каждый из которых использует vk::PipelineShaderStageCreateInfo, чтобы обернуть создаваемые вами шейдерные модули.

...