CG图形绘制管线的三个阶段:
1.应用程序阶段
2.几何阶段 :主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射
3.光栅化阶段:决定哪些像素被集合图元覆盖的过程(Rasterization is the process of
determining the set of pixels covered by a geometric primitive) 。经过上面诸多坐标
转换之后,现在我们得到了每个点的屏幕坐标值(Screen coordinate) ,也知道我
们需要绘制的图元(点、线、面)
问题二涉及到具体的画线算法,以及区域图元填充算法。通常的画线算
法有 DDA 算法、Bresenham画线算法;区域图元填充算法有,扫描线多边形填
充算法、边界填充算法等,具体请参阅《计算机图形学(第二版) 》第 3 章。
这个过程结束之后,顶点(vertex)以及绘制图元(线、面)已经对应到像素
(pixel)。下面阐述的是“如何处理像素,即:给像素赋予颜色值”。
Pixel operation又称为 Raster Operation(在文献【2】中是使用 Raster
Operation) ,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目
的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测
试的过程而消除,这其中包含了很多种计算颜色的方法以及技术。Pixel operation
包含哪些事情呢?
1:消除遮挡面
2:Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的
纹理值;
3:Blending 29
混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha) ,
混合为两种颜色,作为新的颜色输出。通常称之为alpha混合技术。 当在屏幕
上绘制某个物体时,与每个像素都相关联的哟一个RGB 颜色值和一个 Z缓冲器
深度值,另外一个称为是alpha 值,可以根据需要生成并存储,用来描述给定像
素处的物体透明度。如果alpha 值为1.0,则表示物体不透明;如果值为 0,表示
该物体是透明的,
Cg支持7种基本的数据类型:
1. float,32位浮点数据,一个符号位。浮点数据类型被所有的profile支持(但是 DirectX8 pixel profiles在一些操作中降低了浮点数的精度和范围) ;
2. half,16为浮点数据;
3. int,32位整形数据,有些profile 会将 int类型作为 float 类型使用;
4. fixed,12位定点数,被所有的 fragment profiles 所支持;
5. bool,布尔数据,通常用于 if和条件操作符(?:) ,布尔数据类型被所有的
profiles 支持;
6. sampler*,纹理对象的句柄(the handle to a texture object) ,分为 6类:
sampler, sampler1D, sampler2D, sampler3D, samplerCUBE,和samplerRECT。
DirectX profiles 不支持 samplerRECT类型, 除此之外这些类型被所有的 pixel
profiles和 NV40 vertex program profile 所支持(CgUsersManual 30页) 。由
此可见,在不远的未来,顶点程序也将广泛支持纹理操作;
7. string,字符类型,该类型不被当前存在的 profile所支持,实际上也没有
必要在Cg程序中用到字符类型,但是你可以通过 Cg runtime API声明该类
型变量,并赋值;因此,该类型变量可以保存 Cg文件的信息。
前 6种类型会经常用到,事实上在 Wikipedia有关 Cg语言的阐述中只列举
了前 6种类型,而并没有提到string数据类型。除了上面的基本数据类型外,Cg
还提供了内置的向量数据类型(built-in vector data types),内置的向量数据类型基
于基础数据类型。例如:float4,表示 float 类型的 4 元向量;bool4,表示 bool
类型 4 元向量。
注意: 向量最长不能超过 4元, 即在 Cg程序中可以声明 float1、 float2、 float3、
float4 类型的数组变量,但是不能声明超过4元的向量,例如:
float5 array;//编译报错
向量初始化方式一般为:
float4 array = float4(1.0, 2.0, 3.0, 4.0);
较长的向量还可以通过较短的向量进行构建:
float2 a = float2(1.0, 1.0);
float4 b = float4(a, 0.0, 0.0);
此外,Cg还提供矩阵数据类型,不过最大的维数不能超过 4*4阶。例如:
float1x1 matrix1;//等价于 float matirx1; x是字符,并不是乘号!
float2x3 matrix2;// 表示2*3阶矩阵,包含6 个 float 类型数据
float4x2 matrix3;// 表示4*2阶矩阵,包含8 个 float 类型数据
float4x4 matrix4;//表示4*4阶矩阵,这是最大的维数
矩阵的初始化方式为:
float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};