通过GLSL中的语义设置默认参数值

通过GLSL中的语义设置默认参数值,glsl,shader,cg,Glsl,Shader,Cg,虽然我对着色器在渲染管道中的位置有基本的了解,但我对着色器的实际编写几乎一无所知。我有一个CG着色器,我从和获得。我正在尝试将这些着色器转换为GLSL。我浏览了参考文档,发现这些语言非常相似,并根据可用的方法和语法转换了所有明显的位。但是,我对参数的默认值有一些问题。根据线路: float4 iPos : POSITION, ,表示通过“语义”设置默认值。这就是我开始迷路的地方。同样的东西在GLSL中似乎不可用,除非我遗漏了一些东西。我不明白GLSL中最接近的并行是什么,或者它对转换工

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

float4 iPos     : POSITION,

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

在Cg语义中,使用某些内置的固定函数属性和变量来别名属性和变量。Cg属性首先是没有任何语义的通用顶点属性。但是在OpenGL中(只有在旧的和不推荐使用的OpenGL中),您有一些固定的函数属性,它们带有语义。例如,顶点位置用
glVertex
glvertexinter
设置,而顶点法线用
glNormal
glNormalPointer
设置。通过将Cg中的语义
POSITION
NORMAL
赋予先前普通的通用属性,可以使其从这样一个固定的函数属性通道中获取其值

在GLSL中,又有内置的顶点属性变量,其中包含不推荐使用的固定函数属性的值,例如
gl_顶点
gl_法线
。。。对于位置、法线和其他语义。但正如前面所说,这些固定的函数属性通道实际上已经被弃用,并且不鼓励在现代OpenGL中使用它们(甚至在核心概要文件中禁止)。您应该使用的是通用顶点属性,使用
glVertexAttrib
glVertexAttribPointer
设置。这些不包含实际语义,只能通过着色器以特定方式使用它们来获取语义。但是,如果您需要将较旧的应用程序从Cg移植到GLSL,那么使用不推荐使用的内置属性,如
gl\u Vertex
gl\u Normal
等,是Cg属性语义(如
POSITION
Normal
的最佳替代

同样,也有一些变量具有特殊含义,需要特殊处理,如剪辑空间位置(语义
位置
?)。这些变量对应于可以在顶点着色器中写入的特殊变量,如本例中的
gl\u Position
。在不推荐使用的OpenGL中,还有其他可变变量可以写入并对应于某些固定函数变量,如
gl\u TexCoord[i]
TEXCOORDi
语义。使用这些工具时,您可以轻松地将着色器与固定函数阶段进行交互,例如,使用顶点着色器但固定函数片段处理

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