顶点渲染可在功能上取代传统的变换与光照阶段,它位于镶嵌阶段之后,剔除与裁剪阶段之前。镶嵌阶段结束后,便将一个顶点数据传递给顶点渲染器,顶点可能包含位置、纹理坐标、顶点颜色、法线等数据。顶点渲染器不能创建或删除顶点,它处理结束后至少要输出顶点中的位置数据。
随着显卡的开发,3D图形程序在某些方面变得越发复杂。为了简化编程,一些新的特性被加入到显卡众,包括用顶点着色程序修饰渲染管线。起先,定点渲染程序是用汇编语言开发的,虽然汇编语言给予编程者很好的灵活性,但是很难用。需要一种用于GPU开发的高级语言,于是Cg应运而生。比起汇编来Cg易学,易编,易读,易懂。另外Cg适合更广泛的硬件和系统平台。Cg的编译器可以优化代码并且自动处理低级任务,这在汇编是不可能的。
数据类型
Cg 有六种基本数据类型,一些来自于C语言。float(32位浮点),half(16位浮点),int(32位整型),fixed(12位浮点),bool(布林型),sampler(代表一个材质)。
Cg还有vector(矢量)和matrix(矩阵)数值类型由基本类型二来,比如float3和float4x4。这种数据类型在处理3D图形程序中常用到。Cg还有struct(结构)和array(数组)类型,和C的用法一样。
操作符
Cg 支持算术操作符和逻辑操作符,和C中用法相同。
函数
Cg 也有if/else,while和for。另外定义函数和C语言也有相似之处。
标准Cg库
和C相同,Cg有一些GPU编程常用到的函数。有些和C相同,比如数学函数,像abs和sin。另一些只在GPU程序中才用到,比如texture mapping函数tex 1D和tex 2D。
Cg实时库
Cg 程序只是顶点和象素着色程序,它需要其它一些程序来支持以便处理渲染程序的其它部分。Cg可以用两个API: OpenGL和DirectX。每一种都有其各自的Cg函数作为和Cg程序的接口,比如设置目前的Cg程序,传递参数之类的任务。除此之外,Cg的API还有编译和执行着色程序的能力。但是,它需要着色程序的源代码为text文件,以使API可读。这也被认为是一大缺点。
例子
// input vertex
struct VertIn {
float4 pos : POSITION;
float4 color : COLOR0;
};
// output vertex
struct VertOut {
float4 pos : POSITION;
float4 color : COLOR0;
};
// vertex shader main entry
VertOut main(VertIn IN, uniform float4x4 modelViewProj) {
VertOut OUT;
OUT.pos = mul(modelViewProj, IN.pos); // calculate output coords
OUT.color = IN.color; // copy input color to output
OUT.color.z = 1.0f; // blue component of color = 1.0f
return OUT;
}
顶点渲染&象素渲染
顶点渲染程序是一些小程序,描述如何将某个过程应用于场景中的多边形顶点。这些程序最多有128个指令,非常适用于模拟可变形的对象,如布、火、水和人脸等。开发人员也可以在场景中创造新的灯光效果。
像素渲染程序是一些小应用程序,描述帧缓冲中要应用到像素上的操作。像素渲染程序与顶点渲染程序的功能类似,但前者执行处理色彩和材质的操作,而不是处理几何体的操作。
Copyright 2023 fuwu029.com赣ICP备2022008914号-4