You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:12:05