Cg语言中文说明文档(三)

语法

每个声明中的声明符可以选择一个指定的语法,语法指定了变量如何在程序运行时连接到环境。所有的语法都是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是不允许的

表达式中有多个函数调用时,调用顺序是不固定的。

猜你喜欢

转载自blog.csdn.net/duotemplar/article/details/78212858