【问题标题】:Default parameter values via semantics in GLSLGLSL 中通过语义的默认参数值
【发布时间】:2026-01-19 01:00:01
【问题描述】:

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

float4 iPos     : POSITION,

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

【问题讨论】:

    标签: glsl shader cg


    【解决方案1】:

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

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

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

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

    【讨论】: