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

时间:2015-06-19 16:52:03

标签: opengl version shader

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

2 个答案:

答案 0 :(得分:4)

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

OpenGL Shading Language 4.50  -  3.3 Preprocessor  -  p. 14

  

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

然而,您将遇到语法差异,这可能会在1.20和1.50之间变得笨拙。例如,150 compatibility了解为着色器阶段I / O使用inout声明的变量,其中120必须将这些变量声明为attribute或{ {1}}。尽管语法不同,1.20顶点着色器中的varying可以将数据传递到1.50片段着色器中的同名varying变量。

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

答案 1 :(得分:3)

允许在同一程序中混合使用#version 120#version 150 compatibility。让我引用GLSL 4.50 specification,第3.3节“预处理器”(强调我的):

  

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