GLSL/Vulkan规范是否允许像素着色器输入与顶点着色器输出不匹配?
管线阶段接口不匹配的GLSL/Vulkan规范说明
测试代码
// 顶点着色器(VS) #version 450 layout(location = 0) in vec4 inPosition; layout(location = 0) out struct { vec2 dummy; uvec4 variableInStruct; } testStruct; void main(void) { gl_Position = inPosition; testStruct.variableInStruct = uvec4(4, 16, 64, 256); } // 像素着色器(PS) #version 450 layout(location = 0) out vec4 fragColor; layout(location = 0) in flat struct { vec2 dummy; uvec2 variableInStruct; } testStruct; void main(void) { float result = 0.0; result = float(testStruct.variableInStruct.x == 4) * float(testStruct.variableInStruct.y == 16); fragColor = vec4(result); }
规范要求与合法性判断
- Vulkan规范:管线各阶段间的接口必须严格匹配。顶点着色器的输出与像素着色器的输入,在对应
location下的变量类型、修饰符(如flat)、分量数量都必须完全一致。你示例中VS输出uvec4而PS输入uvec2的情况,属于违反接口兼容性规则,是不合法的。 - GLSL规范:跨阶段的接口结构体要求成员的类型、数量、布局修饰符完全对应。接口匹配基于成员的顺序和定义,成员数量或类型不匹配会导致接口不兼容,属于未定义行为。
部分硬件可运行的原因
NVIDIA等厂商的驱动可能做了非规范的兼容处理:当PS仅读取VS输出的前N个分量时,驱动自动截断后续数据。但这种行为是厂商特定的,不具备跨硬件兼容性,在AMD、Intel等其他平台上可能出现数据错误、管线创建失败等问题。
内容的提问来源于stack exchange,提问作者Rahn
相关产品推荐
相关产品推荐

