顶点和片段着色器版本是否应该始终匹配?

Rus*_*lan 4 opengl shader version

假设我有一个以 开头的片段着色器#version 120和一个以#version 150 compatibility. 这种组合似乎适用于 AFAICT,但它是否违反 OpenGL 或 GLSL 规范?我找不到任何讨论这个问题的信息。如果确实没有,我应该将其视为“未禁止”还是“未批准”?

And*_*man 5

不,不要求着色器版本匹配。需要配置文件匹配,但这实际上只与混合桌面和嵌入式 GLSL 相关。这在 GLSL 规范中进行了简要讨论,但没有充分讨论混合不同着色器版本的兼容配置文件的含义。

OpenGL 着色语言 4.50 - 3.3 预处理器 - p。14

声明不同版本的核心或兼容性配置文件的着色器可以链接在一起。但是,es profile shader 不能与非es profile shader 或不同版本的es profile shader 链接,否则会导致链接时错误。当链接这些规则允许的版本的着色器时,将根据与着色器链接的上下文版本相对应的 GLSL 版本中的链接规则给出剩余的链接时错误。着色器编译时错误仍然必须严格基于每个着色器中声明(或默认为)的版本。

但是,您会遇到语法差异,这些差异可能会在 1.20 和 1.50 之间变得一团糟。例如,150 compatibility了解着色器阶段 I/O的使用inout声明的变量,其中 as120必须将这些声明为attributevaryingvarying1.20 顶点着色器中的A可以将数据传递给in尽管语法不同1.50 片段着色器中的同名变量。

当您更改着色器版本时,某些功能的行为也可能会有细微的变化。例如,GLSL 1.30 停止尊重GL_DEPTH_TEXTURE_MODE并始终返回rrrr……如果您从 1.20 顶点着色器中采样深度纹理,然后再次从 1.50 片段着色器中采样,则结果的gba一部分很可能会得到不同的结果。这种事情并不常见,但需要记住。