SPIR-V要求用户在Vulkan 1.0.51.1 +中输入/输出位置

时间:2017-09-03 18:37:25

标签: glsl shader vulkan spir-v

我在我的计算机上安装了最新的Vulkan SDK,无论何时我想通​​过glslValidator.exe为我的着色器生成SPIR-V文件,它都会失败并返回以下错误

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 个答案:

答案 0 :(得分:0)

我假设您需要通过布局限定符为所有变量显式设置位置:

layout( location=<number> ) ...

Vulkan要求所有输入,输出和统一变量都具有明确提供的位置值。着色器阶段之间的接口匹配仅通过位置值执行(与OpenGL相反,可以通过两个名称或位置执行)。我不确定,因为我总是提供位置值,但可能在早期版本中glslangValidator隐式设置它们(如果缺少位置)。