在 Cg 中,语义是一种使用某些内置的固定功能属性和变量来别名属性和变量的方法。Cg 属性首先只是一个没有任何语义的通用顶点属性。但是在 OpenGL 中(嗯,只有在旧的和不推荐使用的 OpenGL 中)你有某些固定的函数属性,它们带有,嗯,语义。例如,顶点位置用glVertex
or设置glVertexPointer
,而顶点的法线用glNormal
or设置glNormalPointer
。通过为以前普通的通用属性赋予语义POSITION
或NORMAL
在 Cg 中,您可以使其从此类固定功能属性通道中获取其值。
在 GLSL 中,反过来有内置的顶点属性变量,其中包含已弃用的固定函数属性的值,例如gl_Vertex
,gl_Normal
, ... 用于位置、法线和其他语义。但就像所说的那样,那些固定功能的属性通道实际上已被弃用,并且不鼓励在现代 OpenGL 中使用它们(甚至在核心配置文件中禁止使用)。你应该使用的是通用顶点属性,用glVertexAttrib
和设置glVertexAttribPointer
。这些不带有实际的语义,只能通过着色器以特定方式使用它们来获取它们的语义。但是,如果您需要将较旧的应用程序从 Cg 移植到 GLSL,那么使用不推荐使用的内置属性(如gl_Vertex
orgl_Normal
等)是 Cg 的属性语义(如POSITION
or )的最佳替代品NORMAL
。
同样,某些变量具有特殊含义并且需要特殊处理,例如剪辑空间位置(语义POSITION
?)。这些对应于您可以在顶点着色器中写入的特殊变量,就像gl_Position
在这种情况下一样。在已弃用的 OpenGL 中,还有其他可变变量可以写入并对应于某些固定函数变量,例如gl_TexCoord[i]
语义TEXCOORDi
。使用这些时,您可以轻松地将着色器与固定功能阶段接口,例如使用顶点着色器但固定功能片段处理。
所以总结一下,这些Cg语义实际上对应于GLSL中特殊的预定义属性和可变变量。但是在现代 OpenGL 中,所有这些特殊的顶点属性和大多数特殊的可变变量都不存在了。但我建议您首先深入研究 GLSL 和 Cg 在实践中的工作原理,因为正如您所见,在这两者之间进行移植并不像替换一些关键字那么简单。