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

时间:2011-01-12 05:50:40

标签: opengl shader opengl-3 opengl-4

在花哨的新版OpenGL(3.0和4.0版)中,内置顶点属性(如gl_Vertex)已被弃用。实际渲染任何东西的“新方法”是为位置,颜色等指定自己的顶点属性,然后将这些自定义属性绑定到缓冲区。

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

但是......它比属性名称更复杂。隐藏在问题之下的是属性语义的概念。每个输入属性都有某种形式的语义,每个着色器都需要这些语义。

我从固定的gl_名称中学到的是,他们指定了他们的语义。

  • gl_Position在哪个空格? (回答:它完全取决于主机传入的内容。引擎不必传入本地空间,例如,如果由于不同原因需要世界空间,它已经转换了它。)
  • 是gl_TexCoord1一个纹理坐标,还是一个切线?它的范围怎么样?是编码吗?

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

更有问题的是,特定引擎(或特定资产)能够提供来自不同引擎的着色器所需的特定属性,这一点并不明显。那么呢?

这些都是我们最终使用balkanized着色器环境的原因。

答案 2 :(得分:0)

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