SPIR-V требует расположения пользователя на входе / выходе в Vulkan 1.0.51.1 +

Я установил последнюю версию Vulkan SDK на свой компьютер, но когда бы я ни захотел сгенерировать файлы SPIR-V для своих шейдеров через glslValidator.exe, он не работает и возвращает следующие ошибки

ERROR: Shader.vert:17: 'location' : SPIR-V requires location for user input/output
ERROR: 1 compilation errors.  No code generated.
ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
SPIR-V is not generated for failed compile or link

Я обнаружил, что после обновления 1.0.51.1 есть некоторые изменения, которые могут привести к сбою моих старых шейдеров

Требовать расположения на входе / выходе пользователя в GL_KHR_vulkan_glsl (внутренняя проблема 783).

Как правильно / новый способ исправить эту проблему?

вершинный шейдер

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(binding = 0)uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;


layout(location = 0)in vec3 inPosition;
layout(location = 1)in vec3 inNormals;
layout(location = 2)in vec2 inTexCoord;

layout(location = 0)out vec3 fragColor;
layout(location = 1)out vec2 fragTexCoord;
out vec4 Normal;

out gl_PerVertex{
    vec4 gl_Position;
};



void main()
{
    gl_Position = ubo.proj * ubo.view * ubo.model * vec4 (inPosition, 1.0);
    //fragColor = inColor;
    fragTexCoord = inTexCoord;
    Normal = ubo.proj * ubo.view * ubo.model * vec4 (inNormals, 1.0);
}

1 ответ

Решение

Я предполагаю, что Вам необходимо явно установить местоположение через спецификатор макета для всех Ваших переменных:

layout( location=<number> ) ...

Vulkan требует, чтобы все входные, выходные и равномерные переменные имели явно заданное значение местоположения. Сопоставление интерфейса между этапами шейдера выполняется только через значение местоположения (в отличие от OpenGL, где оно может выполняться как через имена, так и через местоположения). Я не уверен, так как всегда предоставлял значение местоположения, но, возможно, в более ранних версиях glslangValidator устанавливал их неявно (если местоположения отсутствовали).

Другие вопросы по тегам