我对着色器的实际编写知之甚少,尽管我对它们在渲染管道中的位置有基本的了解。我有一个CG着色器,我从here和here获得了这个着色器。我试图将这些着色器转换为GLSL。我已经浏览了参考文档,发现这些语言非常相似,并根据可用的方法和语法转换了所有显而易见的位。我遇到了一些关于参数默认值的问题。根据{{3}}行:
float4 iPos : POSITION,
表示它通过“语义”设置默认值。这是我开始迷路的地方。除非我遗漏了某些东西,否则在GLSL中似乎没有相同的东西。我不明白GLSL中最接近的并行是什么或它对转换工作意味着什么。转换着色器时如何正确解释这一点?
答案 0 :(得分:1)
在Cg中,语义是一种通过某些内置的固定功能属性和变化来对属性和变化进行别名的方法。 Cg属性首先是一个没有任何语义的通用顶点属性。但是在OpenGL中(好吧,只有旧的和不赞成的OpenGL),你有一些固定的功能属性,这些属性带有语义。例如。顶点位置设置为glVertex
或glVertexPointer
,而顶点的法线设置为glNormal
或glNormalPointer
。通过在Cg中给出以前简单的通用属性语义POSITION
或NORMAL
,您可以使其从这样的固定函数属性通道中获取它的值。
在GLSL中,内置的顶点属性变量包含不推荐使用的固定函数属性的值,例如: gl_Vertex
,gl_Normal
,...用于位置,正常和其他语义。但是就像说那些固定功能属性通道实际上已被弃用,并且不鼓励在现代OpenGL中使用它们(甚至在核心配置文件中禁止使用它们)。您应该使用的是通用顶点属性,使用glVertexAttrib
和glVertexAttribPointer
进行设置。那些不带有实际的语义,只有着色器以特定的方式使用它们才能获得它们的语义。但是,如果您需要将旧应用程序从Cg移植到GLSL,那么使用已弃用的内置属性(如gl_Vertex
或gl_Normal
等)是Cg属性语义的最佳替代,如POSITION
或NORMAL
。
同样地,某些变化具有特殊含义,需要特别对待,如剪辑空间位置(语义POSITION
?)。这些变量对应于您可以在顶点着色器中写入的特殊变量变量,例如gl_Position
。在弃用的OpenGL中,还有其他可变写的变量,它们对应于某些固定函数变化,如gl_TexCoord[i]
和TEXCOORDi
语义。使用它们时,您可以轻松地将着色器与固定功能阶段接口,例如使用顶点着色器但固定功能片段处理。
总而言之,这些Cg语义实际上对应于GLSL中特殊的预定义属性和变量变量。但是在现代OpenGL中,所有这些特殊的顶点属性和大多数特殊变量变量都不再存在。但我建议你先深入研究一下GLSL和Cg在实践中是如何运作的,因为你看到这两者之间的移植并不像补充一些关键词那么简单。