假设我有一个以#version 120
开头的片段着色器和一个带#version 150 compatibility
的顶点着色器。这种组合似乎适用于AFAICT,但它是否违反了OpenGL或GLSL规范?我找不到任何讨论此问题的信息。如果确实没有,我应该把它当作“不被禁止”或“未被批准”吗?
答案 0 :(得分:4)
不,不要求着色器版本匹配。要求配置文件匹配,但实际上只涉及混合桌面和嵌入式GLSL。这在GLSL规范中进行了简要讨论,但没有充分讨论混合不同着色器版本的兼容配置文件的含义。
声明不同版本的核心或兼容性配置文件的着色器可以链接在一起。但是,es配置文件着色器无法与非es配置文件着色器或不同版本的es配置文件着色器链接,否则将导致链接时错误。链接这些规则允许的版本着色器时, 剩余的链接时错误将根据GLSL版本中的链接规则给出,该版本对应于着色器链接的上下文版本。必须严格根据每个着色器中声明(或默认为)的版本给出着色器编译时错误。
然而,您将遇到语法差异,这可能会在1.20和1.50之间变得笨拙。例如,150 compatibility
了解为着色器阶段I / O使用in
和out
声明的变量,其中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版本中的链接规则给出 对应于着色器链接的上下文版本 下。还必须严格基于着色器编译时错误 在每个着色器中声明(或默认为)的版本。