语法
每个声明中的声明符可以选择一个指定的语法,语法指定了变量如何在程序运行时连接到环境。所有的语法都是profile指定的,虽然有一部分尝试跨profile组成,但他们在不同的profile中拥有不同的意思。每个profile规范必须指定一系列profile可以理解的语法,以及当profile没有指定的语法的时产生的行为
函数声明
在C中函数声明是必须的。没有返回值的函数必须被声明为void返回类型。没有参数的函数可以使用两种方式来声明
functionName(void)
functionName()
函数可以声明为静态,如果是静态的,他们可以不被编译为程序,并且对外部是不可见的
函数重载和可选参数
Cg支持函数重载。你可以定义多个同名的函数,实际被调用的函数在调用方使用的参数类型。最符合的将被调用。具有初始化的尾参是可选参数。定义一个具有可选参数的函数,相当于重载了多个函数,区别在于有没有多一个可选的参数。初始化的值只在没有对应参数的时候才会被使用,而如果有了该参数,初始化值就会被忽略
由Profile重载函数
Cg支持由编译profile来重载函数。这个功能允许不同的profile实现不同版本的函数。因为不同的profiles可能支持不同的语言功能的子集,所以这个功能就非常有用。因为可能不能的profiles下,最有效率的函数实现是不同的。
profile名字必须置于函数声明的返回类型之前。例如,为profileA和profileB定义两个不同版本的myfunc函数
profileA float myfunc(float x){…}
profileB float myfunc(float x){…}
如果使用了typedef定义了一个类型,其名称和profile一样,那么这个标识符在文件接下来的任何位置,将被视为类型而非profile
如果一个函数没有包含一个profile定义,函数将被认为是一个open-profile函数,open-profile函数对所有profile可用
有几种profile的通配符已经被定义了,va代表任何vertex的profile,pa可以通配任何fragmen或pixel的profile。ps_1,ps_2分别通配任何DX8的1.x版本的shader的profile,和DX9 2.x的shader的profile。类似的,vs_1和vs_2分别通配DX顶点shader1.x和2.x版本。其他可用的profile通配符名称在各自的profile中定义
通常,最符合profile特性的重载函数被使用。在函数重载的部分提供更多的细节,但大致上,是按如下规则搜索符合的函数的
1.拥有精确的profile重载的函数
2.拥有最匹配的profile通配符重载的函数
3.没有profile重载的函数
这个搜索过程允许一个通用版本的函数,可以按硬件需要,被重载定义。
函数定义中参数的语法
函数声明类似于C的风格,但在函数定义中的参数可能包含了一个绑定的语法和一个默认值
每个函数定义中的参数由如下形式
<修饰符><类型> 标识符 [:绑定语法][=<默认值>]
默认值是子编译时可以得出一个常量的表达式
只有uniform的参数,及非顶层函数的in参数可以有default值
函数调用
函数返回值是右值,因此,如果返回一个数组,数组可以被读取,但是不能写入。例如
y = myfunc(x)[2]是可以的
myfunc(x)[2]=y是不允许的
表达式中有多个函数调用时,调用顺序是不固定的。