第一章 简介
1.1 什么是Cg
Cg是一门编程语言。Cg在图形硬件汇编语言的基础上封装了一层,其与OpenGL和DX的高级光照语言兼容。Cg基于C语言。
1.1.1 为可编程图形硬件设计的语言
Cg的目标是:为使用图形硬件渲染的物体的形状、外观和运动提供可编程控制的能力。当然也可以用来实现物理模拟、混合和其他非光照任务。
1.1.2 Cg的数据流模型
Cg是基于数据流模型的。Cg程序实际上是在GPU上执行的。
1.1.3 图形处理器的特殊性和中央处理器的通用性
CPU是以多种用途为目的设计的,GPU是专门为执行图形任务设计的,因此在处理顶点和光栅化速度非常快,但不能处理任意多样的任务。Cg提供了一个和图形处理器的执行模型相符合的抽象执行模型。
1.1.4 Cg性能的基本原理
通常,可交互的三维程序至少达到15帧每秒,60帧每秒便可认为实时。GPU用来处理数以万、亿计的像素渲染和顶点转换。而CPU则为每个图像更新显示,因此一个三维应用程序通常是由C++等语言编写,使用Cg等充分利用图形处理器的处理能力。
1.1.5 与传统编程语言共存
Cg是一种辅助语言,C、C++等语言使用Cg运行程序加载图形处理器上执行Cg程序,这可以通过Cg运行库来实现。Cg的产生是由历史确定的,近来的图形处理器的顶点和片段处理也是完全可编程的。Cg相对之前的使用汇编编写图形处理算法有着很高的优越性,降低了入行门槛。
1.1.6 Cg的其他方面
Cg简单易学,这源于它是专门用来交换顶点和片段。Cg包含软件工程所需的复杂性能,例如指针和内存分配、文件,但也为某些保留了关键字。Cg提供了数组和结构,并包含了现代语言的流控制:循环、条件和函数调用。Cg天生就支持向量和矩阵。Cg程序的执行是相对独立的,Cg非常适合高度流水和并行的硬件。
1.1.7 Cg程序的有限执行环境
Cg所写的东西,并不一定能在所有的GPU上执行,这需要一个“配置”来约束,每个配置代表了一类GPU和API的组合。目前的限制都是GPU自身的约束,Cg战未来。
1.2 顶点、片段和图形流水线
1.2.3 图形硬件流水线
传统的图形硬件流水线以流水的方式处理大量的顶点、几何图元和片段
每个顶点除了有位置信息外,还有一些其他属性,例如颜色、反射、纹理、法向量等信息。
顶点变化通常包含顶点的坐标位置转换、产生贴图纹理坐标、计算顶点颜色等
图元装配根据顶点序列的几何图元分类信息把顶点装配成几何图元,会产生一系列的三角形、线段和点。
图元经过剪裁到可视平截体,然后是透视除法和视口转换。
光栅化决定了哪些像素被几何图元覆盖的过程。直接产生的结果为片元,其包含了一个像素的位置、深度、颜色、反射、纹理等信息,当然这些信息是由插值计算的
光栅化的过程包括了许多测试,包括剪切、alpha、模板和深度等测试
顶点处理的数据流模型从载入每个顶点的属性到顶点处理器开始,然后顶点处理器重复地读取下一个指令并执行,直到顶点程序结束。顶点属性寄存器是只读的,包含了应用程序指定的顶点属性集,临时寄存器能够进行读写操作,用来计算中间结果,输出结果寄存器只能进行写操作。顶点处理期所依赖的是向量及其它数学操作
可编程片段处理器需要许多和可编程顶点处理器一样的数学操作,但是它们还需要支持纹理操作,纹理操作使得处理器可以通过一组纹理坐标存取纹理图像,然后返回一个纹理图像过滤的采样。片段操作处理低精度的数据类型时更加有效,图形处理器必须同时处理如此多的片段。图形处理器没有任意分支功能。
第二章 最简单的程序
使用OpenGL加载Cg程序的过程
cgCreateContext 创建一个Cg上下文对象并返回其句柄。 Cg上下文是Cg程序的容器。 必须将所有Cg程序添加到Cg上下文中。
cgSetParameterSettingMode 在设置参数时控制上下文的行为。 使用延迟参数设置,cgSetParameter命令不会立即更新相应的3D API参数。
cgGLGetLatestProfile 返回给定类的最佳可用配置文件。 检查OpenGL扩展以确定当前GPU,驱动程序和cgGL库组合支持的最佳配置文件。
cgGLSetOptimalOptions 设置附加到传递给cgCreateProgram的参数列表的隐式编译器参数。 根据可用的编译器参数,GPU和驱动程序选择参数。每次调用cgCreateProgram时,参数都将附加到参数列表,直到最后一个CGcontext被销毁,之后应再次调用此函数。
cgCreateProgramFromFile 生成一个新的CGprogram对象并将其添加到指定的Cg上下文。
cgGLLoadProgram 准备一个绑定程序。 必须先加载所有程序,然后才能绑定到当前状态。 有关绑定程序的更多信息,请参阅cgGLBindProgram。
cgGLBindProgram 将程序绑定到当前状态。 程序必须先加载cgGLLoadProgram才能绑定。 此外,必须启用程序的配置文件才能使绑定生效。 这可以使用cgGLEnableProfile函数完成。对于不支持程序本地参数的配置文件(例如vp20配置文件),cgGLBindProgram将重置使用任何Cg参数设置函数设置的所有统一参数。
cgGLEnableProfile 通过进行必要的OpenGL调用来启用配置文件。 对于大多数配置文件,这只是使用approriate enumerant调用glEnable。
cgGLDisableProfile 通过进行必要的OpenGL调用来禁用配置文件。 对于大多数配置文件,这只是使用approriate enumerant调用glDisable。
cgDestroyProgram 删除指定的程序对象及其所有关联数据。 删除程序后,任何引用该程序的CG程序变量都将失效。 同样,该程序包含的任何对象(例如CGparameter对象)在删除程序后也将变为无效。
cgDestroyContext 删除Cg上下文对象及其包含的所有程序。
Cg使用语义词标识变量的含义