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

4
假设我有一个以#version 120开始的片段着色器和一个带有#version 150 compatibility的顶点着色器。据我所知,这种组合似乎可以工作,但它是否违反了OpenGL或GLSL规范?我找不到任何讨论此问题的信息。如果确实没有,那么我应该将其视为“未被禁止”还是“未获批准”?
2个回答

5
没有要求着色器版本必须匹配。有一个要求,即配置文件必须匹配,但这实际上只涉及混合桌面和嵌入式GLSL。这在GLSL规范中简要讨论,但是混合不同版本的兼容配置文件的着色器的影响并没有完全讨论。
核心或兼容性配置文件的着色器可以链接在一起声明不同版本。但是,es配置文件着色器不能与非-es配置文件着色器或不同版本的es配置文件着色器链接,否则将导致链接时错误。当链接符合这些规则允许的版本的着色器时,剩余的链接时错误将按照着色器链接到的上下文版本对应的GLSL版本的链接规则给出。着色器编译时错误仍必须严格根据每个着色器中声明(或默认)的版本给出。
您将会遇到语法差异,可能会在1.20和1.50之间变得混乱难懂。例如,150 compatibility 理解着色器阶段的 inout 声明变量的使用,而 120 必须将其声明为 attributevarying。在1.20版本的顶点着色器中,varying 可以将数据传递给1.50版本片段着色器中同名的 in 变量,尽管语法不同。

当您更改着色器版本时,某些函数的行为也可能会发生微小的变化。例如,GLSL 1.30 不再支持 GL_DEPTH_TEXTURE_MODE 并始终返回 rrrr ... 如果您从1.20版本的顶点着色器和1.50版本的片段着色器中采样深度纹理,则可能会得到不同的 gba 部分结果。这种情况并不常见,但需要注意。


4
在同一个程序中混合使用#version 120#version 150 compatibility是被允许的。请允许我引用GLSL 4.50规范,第3.3节“预处理”(重点是我的):

核心或兼容性配置文件的着色器可以声明不同的版本并链接在一起。然而,es配置文件的着色器不能与非-es配置文件的着色器或不同版本的es配置文件的着色器链接,否则将导致链接时错误。在链接遵循这些规则允许的版本的着色器时,其余的链接时错误将根据所链接的上下文的版本对应的GLSL版本的链接规则进行报告。着色器编译时错误仍必须严格基于每个着色器声明的(或默认的)版本给出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接