Cg入门二:profile和基本数据类型
上一小结我们了解了Cg的输入输出,输入使用“in”关键词,输出使用“out”关键词,既是输入也是输出则使用“inout”关键词;也了解了Cg基本的语义,顶点程序传递给片段程序的位置坐标使用“POSITION”语义,它不需要在片段程序中做特殊处理,图形硬件会自动针对“POSITION”数据进行处理。
本小结我们主要了解一下Cg的profile和基本数据类型。Cg作为一种类C的语言,它的基本数据类型也有float,32位浮点数,来使用一下float,接着上一小节的shader程序:
Shader "Lesson/vertex&fragment2"{ SubShader{ pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag void vert(in float2 objPos:POSITION, out float4 col:COLOR, out float4 pos:POSITION){ pos = float4(objPos,0,1); col = pos; } void frag(inout float4 col:COLOR){ // col = float4(0,1,0,1); float r = 1; float g = 0; float b = 0; float a = 1; col = float4(r,g,b,a); } ENDCG } } }
float4也是Cg语言中的基本数据类型,它是一个四阶向量,可以用四个float值组合成一个float4,可以了解它会形成一个红色。
在Cg当中除了“float”这个32位浮点数之外,还有一个16位的浮点数“half”,精度为“float”的一半。将当前shader程序中的float改为half,float4改为half4,在工程中可以得到跟原来一样的结果。
Cg还有一种基本类型为“fixed”,它是一种定点数,将程序中的float修改为fixed,float4修改fixed4也能得到相同的结果。
针对float,了解一些Cg的数据类型。float可以组成二阶向量float2,三阶向量float3和四阶向量float4,其他类型同理,如half、fixed等。其中需要注意的是,Cg向量最高的维度为四阶。
除了float、half、fixed这三个基本数据类型外,还有bool类型,表示真与假,有int类型,32位的整型等。
接下来了解一下Cg的profile。一个Cg profile定义了一个“被特定图形硬件或API所支持的Cg语言子集”,任意一种shader language都是基于可编程图形硬件的(寄存器、指令集等),这也就意味着,不同的图形硬件对应着不同的功能子集。这些可选的语言功能包括某些控制结构和标准库函数。profile还定义了数据类型的精度,并且指定数据类型是否全局部或仅部分支持。profile按照功能可以划分为顶点profile和片段profile,而顶点profile和片段profile又基于OpenGL和DirectX的不同版本或扩展,划分为各种版本。从某种意义上而言,OpenGL和DirectX的发展历程成就了Cg语言。
以下是两个链接,分别是关于Cg profile fp20和Cg language的描述。
http://http.developer.nvidia.com/Cg/fp20.html
http://http.developer.nvidia.com/Cg/Cg_language.html
了解一下Cg profile fp20的描述,打开链接,可以看到fp20是一个OpenGL片段程序的profile,它支持硬件有GeForce3, GeForce4 Ti, Quadro DCC等。在页面右面可以看到很多关于Cg profile的定义,它主要描述的就是有些硬件有特定的性能,不一定得完全地支持Cg的某些内容,在这种情况下profile就做了对硬件做了特性能力的描述。在fp20 profile中,尤其比较重要的就是“fixed”数据类型,相当于本地化的有符号的9位整型,并被标准化范围为-1到+1。如果颜色值的分量都用fixed类型,那么每个颜色值分量都有256种,这个就是目前概念中的真彩色。因此在Unity中,fixed的精度已经足够表示颜色值了。fp20中使用的各种语义和函数就不一一列举了,要使用时可以查看一下文档。
打开第二个链接来了解一下Cg language。Cg最新版本已经到了3.1,Cg语言也是遵循Ansi C规范的语言,但它不同于C语言,Cg有bool类型,C语言没有bool类型,C语言非零即是真,零即为假。Cg中数组为第一类类型,因为Cg不支持指针。第三个方面Cg函数参数使用值传递,使用“out”、“inout”、“in”等进行输入输出。
语言profile实际上就是语言的一种特性,在不同的处理方法中会拥有不同的特性。在特殊情况下,语言profile就是关于一个使用for或者while循环的限制,意思就是有些情况下它不支持for或者while循环,有些profile仅仅loop循环。Cg不支持goto、switch、case、default等保留关键字;也不支持指针和指针相关的运算能力;Cg支持数组,但是有尺寸和维度的限制;Cg没有枚举和联合;Cg在结构体当中没有位成员;Cg中所有的整型都是有符号,没有signed关键字。
Cg有绑定语义,比如POSITON、COLOR0等;Cg内建的有swizzle操作;对于一个值来说,swizzle操作可以允许进行拼凑一个向量或矩阵;swizzle操作可以去访问所有的分量;数据有不同的有限的类型,主要的类型有float、half、fixed,片段profile必须支持这三种数据类型,但是可以选择使用half或fixed去实现float,顶点profile要求实现half和float,但是可以选择实现halp和float,顶点profile可以忽略支持fixed,Cg允许profile去忽略支持运行时的int,实际上会把int转换成float;Cg中的操作很多都是对于向量的操作,可以对向量的基本元素进行操作,Cg中也有?问号表达式,没有全局的非静态变量;Cg有新的sampler*集合;函数拥有默认值最为参数;函数和它们的操作可以被重载;变量可以定义在任何地方,但要在使用之前定义就行。还有其他一些不同于C语言的地方,详细内容可以查看该文档。