7

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

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

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

4

3 回答 3

3

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

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

于 2011-01-12T08:43:15.280 回答
1

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

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

我从固定的 gl_ 名称中学到的是,它们未充分说明其语义。

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

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

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

这些都是我们最终得到巴尔干着色器环境的原因。

于 2011-01-12T09:54:49.753 回答
0

有关属性/统一语义的可能实现列表,请参阅我的问题。恐怕即使使用 OpenGL 3.4,这个问题也不会得到解决,您几乎只能依靠自己的设备来定义着色器和代码之间的合同。

于 2011-06-13T11:33:49.813 回答