如何编写现代OpenGL着色器以便彼此兼容?

int*_*ect 6 opengl shader opengl-3 opengl-4

在新的OpenGL版本(3.0和4.0版本)中,不推荐使用gl_Vertex等内置顶点属性.实际渲染任何东西的"新方法"是为位置,颜色等指定自己的顶点属性,然后将这些自定义属性绑定到缓冲区.

我的问题是:如果不将渲染代码和着色器紧密耦合,怎么能做到这一点?如果我编写一个使用"position"作为顶点位置的着色器,使用着色器的主代码必须知道并将顶点数据作为"position"传递.如果我想使用写入的不同着色器来获取"vertex_pos"中的顶点数据,我必须首先重写该着色器,或者修改我的主机代码以将顶点数据发送为"vertex_pos".

是否有一组所有着色器应使用的标准顶点和片段属性的最佳实践名称?或者是否存在Balkanized引擎特定标准,以便为一个引擎编写的着色器无法在没有修改的情况下在另一个引擎上工作?或者根本没有标准,一般来说,每个对象都需要自己的自定义渲染代码来匹配其自定义着色器?

dat*_*olf 3

就继续叫他们旧名字吧。如果您有核心配置文件(即没有向后兼容性),则旧 GLSL 规范的保留名称将被释放并声明为不可用;重新声明它们以绑定顶点属性。似乎改变了他们的可用性属性。在兼容性配置文件中,这些变量名称是预先分配和绑定的。

所以归结为:在着色器中保留旧的命名是一种方便,并且似乎可以与当前的 GLSL 编译器一起使用。如果您想安全起见,请使用预处理器将gl_前缀保留名称重写为自选前缀并绑定该前缀。

  • 事实上,事实并非如此。GLSL 保留**任何**以“gl_”开头的名称。如果核心编译器允许您使用“gl_Vertex”,那么它不符合规范。1.50 规范澄清了重新声明语法仅对更改声明类型的属性有效。所以它也不应该允许你重新声明它们。 (2认同)