Cg, C for graphic, NviDIA与Microsoft合作, 兼容D3D与OpenGL;跨windows, linux, Mac和Xbox等。 在GPU上执行的
Cg的数据流模型, 输入是顶点和片段(像素), 经过Cg处理后输出。 在渲染三维场景时, 每当一个顶点被处理或者光栅器产生一个片段, 对应的顶点和片段Cg程序就会被执行。
顶点着色器与片段着色器:
<p>http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/flashplayer/articles/vertex-fragment-shaders/fig01.jpg</p>
<p>http://zhidao.baidu.com/link?url=FgKJL3xH93VmY7gWUeuTg2DYcc5bQPAs5E3P4bktIgON0vx-4VJWXHbeHucX_0x3FPUsAyeojqQuH_GXtgFlXq</p>
<p>http://zhidao.baidu.com/question/24055324.html?fr=qrl&index=4&qbl=topic_question_4&word=%B6%A5%B5%E3%D7%C5%C9%AB%C6%F7%20%C6%AC%B6%CE%D7%C5%C9%AB%C6%F7</p>
现阶段的显卡(主要是针对微软DIRECTX(驱动和操作系统的接口技术)的版本来说的)都是非统一架构的,也就是分为顶点渲染和像素渲染。
那么在显示核心的内部就分为两大区域,一个区域就是顶点渲染单元(也叫顶点着色或顶点着色引擎),主要负责描绘图形,也就是建立模形。
一个就是像素渲染管线(也叫像素渲染管道),主要负责把顶点绘出的图形填上填色。
三维物体的绘制技术分为表面绘制和体绘制两种技术。表面绘制技术如同字面上的含义,光照、材质等等都发生在物体的表面,这也是和三维物体的表面表达技术有关(surface representation或border representation);这种技术绘制不了物体内部的细节,所以通常不能称之为真三维的表达。
比如说人体的CT三维重建,是可以看到皮肤甚至骨骼下面的组织和结构,但是表面绘制的技术如同给人照相,相片是不能反映人体的深层真实三维构造的,不能给医生以更多的判断信息;又如矿藏,通过探井数据我们可以大体推断其真三维结构。
因而,2D纹理贴图是将平面的、二维的相片贴到物体的几何表面上;(注意到2D相片可能和物体的几何表面大小不一致,所以需要一个灵活的映射机制,即插值函数,才能将纹理相片的像素值合理地映射到物体表面上); 3D纹理就是立体的“图形”,如同2D纹理是一个(x,y)形式的像素矩阵,3D纹理是一个(x,y,z)形式的三维像素矩阵,每一个(x,y,z)对应一个标量值;3D纹理贴图就是要把这个三维的像素阵列映射到三维的物体空间中去;通常将物体和3D纹理处理成立方体或圆柱体,可以更容易理解相关理论和实现。3D纹理和体绘制技术密切相关,体绘制(volume rendering)是科学可视化的重要手段。
固定管线:图形算法固定在硬件中。
可编程管线:顶点和片段处理是可编程的。 Cg是此种编程语言。
Cg专门用来处理顶点和片段的。 Cg程序的执行是独立的。一个顶点或片段的处理时, 对其他顶点或片段无影响。 执行Cg无任何副作用。
顶点---->顶点变换------>图元装配和光栅化---->片段纹理映射和着色---->光栅化
片段与像素。 像素代表帧缓存中某个指定位置的内容,如颜色、深度等。 光栅化会将覆盖的像素分解成像素大小的片段, 每个片段有一个与之关联的像素位置、深度、差值参数等。当片段经过各种各样的光栅化测试后,片段将被用于更新帧缓存中的像素。
Cg程序经过Cg编译器编译成D3D调用或者OpenGL调用。