2011-01-12 45 views
5

在新版本的OpenGL(3.0和4.0)中,内置顶点属性(如gl_Vertex)将被弃用。实际渲染任何东西的“新方法”是为位置,颜色等指定自己的顶点属性,然后将这些自定义属性绑定到缓冲区。应该如何编写现代OpenGL着色器以便相互兼容?

我的问题是:如何在不紧密耦合渲染代码和着色器的情况下做到这一点?如果我编写一个使用“位置”作为顶点位置的着色器,则使用着色器的主机代码必须知道并将顶点数据作为“位置”传递。如果我想使用不同的着色器来写入“vertex_pos”中的顶点数据,我必须首先重写该着色器,或者修改我的主机代码来将顶点数据发送为“vertex_pos”。

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

回答

3

只要不断称他们为旧名称。如果您拥有核心配置文件(即无向后兼容性),旧版GLSL规格的保留名称是,释放,声明为不可用;重新声明它们的绑定顶点属性。似乎改变他们的可用性属性。在兼容性配置文件中,这些变量名称是预分配和绑定的。

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

+2

其实并非如此。 GLSL保留**以“gl_”开头的任何**名称。如果核心编译器允许使用“gl_Vertex”,那么它不符合规范。 1.50规范将重新声明语法阐明为仅对声明类型的属性进行更改有效。所以它不应该让你重新声明它们。 – 2011-06-11 21:54:16

+0

@Nicol:现在这里开始语言lawery:有些人可能会看到不赞成的变量名称作为预定义的标识符从兼容性配置文件,并在1.50 GLSL程序中使用它们是一个属性更改重新声明;恕我直言规范不清楚这一点,虽然§#版本#3.3似乎表明核心的意思是“没有兼容性名称可用”。如果想要安全,他可以使用预处理程序`#define gl_Vertex glVertex`并在核心配置文件中使用该名称。 – datenwolf 2011-06-11 22:18:08

1

首先,回答你的问题。我不知道任何这样的标准命名约定。

但是...它比属性名称更复杂。这个问题隐藏的是属性语义的概念。每个输入属性都具有某种形式的每个着色器所期望的语义。

我从固定的gl_名字中学到的是他们低于他们的语义。

  • 哪个空间是gl_Position? (回答:它完全取决于主机通过什么东西。引擎不必传入本地空间,例如,如果它已经转换它,因为它需要世界空间出于不同的原因)。
  • gl_TexCoord1是一个纹理坐标,还是真的是一个切线?它的范围呢?它是否被编码?

目前还不清楚是否可以找到真正解决所有这些问题的特定术语,但需要使各种引擎兼容。

更有问题的是,特定的引擎(或特定的资产)能够提供来自不同引擎的着色器所需的特定属性的能力并不明显。然后怎样呢 ?

这些都是我们为什么最终选择了巴尔干化shader环境的原因。

0

请参阅我的question以获取属性/统一语义的可能实现列表。即使使用OpenGL 3.4,我也担心这个问题不会得到解决,您几乎可以在自己的设备上定义着色器和代码之间的契约。