0

尽管我对着色器在渲染管道中的位置有基本的了解,但我对着色器的实际编写知之甚少。我有一个从这里这里获得的 CG 着色器。我正在尝试将这些着色器转换为 GLSL。我浏览了参考文档,发现语言非常相似,并根据可用的方法和语法转换了所有明显的位。但是,我对参数的默认值有一些问题。基于此网页,该行:

float4 iPos     : POSITION,

, 表示它通过“语义”设置默认值。这是我开始迷路的地方。除非我遗漏了什么,否则在 GLSL 中似乎没有同样的东西。我不明白 GLSL 中最接近的并行是什么,或者它对转换工作意味着什么。转换着色器时如何正确考虑这一点?

4

1 回答 1

1

在 Cg 中,语义是一种使用某些内置的固定功能属性和变量来别名属性和变量的方法。Cg 属性首先只是一个没有任何语义的通用顶点属性。但是在 OpenGL 中(嗯,只有在旧的和不推荐使用的 OpenGL 中)你有某些固定的函数属性,它们带有,嗯,语义。例如,顶点位置用glVertexor设置glVertexPointer,而顶点的法线用glNormalor设置glNormalPointer。通过为以前普通的通用属性赋予语义POSITIONNORMAL在 Cg 中,您可以使其从此类固定功能属性通道中获取其值。

在 GLSL 中,反过来有内置的顶点属性变量,其中包含已弃用的固定函数属性的值,例如gl_Vertexgl_Normal, ... 用于位置、法线和其他语义。但就像所说的那样,那些固定功能的属性通道实际上已被弃用,并且不鼓励在现代 OpenGL 中使用它们(甚至在核心配置文件中禁止使用)。你应该使用的是通用顶点属性,用glVertexAttrib和设置glVertexAttribPointer。这些不带有实际的语义,只能通过着色器以特定方式使用它们来获取它们的语义。但是,如果您需要将较旧的应用程序从 Cg 移植到 GLSL,那么使用不推荐使用的内置属性(如gl_Vertexorgl_Normal等​​)是 Cg 的属性语义(如POSITIONor )的最佳替代品NORMAL

同样,某些变量具有特殊含义并且需要特殊处理,例如剪辑空间位置(语义POSITION?)。这些对应于您可以在顶点着色器中写入的特殊变量,就像gl_Position在这种情况下一样。在已弃用的 OpenGL 中,还有其他可变变量可以写入并对应于某些固定函数变量,例如gl_TexCoord[i]语义TEXCOORDi。使用这些时,您可以轻松地将着色器与固定功能阶段接口,例如使用顶点着色器但固定功能片段处理。

所以总结一下,这些Cg语义实际上对应于GLSL中特殊的预定义属性和可变变量。但是在现代 OpenGL 中,所有这些特殊的顶点属性和大多数特殊的可变变量都不存在了。但我建议您首先深入研究 GLSL 和 Cg 在实践中的工作原理,因为正如您所见,在这两者之间进行移植并不像替换一些关键字那么简单。

于 2013-07-02T10:39:27.637 回答