人们很容易看到这种体系结构如何类似于中描述的流计算模型上一节。这种类型的固定结构的是,直到最近,计算机图形卡制造商的标准可循。虽然类似流计算模式,它提供了很少或没有编程的用户,因此,它是不可用于比处理图形指令的其他任何任务。2000年[ Owe05 ],GPU 小号允许管道的关键部位的可编程性一定程度。
当前GPU 小号允许用户在形式的图形流水线的两个阶段几乎任何类型的功能进行编程顶点程序和片段的方案。这些允许用户分别写在顶点和片段数据的程序。图2 示出了更近的映射的OpenGL可编程管线到流模型。
顶点处理器输入的顶点值和其相关的数据进行操作。它的目的是执行传统的图形操作,如:顶点变换,正常转化和规范化,纹理坐标生成和改造,照明和颜色计算[ Ros04。因为顶点处理器是能够改变输入的顶点数据的位置,从而影响最终图像的要绘制。由于图像是,在本质上,的存储器阵列,顶点处理器能够分散状操作。另外,最近的处理器能够从纹理存储器读出,从而产生一种特殊的延迟收集动作。我们称之为延迟,因为顶点不能直接从其他顶点元件读取的信息,但它可以读取的任何数据从先前的计算结果,如果它是在纹理存储器编码。在后面的章节中,我们将看到如何利用这一点来执行简单的计算。
顶点处理器可以在SIMD(单指令多数据)或MIMD(多指令多数据)模式下运行; 因此,允许两个,一个处理器单元中的指令和任务并行。由于现代GPU 小号包含多个顶点处理器(最新的NVIDIA 和ATI卡有多达六个),我们可以开始欣赏并行这些体系结构上实现的水平。
该片段处理器上的片段和它们相关联的数据进行操作。一些传统上与片段着色器相关联的操作是:质地接入和应用,雾,颜色和与上内插值一般操作。如同顶点着色器,片段着色器可用于在GPU上执行几乎任何种类的计算。因为片段处理器可以访问纹理存储器的随机这是很容易的片段程序内执行聚集操作。实际上,这是很常见的使用纹理信息进行依赖于其他纹理查找窗口; 功能移植算法的流计算模型时来真的很方便。
虽然在目前的GPU架构碎片处理器可以在SIMD模式下运行,是非常严格的那种,他们允许我们将看到,他们还是很容易执行一般的计算操作。加,由于片段的处理片段的处理器数量的计算频率比顶点处理器的数目越高。当前顶级的线卡有十六岁左右的片段处理器。
这篇文章摘自英伟达官网教程的开篇。
本章有以下四个部分:
这本书教你如何使用名为CG的编程语言。对CG语言使您能够控制形状,外观和使用可编程图形硬件绘制的物体的运动。它娶这些属性以令人难以置信的速度和今天的图形处理器的功能进行编程控制。从未有过计算机图形学的从业者,无论是艺术家还是程序员,有超过它们所产生的实时图像那么多的控制。
CG为开发者提供一个完整的编程平台,易于使用,并且能够快速创建多个平台上的特殊效果和实时影院级体验。通过提供一个新的抽象水平,CG不再需要为开发者直接编程图形硬件汇编语言,从而更容易瞄准的OpenGL,DirectX的,在Windows,Linux,苹果OS X和游戏机平台如Xbox。CG是在与微软公司密切合作开发,并与OpenGL的API和微软的高级着色器语言(HLSL)支持DirectX 9.0兼容两种。
CG表示“C图形”。C编程语言是在20世纪70年代发明了一种流行的,通用的语言。由于其知名度和简洁的设计中,C为若干后续编程语言提供了基础。例如,C ++和Java的基础语法和结构在很大程度上C.重心语言立足于C作为好。如果你熟悉C或从C产生的许多语言之一,那么CG将是简单易学。
在另一方面,如果你不熟悉一般的C或甚至编程语言,但是你享受电脑的图形和想学习新的东西,反正阅读。Cg程序往往是短期和理解的。
大部分本章是背景了解CG和有效地使用它提供有价值的背景。在另一方面,你可能会发现CG更容易做来学习。随意在任何时候,如果你感觉更舒服刚刚潜入教程跳到第2章。
CG是C,C ++和Java不同,因为它是非常专业的。没有人会写在CG电子表格或字处理程序。相反,CG靶向以编程方式控制的形状,外观,并使用图形硬件呈现的对象的运动的能力。概括地说,这种类型的语言的被称为着色语言。然而,CG能做的不仅仅是更多的阴影。例如,Cg程序可以进行物理模拟,合成等nonshading任务。
一个CG程序看作一个详细的食谱如何使用可编程图形硬件渲染的对象。例如,你可以写一个CG程序,使表面出现凹凸不平,或者以动画一个虚拟人物。后来,在1.3节中,您将了解更多有关着色语言的历史并在CG融入这段历史。
除了被专门用于图形,因为它们是基于数据流的计算模型CG和其他着色语言是从传统的编程语言中的不同。在这样的模型中,计算出现在响应于数据流经的处理步骤的序列。
Cg程序顶点和片段(想想“像素”现在,如果你不知道一个片段是什么)正在呈现图像时处理工作。认为一个CG程序作为黑箱到哪些顶点或片段在一侧流动的,在某种程度上改变,然后流出在另一侧。然而,箱子是不是一个真正的黑盒子,因为你来决定,由你写的Cg程序的手段,里面究竟发生了什么。
每当一个顶点处理或光栅生成一个片段在呈现3D场景,你的相应的顶点或片段CG程序执行。1.3节进一步解释CG的数据流模型。
最近的个人电脑和所有最新的游戏机,包括专用于图形任务,如转换和光栅化三维模型的图形处理单元(GPU)。您的Cg程序实际上您的计算机的GPU内执行。
不论是否在个人计算机或游戏控制台具有GPU的,必须有在运行操作系统和应用程序的CPU。CPU是按照设计,通用的。的CPU执行的应用程序(例如,文字处理器和计费包)写入通用语言,如C ++或Java。
因为GPU的专门设计的,它是在图形任务,诸如渲染3D场景,比通用CPU会快得多。新的GPU处理数以千万计的每秒顶点和光栅化数亿甚至数十亿每秒的片段。未来的GPU会更快速。这是压倒性比在其中的CPU可以处理类似的顶点和片段的数目的速度快。然而,GPU无法执行相同的随意性,通用程序,一个CPU可以。
GPU的专业化,高性能的本质就是CG的存在。通用编程语言过于开放式的处理顶点和片段的专门任务。与此相反,CG语言是完全致力于此任务。CG还提供了GPU的执行模式相匹配的抽象执行模型。您将了解在第1.2节GPU的唯一执行模型。
为了保持互动的错觉,3D应用程序需要保持每秒15或多个图像的动画速度。通常,我们考虑每秒60或更多的帧是“实时”的速率与应用程序的交互出现瞬间发生。计算机的显示屏上也可能需要重画一万以上像素。对于3D场景中,GPU通常处理在屏幕上多次的每个像素以考虑对象如何阻塞彼此,或以提高每个像素的外观。这意味着,实时3D应用可能需要数亿每秒像素更新。以及所需的象素处理,3D模型是由它们被组装成多边形,线和点将被光栅化为像素之前必须正确地变换顶点。这可能需要改变数千万每秒顶点。
此外,该图形处理发生在除了更新为每个新的图像的动画所需的CPU的相当大的努力。现实情况是,我们需要CPU和GPU的专门面向图形的能力。两者都需要呈现在交互式率场景和质量标准的3D应用程序和游戏需求的用户。这意味着开发人员可以编写C ++中的3D应用程序或游戏,然后用CG制作的最GPU的额外的图形马力。
决不做CG替换任何现有的通用语言。CG是一种辅助语言,专门为GPU的设计。在常规语言,例如C或C为CPU写的程序++可以使用CG运行时(在第1.4.2节中所述)来加载Cg程序为GPU来执行。重心运行是一套标准,用于加载,编译,操作和配置Cg程序由GPU执行子程序。应用程序供应Cg程序指导如何实现可编程的渲染效果,否则不会有可能在渲染率GPU能够实现的CPU在GPU上。
CG能够并行处理的专业风格。同时您的CPU执行的常规应用,该应用程序也编排顶点和片段的并行处理在GPU上,通过写入Cg程序。
如果一个实时着色语言是一个好主意,为什么没有人发明CG越快?答案与计算机图形硬件的演进做。2001年之前,大多数计算机图形硬件的肯定的种类中的PC和游戏便宜的图形硬件的游戏机-被硬连线到顶点和片段的处理的特定任务。通过“硬连线”,我们的意思是,该算法被固定在硬件内,如在一个方式,是对图形应用程序可访问的反对是可编程的。即使这些硬接线图形算法可以由图形应用程序以各种方式来配置,则应用程序不能重新编程的硬件做由硬件的设计者意料之外的任务。幸运的是,这种情况发生了变化。
图形硬件设计的进步,以及顶点和片段处理单元在最近的GPU真正可编程的。可编程图形硬件问世之前,有在提供一种编程语言为它没有任何意义。现在,这样的硬件是可用的,有一个明确的需要,使其更容易向此硬件进行编程。CG使得它更容易在C制备更容易编程的CPU相同的方式GPU的编程。
CG存在之前,针对GPU的可编程能力,只有通过低级别的汇编语言是可能的。该神秘指令语法和汇编语言,如DirectX 8的顶点和像素着色器和OpenGL的一些需要人工硬件寄存器操作的扩展,使得它对于大多数开发人员一个痛苦的任务。随着GPU技术制成更长,可能更复杂的汇编语言程序,需要有一个高层次的语言变得清晰。已被要求达到最佳性能的广泛低级编程现在可以委托给编译器,优化代码输出,并处理繁琐指令调度。图1-1是用于表示皮肤的复合汇编语言片段程序的一小部分。显然,这是很难理解,特别是在向硬件寄存器的具体引用。
。。。 DEFINE LUMINANCE = {0.299,0.587,0.114,0.0}; TEX H0,F [TEX0],TEX4,2D; TEX H1,F [TEX2],TEX5,CUBE; DP3X H1.xyz,H1 LUMINANCE; MULX H0.w,H0.w,LUMINANCE.w; MULX H1.w,H1.x,H1.x; MOVH H2,F [TEX3] .wxyz; MULX H1.w,H1.x,H1.w; DP3X H0.xyz,H2.xzyw,H0; MULX H0.xyz,H0,H1.w; TEX H1,F [TEX0],TEX1,2D; TEX H3,F [TEX0],TEX3,2D; MULX H0.xyz,H0,H3; MADX H1.w,H1.w,0.5%,0.5; MULX H1.xyz,H1,{0.15,0.15,1.0,0.0}; MOVX H0.w,H1.w; TEX H1,H1,TEX7,CUBE; TEX H3,F [TEX3],TEX2,1D; MULX H3.w,H0.w,H2.w; MULX H3.xyz,H3 H3.w; 。。。
相比之下,注释良好企业管治守则是更便携,更清晰,更容易调试,更易于重用。CG为您提供了一个高层次的语言的优势,如C,同时提供的低级汇编代码的性能。
CG是编程语言“中的小。” 这使得它要比一个现代的通用语言如C ++简单。由于CG专业变换顶点和片段,它不目前包括许多大规模的软件工程任务所需的复杂的功能。与C ++和Java,CG不支持面向对象的编程中使用类和其他功能。当前CG实现不提供指针,甚至内存分配(尽管未来实现可能和关键字适当保留)。CG有文件输入/输出操作绝对没有支持。总的来说,这些限制都没有在语言永久的限制,而是仅指示今天的最高性能GPU的能力。随着技术的进步,以允许在GPU上更普遍的可编程性,你可以期望CG适当地生长。由于CG是密切基于C,未来CG的更新很可能会采取从C和C ++语言特性。
CG提供了数组和结构。它具有所有现代语言的流控制结构:循环,条件和函数调用。
CG原生支持向量和矩阵,因为这些数据类型和相关的数学运算的显卡根本,最图形硬件直接支持矢量数据类型。CG有一个函数库,称为标准库,这是非常适合的那种图形所需的操作。例如,CG标准库包括反映用于计算反射的载体功能。
Cg程序执行相对隔离。这意味着一个特定顶点或片段的处理,对在同一时间处理的其他顶点或片段没有影响。有没有副作用至CG程序的执行。这种缺乏顶点和片段之间的相互依存使得CG软件中极其由高度流水线和并行硬件非常适合硬件执行。
当您在专为使用现代操作系统现代CPU的语言写一个程序,你期望一个更或多或少任意程序,只要它是正确的,将编译并正确执行。这是因为处理器,由设计,执行用于该整个系统具有比足够的资源更多的通用方案。
然而,GPU是专门的,而不是通用的,和GPU的功能集仍在发展。没有你可以在CG写什么都可以编译在一个给定的GPU执行。CG包括硬件的概念“配置文件”,其中之一的你,当你编译程序的CG指定。每个轮廓对应于GPU架构和图形API的特定组合。您的方案不仅必须是正确的,但它也必须自己局限在由用于编译程序的CG特定的简施加的限制。例如,一个给定的片段简档可以限制你每片段不超过四个纹理存取。
随着GPU的发展,更多的配置文件将被CG对应于更强大的GPU架构的支持。今后,型材将不太重要,因为图形处理器变得更加功能全面。但现在CG程序员需要限制方案,以确保他们能够编译并执行现有的GPU。在一般情况下,未来的轮廓将是电流分布超集,以便为当今的型材编写的程序编译,而无需使用未来轮廓变化。
这种情况可能听起来限制,但在实践上千万的GPU的这本书表现出的一个Cg程序,并产生令人信服的渲染效果。另一个原因限制程序的大小和范围的是,更小的和更有效的Cg程序是,它们将运行速度更快。实时图形往往是如何去平衡增加场景的复杂性,动画率,并提高阴影。所以这是一件好事通过明智的CG编程以最大限度地提高渲染效率。
请记住,由配置文件规定的限制确实目前的GPU,而不是CG的限制。重心的语言是强大到足以表达着色技术,还不可以与所有的GPU。随着时间的推移,GPU功能将演变远远不够,CG配置文件将能够运行复杂的惊人Cg程序。CG是当前和未来的GPU的语言。
为了把CG成适当的情况下,你需要了解如何GPU的渲染图像。本节介绍了图形硬件将如何发展,然后探讨了现代图形硬件渲染管线。
计算机图形硬件以令人难以置信的速度推进。三种力量正在推动创新的这种快速的节奏,如图1-2。首先,半导体产业一直致力于增加一倍晶体管适合于微芯片每18个月的数量(计算机硬件的基本单位)。电脑电源的这种不断的加倍,历史上被称为摩尔定律,意味着更便宜,更快的计算机硬件,是我们这个时代的常态。
第二个力的计算来模拟我们周围的世界所需要的大量。我们的眼睛和消费我们的大脑以惊人的速度,并以惊人的敏锐理解我们的3D世界影像。我们永远不可能达到一个地步,计算机图形成为现实的替代品。现实是太真实。毫不气馁,计算机图形学从业人员继续迎接挑战。幸运的是,生成图像是一个尴尬的并行问题。我们所说的“尴尬的并行”,是图形硬件设计人员可以反复拆散创建逼真的图像,投入到工作中的多个块更小,更容易解决问题。然后硬件工程师可以安排,并联的晶体管可在越来越大的数目来执行工作的所有这些不同的块。
我们的第三个力是持续的愿望,我们都必须受到刺激和视觉娱乐。这是“连接”提供了计算机的硬件资源续加倍的源永远比以前更真实近似视觉现实的任务的力。
如图1-2所示,这些见解让我们满怀信心地预言,计算机图形硬件是会得到更快。这些创新激起我们的集体胃口更多的互动和引人入胜的3D体验。满足这个需求是什么激发了CG语言的发展。
在90年代中期,世界上最快的图形硬件组成的那共同努力,使图像并将其显示在屏幕的多个芯片。最复杂的计算机图形系统由几十个分布在多个电路板芯片。随着时间的推移和半导体技术的提高,硬件工程师纳入复杂的多芯片设计的功能集成到一个单一的图形芯片。这种发展导致了整合和规模巨大的经济体。
你可能会惊讶地得知,现在GPU超过出现在每个微芯片晶体管数量的CPU。晶体管数量是多少计算机硬件专门的微芯片粗略衡量。例如,英特尔的包装2.4 GHz奔腾4 55亿个晶体管; NVIDIA使用超过125万个晶体管,在原有的GeForce FX GPU。
NVIDIA推出了在90年代末的术语“GPU”的时候,传统的术语“VGA控制器”已不再是图形硬件的PC中的准确描述。IBM推出了视频图形阵列(VGA)的硬件在1987年当时,VGA控制器是我们现在所说的“哑”帧缓冲区。这意味着在CPU负责更新所有的像素。今天,CPU很少直接操纵像素。相反,图形硬件设计师打造的像素更新的“智慧”进入GPU。
行业观察家已经确定了GPU的进化四代至今。每一代人提供了更好的性能和GPU功能集的演变可编程性。每一代也影响和集成了两个主要的三维编程接口,OpenGL和DirectX的功能。OpenGL是一个开放的标准为3D编程用于Windows,Linux,UNIX和Macintosh计算机。DirectX是微软的多媒体编程接口,包括对Direct3D的3D编程的一组不断发展。
之前引进的GPU,公司如Silicon Graphics公司(SGI)和埃文斯和萨瑟兰设计专业和昂贵的图形硬件。这些公司开发的图形系统推出了很多的概念,如顶点变换和纹理映射,我们今天认为理所当然。这些系统是计算机图形学的历史发展很重要,但因为他们是如此昂贵,他们并没有达到设计的PC和视频游戏机的单芯片GPU的大众市场的成功。今天,GPU是比任何现有的系统更强大,更便宜得多。
第一代的GPU(直至1998年),包括NVIDIA的TNT2,ATI的愤怒,而3dfx的Voodoo3的。这些GPU能够栅格化前的三角形转化和应用一个或两个纹理。他们还实施了DirectX 6的功能集。当运行大多数3D和2D应用程序,这些GPU完全免除更新单个像素的CPU。然而,在这一代的GPU从两个明确的限制的影响。第一,他们缺乏变换3D对象的顶点的能力; 相反,发生在CPU中顶点变换。第二,它们具有一组相当有限的数学运算的用于组合的纹理来计算光栅化的像素的颜色。
第二代GPU(1999- 2000年)包括NVIDIA的GeForce 256和GeForce2的,ATI的Radeon 7500,和S3的的Savage3D。这些GPU卸载从CPU的3D顶点变换和光照(T&L)。快速顶点变换是在此之前这一代分化高端工作站从个人电脑的主要功能之一。OpenGL和DirectX 7的支持硬件顶点变换。虽然结合在这一代扩大到包括立方体贴图纹理和签署数学运算的纹理和像素着色集数学运算,可能性仍然有限。换句话说,这一代是更可配置的,但仍然没有真正可编程的。
第三代GPU(2001),包括NVIDIA的的GeForce 3和钛的GeForce4,微软的Xbox和ATI的Radeon 8500。这一代人提供了可编程的顶点,而不是仅仅提供更多的可配置性。代替支承由OpenGL和DirectX 7中指定的常规转化和照明模式,这些GPU让应用程序指定的用于处理的顶点的指令序列。相当多的像素级可配置是可用的,但这些模式没有强大到足以被认为是真正的可编程。由于这些GPU支持可编程的顶点,但缺乏真正的像素可编程性,这一代是过渡性的。DirectX 8的和多厂商ARB_vertex_program OpenGL扩展暴露顶点级可编程性的应用程序。DirectX 8的像素着色器和各种供应商特定的OpenGL扩展揭露这一代人的片段级配置性。
第四和目前这一代的GPU(2002年以后),包括NVIDIA的GeForce FX系列的的CineFX架构和ATI的Radeon 9700图形处理器,这些都提供了顶点级和像素级的可编程性。可编程的这个水平开辟了从CPU到GPU卸载复杂顶点变换和像素着色操作的可能性。DirectX 9和各种OpenGL扩展揭露这些GPU的顶点级和像素级的可编程性。这是GPU的CG的地方变得非常有趣的产生。表1-1列出了选择代表这些不同代的GPU的NVIDIA GPU。
代 |
年 |
产品名称 |
处理 |
晶体管 |
反锯齿填充率 |
多边形率 |
注意 |
---|---|---|---|---|---|---|---|
第一 |
1998年晚期 |
RIVA TNT |
为0.25 中号 |
的7M |
50公尺 |
6M的 |
[1] |
第一 |
1999年早期 |
RIVA TNT2 |
0.22 中号 |
9米 |
7500万 |
9米 |
[2] |
第二 |
1999年晚期 |
的GeForce 256 |
0.22 中号 |
23男 |
120米 |
15米 |
[3] |
第二 |
2000年初 |
的GeForce2 |
0.18 中号 |
25男 |
200海里 |
25男 |
[4] |
第三 |
2001年初 |
的GeForce3 |
0.15 中号 |
57男 |
800米 |
30男 |
[5] |
第三 |
2002年初 |
钛的GeForce4 |
0.15 中号 |
63男 |
1200米 |
60男 |
[6] |
第四 |
2003年年初 |
的GeForce FX |
0.13 中号 |
125微米 |
2000 M |
200海里 |
[7] |
笔记 |
该表使用以下术语:
音符突出在每个设计中最显著的改进。性能利率不得与其他硬件厂商的设计相媲美。
未来的GPU将进一步概括目前的GPU的可编程方面,以及CG将会使这个额外的可编程易于使用。
一个管道是并行和以固定的顺序操作阶段的序列。每个阶段从现有阶段接收其输入,其输出发送到后续阶段。像数十汽车都在同一时间在不同阶段的行制造,每个汽车装配线,常规的图形硬件流水线处理的顶点,几何图元,和片段的以流水线方式众多。
图1-3显示了今天的图形芯片所使用的图形硬件管道。3D应用程序发送成批GPU进入几何图元的顶点的序列:典型的多边形,线条和点。如图1-4所示,有许多方式来指定几何图元。
每个顶点有一个位置,而且还通常有几个其他属性,例如颜色,仲(或镜面)色,一个或多个纹理坐标集,以及法线矢量。法线矢量指示表面面对在顶点什么方向,并且通常在照明计算中使用。
顶点变换是在图形硬件流水线第一处理阶段。顶点变换执行数学运算上的每个顶点的序列。这些操作包括转化顶点位置成由光栅使用屏幕上的位置,产生纹理坐标纹理和照明顶点,以确定它的颜色。我们将解释许多在后面的章节这些任务。
转化的顶点顺序流动到下一个阶段,称为原始装配和光栅扫描。首先,将原始的装配步骤组装的顶点为基于伴随顶点的顺序的几何图元配料信息几何图元。这导致的三角形,线,或点的序列。这些原语可能需要限幅的视锥(三维空间中的视图的可见光区),以及任何启用应用程序指定的剪辑平面。光栅也可以丢弃基于它们是否面临向前或向后多边形。这个过程被称为灭杀。
存活下来,这些剪报和扑杀措施多边形必须被光栅化。光栅是确定该组由一个几何图元覆盖的像素的过程。多边形,线和点根据每个类型的原始指定的规则的每个栅格化。光栅化的结果是一组像素位置以及一组片段。有顶点的原始拥有的数目和当它被光栅化产生的片段的数量之间没有任何关系。例如,一个三角形由刚刚三个顶点可能占用整个屏幕,并因此产生数百万碎片!
此前,我们告诉你想一个片段作为一个像素的,如果你没有确切地知道一个片段是什么。在这点上,然而,片段和像素之间的区别变得重要。术语像素是短期的“图像元素”。的像素表示该帧缓冲器中的特定的位置的内容,例如颜色,深度,和与该位置相关联的任何其他值。一个片段是更新的特定像素的潜在需要的状态。
术语“片段”是因为光栅打破了每个几何图元,例如三角形,到每个象素的原始封面像素大小的片段。片段具有相关联的像素的位置,深度值,和一组内插参数,诸如颜色,仲(镜面)的颜色,以及一个或多个纹理坐标集。这些各种内插参数从转化的顶点构成用于生成片段的特定的几何图元的。你可以把一个片段作为一个的“势像素”。如果一个片段通过各个光栅化试验(在光栅操作阶段,这是不久描述的),该片段更新在帧缓冲器中的像素。
一旦一个基元被光栅化为零个或多个片段的集合,该内插,纹理和着色阶段插值作为必要的片段的参数,执行纹理和数学运算的序列,并确定每个片段的最终颜色。除了 确定该片段的最终颜色,该阶段也可确定一个新的深度或甚至可丢弃该片段,以避免在更新帧缓冲区的对应的像素。允许该阶段可以丢弃碎片的可能性,这一阶段发出一个或零有色片段为接收每个输入片段。
该光栅操作阶段立即更新帧缓冲区之前执行每个片段操作的最终序列。这些操作是OpenGL和Direct3D的一个标准部分。在这个阶段中,隐藏表面通过称为过程消除深度测试。其它的效果,如混合和基于模版遮蔽,在此阶段也可能发生。
光栅操作阶段检查的基础上大量的测试,包括剪刀,阿尔法,模板和深度测试的每个片段。这些测试包括片段的最终颜色或深度,像素的位置,以及每像素的值,如深度值和该像素的模板值。如果任何测试失败,这一阶段丢弃片段,而不更新像素的颜色值(虽然可能会发生模板写操作)。通过深度测试可替换片段的深度像素的深度值。试验后,混合操作结合的对应像素的颜色值的片段的最终颜色。最后,一个帧缓冲器写操作替换像素的与混合色的颜色。图1-5显示了这样的操作顺序。
图1-5显示了光栅操作阶段实际上本身就是一个系列管道阶段。事实上,所有先前描述的阶段可以被分解成substages为好。
图1-6示出了图形流水线的各阶段。在图中,两个三角形被光栅。该过程开始于顶点的变换和着色。接着,将原始装配步骤创建从顶点的三角形,如虚线表示。在此之后,光栅化“填写”与碎片的三角形。最后,从顶点的寄存器值被内插和用于纹理和着色。请注意,许多片段从几顶点生成。
在当今图形硬件设计的主流趋势是将GPU内公开更多的可编程性的努力。图1-7显示了在可编程GPU的流水线顶点处理和片段处理阶段。
如图1-7所示,比图1-3更详细的,但更重要的是,它显示分解成可编程单元顶点和片段处理。该可编程顶点处理器是运行你的CG顶点程序,而硬件设备可编程碎片处理器是运行你的CG片断程序的单位。
如第1.2.2解释,GPU设计的演变,以及GPU内部的顶点和片段处理器已经被配置成是可编程的转变。在接下来的两节中的描述呈现可编程顶点和片段处理器的关键功能特性。
图1-8示出了典型的可编程顶点处理器的流程图。用于顶点处理的数据流模型开始通过加载每个顶点的属性(如位置,颜色,纹理坐标,等等)插入顶点处理器。顶点处理器然后反复取出下一条指令,直到顶点程序终止执行它。说明访问几个不同的套包含矢量值,如位置,法线,或颜色寄存器银行。顶点属性寄存器是只读的,并包含应用程序指定的设置了顶点属性。临时寄存器可以读出和写入,并且用于计算的中间结果。输出结果寄存器是只写。该计划负责编写它的结果对这些寄存器。当顶点程序终止,输出结果寄存器包含新变换的顶点。三角形设置和光栅扫描之后,每个寄存器中的内插的值被传递到片段处理器。
最顶点处理使用操作的有限调色板。上的两个,三个或四个分量的浮点矢量矢量数学运算是必要的。这些操作包括加,乘,乘 - 加,点积,最小值和最大值。矢量否定和组件明智的交叉混合(任意重新排序向量组件的能力)硬件支持推广这些向量运算指令提供否定,减法,交叉产品。组件的方式写屏蔽控制的所有指令的输出。结合倒数,倒数平方根运算矢量乘法和点产品,分别实现矢量 - 标司和矢量归。指数,对数,和三角函数的近似促进照明,雾和几何计算。专用指令可以使照明和衰减功能更易于计算。
进一步的功能,例如相对寻址为分支和循环常数和流量控制支持的,也就是在较近期的可编程顶点处理器可用。
可编程片段处理器需要许多相同的数学运算的可编程顶点处理器做的,但它们也支持纹理操作。纹理操作使处理器使用一组纹理坐标的访问纹理图像,然后返回纹理图像的一个过滤的样品。
较新的GPU提供了浮点值的全力支持; 老的GPU更有限的定点数据类型。即使当浮点运算是可用的,使用较低精度数据类型时片段操作经常更有效。图形处理器必须在一旦任意分支不在当前GPU的世代可处理如此多的片段,但这很可能作为硬件的发展随时间而改变。CG还允许您编写该分支片段程序并通过模拟这种构造条件赋值操作或循环展开迭代。
图1-9示出了用于当前可编程片段处理器的流程图。作为具有可编程顶点处理器,所述数据流包括执行指令序列,直到程序结束。再次,有一组输入寄存器。然而,而不是顶点属性,碎片处理器的只读输入寄存器包含从插入片段的原语的每个顶点的参数得出每个片段参数。读/写临时寄存器存储的中间值。写操作只写输出寄存器成为颜色和任选片段的新的深度。片段程序指令包括纹理拾取。
在GPU这两个可编程处理器需要你,应用程序员,提供为每个处理器来执行的程序。什么CG提供的是一种语言,可以你的阴影算法翻译成你的GPU硬件可以执行的形式的编译器。随着CG,而不是在图1-8和1-9所示的水平程序,你可以在一个非常相似的C.高级语言编程
CG的文物来自三个方面,如图1-10。首先,CG据以对通用C编程语言的语法和语义。第二,CG包含从由学术界开发离线着色语言如RenderMan规范,以及现有硬件着色语言许多概念。三,CG立足于对实时3D的OpenGL和Direct3D程序编程接口的图形功能。
图1-11示出了通用的编程语言,3D应用编程接口,并且激发了CG的发展着色语言。
此前,我们提到CG如何利用C'S语法和语义。在这本书的过程中,你会发现,大部分CG做什么C程序员期望。CG不同于在任何CG的专门用于GPU的性能或证明发生变化的情况下进行。
NVIDIA与微软合作开发的CG语言。微软称它实现高级着色器语言,或HLSL的简称。HLSL和CG是相同的语言,但反映每个公司使用识别语言及其底层技术的不同的名字。HLSL是微软的DirectX显卡方面,DirectX 9的多媒体框架的一个组成部分的一部分。Direct3D是微软的DirectX图形的3D组件。CG是独立的3D程序接口,并完全不是的Direct3D或OpenGL集成。一个正确编写的CG应用程序可以写一次,然后用OpenGL或Direct3D的工作。
这种灵活性意味着NVIDIA的CG实现提供一种方式来笔者,既主导3D编程任何操作系统选择界面和工作方案。CG作品无论你选择Windows,Linux和Mac OS X中,游戏控制台,或嵌入3D硬件为您的3D计算平台。Cg程序与硬件的工作来自多个硬件厂商,因为CG层在干净的Direct3D两种或OpenGL。Cg程序从所有主要的图形硬件厂商,如3DLABS,ATI,的Matrox和NVIDIA可编程GPU工作。
编写可编程GPU程序时的CG语言的多厂商,跨API和多平台的特性使得它的最佳选择。
该RenderMan的接口标准描述了非交互式阴影最知名的着色语言。皮克斯开发的语言在80年代后期,以产生高品质的电脑动画与先进的阴影为电影及广告。皮克斯创造了一个完整的渲染系统,其实施的RenderMan接口标准,离线渲染PRMan(照相真实感的RenderMan)的。该RenderMan规范只是一个该系统的组成部分。
为RenderMan规范的灵感来自早期的想法称为绿树掩映。罗布库克,然后在卢卡斯电影公司,后来剥离了皮克斯公司,于1984年发表了一篇关于绿树掩映一个SIGGRAPH论文树荫举办各种着色等运算为树结构中的节点。图1-12显示了渲染铜表面树荫。叶节点是数据输入到树荫。在非叶节点代表简单着色操作。在渲染的过程中,渲染器的计算结果与给定的表面相关联,以确定渲染图像中的表面的颜色的灯罩的树。为了评估树荫,渲染器执行与在树荫下树的最顶层节点关联的着色操作。然而,要评估的给定节点,渲染器必须首先评估该节点的子节点。此规则适用于递归全面评估树荫。在一个表面上的给定点树荫评价的结果是该点的颜色。
绿树掩映脱胎于实现对所有人们可能会想渲染的对象和场景一个预定义的着色模型绝不会是足够的。
树荫图是伟大的可视化着色等运算的数据流。但是,如果遮荫树是复杂的,他们的图表尾大不掉。皮克斯的研究人员和其他地方认为每个荫树是一个有限的一种程序。这样就实现了一种新型的已知为着色语言的编程语言提供了动力。
该RenderMan规范的前身是绿树掩映,并且呈现表面的追求写实的外观的开放式控制需要编程实现。
在实际生产中使用的今天,大多数离线渲染有着色语言某种类型的支持。该RenderMan规范是历史最悠久和离线渲染最有名的,它被显著检修,并在90年代后期扩展。
当任务分解成阶段,其中每个阶段的通信被限制在其前阶段和其后级的长序列(即,当它可以被流水线)的算法的硬件实现是最有效的。
第1.2节中所描述的,基于片段顶点为基础的管道是非常适合硬件实现。然而,通过照相真实感的RenderMan使用的雷耶斯算法并不十分适合于高效的硬件实现,主要是由于它的较高级别的几何处理。当代的GPU基于顶点和片段图形管线完全依靠。
在北卡罗莱纳州(UNC)大学的研究始于上世纪90年代中期调查可编程图形硬件,当联合国军司令部正在开发一种新的可编程图形硬件架构,称为PixelFlow。该项目促进了计算机图形学研究的一个新的行成由Marc Olano硬件服从着色语言和其他在UNC。不幸的是,PixelFlow太贵和商业失败。
随后,研究人员在Silicon Graphics工作的系统上翻译成着色器OpenGL渲染多次通过。尽管目标OpenGL硬件没有在这样的GPU编程今天,在OpenGL着色系统编排大量的渲染通道,实现了着色器的预期效果。
斯坦福大学研究人员,包括Kekoa Proudfoot,比尔·马克,斯韦托斯拉夫Tzvetkov,和Pat Hanrahan的,开始建造专门为第二代和第三代的GPU而设计的着色语言。这种语言,被称为斯坦福实时着色语言(RTSL),可以编译写在RTSL着色器到一个或多个OpenGL渲染通行证。
在斯坦福研究激发了NVIDIA自身的努力来开发商业品质的硬件适合着色语言。比尔马克于2001年加入NVIDIA带头努力,制定并实施了着色语言我们现在称之为CG。在此期间,NVIDIA与微软合作,在共同语言的语法和功能集认同。
在CG的第三个影响是一对标准的3D编程接口,OpenGL和Direct3D。在CG这些编程接口的影响仍在进行,如在下一节中解释。
CG只是一个整体的软件和硬件基础设施,渲染复杂的3D场景与实时价格可编程GPU的组成部分。本节将介绍如何CG实际的3D应用程序和游戏交互。
在PC上的3D图形过去(前有图形处理器),则CPU处理的所有的顶点变换和渲染3D场景所需像素推任务。图形硬件提供的硬件显示在屏幕上的象素仅在缓冲。程序员不得不在软件中实现自己的3D图形渲染算法。从某种意义上说,有关的顶点和片段处理一切回到当时完全可编程的。不幸的是,CPU是产生引人注目的3D效果太慢。
这些天来,3D应用程序不再实施自己的3D渲染使用的CPU的算法; 相反,他们依靠OpenGL或Direct3D的,这两个标准的3D编程接口,沟通渲染命令到GPU。
在90年代初期,Silicon Graphics公司开发的OpenGL协同叫了OpenGL架构评审委员会(ARB)的组织,该组织由所有主要的计算机图形系统供应商。原来,OpenGL的只跑了强大的UNIX图形工作站。微软的ARB的创始成员,然后实现OpenGL作为的方式来支持它的Windows NT操作系统的3D图形。微软后来添加的OpenGL支持Windows 95和所有微软的桌面操作系统。
的OpenGL不限于单一的操作或窗口系统。除了支持UNIX工作站和Windows PC时,OpenGL是由苹果公司为它的Macintosh个人计算机上的支持。Linux用户可以使用的OpenGL梅萨开放源代码实现或硬件加速实现,如NVIDIA的OpenGL驱动程序的Linux版本。这种灵活性使OpenGL的业界最佳的跨平台编程接口,3D图形。
在过去的十年中,OpenGL的已与图形硬件一起发展。OpenGL是可扩展的,这意味着OpenGL的实施者能够以增量的方式来OpenGL的添加新功能。如今,OpenGL扩展的分数所有最新的GPU功能的访问。这包括顶点和片段可编程ARB-标准化扩展。作为扩展被建立,它们经常滚入芯OpenGL标准,使得标准作为一个整体的进步。在写这篇文章的时候,OpenGL的当前版本是1.4。正在进行的工作演变OpenGL是在不同的OpenGL ARB工作组正在进行中。这项工作包括装配层次和高层次的编程接口。由于CG这样的接口层以上的操作时,它会继续以兼容的方式OpenGL的未来修订工作。
微软开始开发约1995年的Direct3D程序编程接口作为多媒体的DirectX计划的一部分。Direct3D是编程接口构成的DirectX之一。微软推出的DirectX和Direct3D,以启动消费市场对3D图形,特别是游戏,在Windows PC上。微软的Xbox游戏机还支持Direct3D的。Direct3D是在Windows游戏最流行的图形API,由于其紧密匹配可用的图形硬件的功能历史。
每一年左右的时间,微软已经更新的DirectX,包括Direct3D的,跟上PC硬件创新的快速发展。的DirectX在写这篇文章时的当前版本是支持DirectX 9,其中包括HLSL,微软的实施同一种语言的语法和结构在CG中发现的。
几年前,OpenGL和Direct3D竞争,看看哪些编程接口将占据主导地位,尤其是在Windows个人电脑的领域。竞争仍然是好的两个编程接口,并且每个在性能,质量和功能有所改善。在到Cg解决的GPU编程的区域,这两个编程接口具有可比较的能力。这是因为这两个OpenGL和Direct3D在相同GPU硬件运行和图形硬件确定可用的功能和性能。OpenGL的有轻微的优势功能,因为硬件厂商能够更好的暴露自己的全部功能,通过OpenGL的设置,但具体供应商的扩展做添加一些复杂性的开发。
大多数软件开发人员现在选择基于程序员的偏好,历史,他们的目标市场和硬件平台,而不是基于技术理由三维编程接口。
CG既支持编程接口。你可以写Cg程序,使他们与无论是OpenGL或Direct3D的编程接口工作。这是3D内容开发者一个巨大的福音。他们可以对自己的3D内容写在CG程序,然后呈现内容不管什么编程接口的最终应用程序使用3D渲染。
没有GPU可以直接从他们的文字形式执行Cg程序。被称为编译进程必须Cg程序翻译成该GPU可以执行的形式。重心编译器首先会将您的CG程序到应用程序的选择3D编程接口接收的形式,OpenGL或Direct3D的。然后,你的应用程序中的CG程序的OpenGL或Direct3D的翻译转移到使用适当的OpenGL或Direct3D的命令GPU。在OpenGL或Direct3D的驱动程序执行的最后翻译成硬件可执行形成你的GPU需要。
这个翻译的细节取决于GPU和3D编程接口的综合能力。一个CG程序如何编译它的中间OpenGL或Direct3D的形式取决于GPU的计算机类型和生成。这可能是你的显卡是不是能够支持,因为GPU本身的局限性的特定有效地Cg程序。例如,如果你的程序不是你的目标GPU支持访问更多纹理单元的CG片段程序将无法编译。
当你编译一个程序与传统的编程语言如C或C ++,汇编是一种离线的过程。你的编译器编译程序为直接运行在CPU上的可执行文件。一旦编译,你的程序不需要重新编译,除非你改变程序代码。我们称之为静态编译。
CG是不同的,因为它鼓励动态编译,虽然静态编译也支持。重心编译器是不是一个单独的程序,但被称为CG运行时库的一部分。使用Cg程序的3D应用程序和游戏必须使用CG运行时链接。使用CG然后调用CG运行时例程,都以字母前缀的应用CG,编译和操纵Cg程序。动态编译允许Cg程序,为安装在用户的计算机GPU的特定模型进行优化。
除了核心运行时CG,CG提供了两个密切相关的库。如果您的应用程序使用OpenGL,您将使用CgGL库调用适当的OpenGL程序到你的翻译CG程序传递给OpenGL驱动程序。同样,如果您的应用程序使用Direct3D,您将使用CgD3D库调用适当的Direct3D程序到你的翻译CG程序传递给Direct3D的驱动程序。通常情况下,你会请使用CgGL或CgD3D库,但不能同时,因为大多数应用程序使用OpenGL或Direct3D的,不能同时使用。
与包含CG编译芯CG运行时库相比,CgGL和CgD3D库都比较小。他们的工作是做适当的OpenGL或Direct3D的要求您配置Cg程序执行。这些调用翻译的CG程序传送到相应的驱动程序,将程序进一步翻译成你的GPU可以执行的形式。在大多数情况下,该CgGL和CgD3D库也有类似的例程。在CgGL库的程序首先cgGL ;在CgD3D库中的例程开始cgD3D。
图1-13显示了一个典型的3D应用程序如何使用CG库。如果你是一个程序员,你会想了解更多的CG运行时,为3D API应用程序使用,以渲染3D图形的专用库。本书的大部分集中于CG语言本身和如何编写Cg程序,但附录B有大约CG运行时库的更多信息。
Cg程序需要的3D模型,纹理和其它数据进行操作。没有任何相关的数据的CG程序是没用的。Cg程序和数据也需要正确的3D编程接口配置和状态。它往往是有帮助的方式来捆绑所有的渲染3D模型,包括其相关的CG程序所需要的信息。
CgFX的是代表完全的效果和外观标准化的文件格式。当他们用CG做,微软和NVIDIA合作开发的CgFX格式。的CgFX文件是基于文本的,具有一个语法是CG的的超集,并可以含有任何数量的Cg程序的。该的.fx后缀标识的CgFX文件。一个CgFX的文件描述了完整的呈现状态的特定效果:多遍,纹理状态和任意数量的单个顶点和片段程序可能会被定义为创建一个完整的外观或效果。一位随行的开发工具包提供了一种使用和解析的CgFX文件。该工具包暴露用户界面挂钩主机应用程序,从而使的CgFX的应用程序可以自动提供有意义的控制和语义用户和开发者的一致好评。
Cg程序描述顶点或片段处理,发生在一个单一的渲染通道,但有些复杂的着色算法需要的多个渲染通道。的CgFX提供编码复杂的多次效果的格式,其中包括CG程序用于每个渲染传递指定。
更具体地说,支持的CgFX超出了核心CG语言支持三个附加的功能:
该CgFX的文件格式封装为一个给定的着色器Cg程序的多个实现。这意味着你可以有一个第三代或第四代GPU写了一个CG着色器程序,同时还包括一个支持能力较差,第二代GPU的简单程序。加载的CgFX文件可以在运行时确定最合适的着色器的实现应用程序使用基于计算机的可用的GPU。
与CgFX的Cg程序的多个实例,以解决不同代或不同硬件厂商的GPU功能变化的一种方式。多个实例,您还可以开发专门为特定的3D API,例如一个CG程序,如果通过OpenGL的一个扩展暴露出额外的功能。专门用于Direct3D的,标准的OpenGL,或OpenGL扩展名为Cg程序都可以被包含在单个的CgFX文件。
该工具包的CgFX包含的CgFX编译器,它支持完整的CgFX语法; 在的CgFX运行时API,用于加载和处理的CgFX文件; 和插件模块主要数字内容创作(DCC)应用,如别名| Wavefront公司的Maya和Discreet的3ds Max软件。图1-14显示了这些应用程序利用的CgFX的。SOFTIMAGE | XSI 3.0提供了在其渲染的CG树编译直接支持。
之前的CgFX,有的DCC应用到3D内容导出了所有必要的相关着色知识来呈现实时内容没有标准的方式。现在各大DCC应用在他们的内容创建过程中使用的CgFX和支持的CgFX文件格式。这意味着它们的CgFX可以显著改善由DCC应用到的实时游戏和其他3D应用的艺术工作流程。使用的CgFX,艺术家可以查看和调整CG着色器和相关的3D内容看,从他们的选择的DCC工具中的工作怎么会出现在3D游戏或应用程序。
图1-15显示了如何包含多个实例化的着色器的CgFX文件由与CG运行时和您的渲染API的选择相结合的应用程序。本书的大部分集中于CG语言本身和如何编写Cg程序,而不是CgFX的,但请参阅附录C有关的CgFX文件格式和其相关的运行时API的更多信息。
说完这个介绍CG编程语言,你现在准备采取教程章,将教你如何编写Cg程序。
在每一章帮助最终的练习,你检查你的知识和开发实用编程技巧。
回答这个问题:名您可以编译Cg程序两种标准的3D编程接口。什么操作系统每个编程接口的支持?
回答这个问题:什么是图形管线的主要阶段?按照什么顺序阶段安排?
回答这个问题:在哪里顶点和片段程序融入管道?
回答这个问题:什么是顶点?什么是片段?区分从像素的片段。
这个尝试自己:我们还没有开始写Cg程序,但(我们会到达那里很快在接下来的章节),所以休息一下,看一个良好的长篇计算机图形动画,如怪物公司
CG生成的计算机语言设计,计算机硬件设计和计算机图形学概念的主机上。对得住在本教程的上下文中的所有这些贡献并不总是可行的。我们试图在“延伸阅读”部分中每章的结尾是什么,为您提供指向更多地了解背后的主题在每章的贡献。
有很多在书本C. C程序设计语言,第三版(Prentice Hall出版社,2000年),由Brian Kernighan和丹尼斯里奇,是一个典型的; 作者发明了C语言。CG包括来自C和C ++的概念。现在有可能实际上是关于C更多的书籍比++约C.经典的C ++的书是在C ++编程语言,第三版(Addison-Wesley出版社,2000年),由Bjarne Stroustrup的,是谁发明的语言。
要了解更多关于RenderMan规范,阅读的伴侣的RenderMan:程序员指南真实感图形学(Addison-Wesley出版社,1989年),由史蒂夫Upstill。帕特汉拉汉和吉姆·罗森发表了有关的RenderMan一个SIGGRAPH论文名为“用于着色和光照计算的语言”(ACM出版社)于1990年。
罗伯特·库克1984年SIGGRAPH论文标题为“行道树”(ACM出版社)动机的RenderMan的发展。
可编程图形硬件及其相关语言的发展一直是积极和富有成果的研究领域工作近十年。安塞尔莫拉斯特拉,史蒂芬莫尔纳,马克Olano和玉兰王在联合国军司令部于1995年名为“实时可编程着色”(ACM出版社)出版的早期的研究论文。在北卡罗来纳大学的研究人员也发表了他们的可编程PixelFlow图形架构了多篇论文。马克Olano和安塞尔莫拉斯特拉发表了题为“关于图形硬件着色语言:本PixelFlow遮阳系统”一文SIGGRAPH 1998年(ACM出版社)。
Kekoa Proudfoot,比尔·马克,斯韦托斯拉夫Tzvetkov,和Pat Hanrahan的发表了题为“一个实时可编程图形硬件程序遮阳系统”(ACM出版社),描述在斯坦福大学开发了面向GPU的着色语言在2001年SIGGRAPH论文。
实时渲染,第二版(AK彼得斯,2002年),由埃里克·海恩斯和Tomas Akenine -默勒写的,是关于图形硬件和互动技术的进一步信息的绝佳资源。
显卡的OpenGL系统:规范记录了OpenGL三维编程接口。学习的OpenGL编程最好的教程是OpenGL的编程指南:官方指南学习的OpenGL,第三版(Addison-Wesley出版社,1999年),由梅森佑,成龙Neider,汤姆·戴维斯和Dave Shreiner。该www.opengl.org网站提供上涨约OpenGL的更多的信息。
为Direct3D的编程接口文档可从微软的msdn.microsoft.com网站。
NVIDIA提供了有关CG运行时,CgFX以及CG本身在其开发者网站的详细信息developer.nvidia.com/Cg。
本章有以下四个部分:
这本书教你如何使用名为CG的编程语言。对CG语言使您能够控制形状,外观和使用可编程图形硬件绘制的物体的运动。它娶这些属性以令人难以置信的速度和今天的图形处理器的功能进行编程控制。从未有过计算机图形学的从业者,无论是艺术家还是程序员,有超过它们所产生的实时图像那么多的控制。
CG为开发者提供一个完整的编程平台,易于使用,并且能够快速创建多个平台上的特殊效果和实时影院级体验。通过提供一个新的抽象水平,CG不再需要为开发者直接编程图形硬件汇编语言,从而更容易瞄准的OpenGL,DirectX的,在Windows,Linux,苹果OS X和游戏机平台如Xbox。CG是在与微软公司密切合作开发,并与OpenGL的API和微软的高级着色器语言(HLSL)支持DirectX 9.0兼容两种。
CG表示“C图形”。C编程语言是在20世纪70年代发明了一种流行的,通用的语言。由于其知名度和简洁的设计中,C为若干后续编程语言提供了基础。例如,C ++和Java的基础语法和结构在很大程度上C.重心语言立足于C作为好。如果你熟悉C或从C产生的许多语言之一,那么CG将是简单易学。
在另一方面,如果你不熟悉一般的C或甚至编程语言,但是你享受电脑的图形和想学习新的东西,反正阅读。Cg程序往往是短期和理解的。
大部分本章是背景了解CG和有效地使用它提供有价值的背景。在另一方面,你可能会发现CG更容易做来学习。随意在任何时候,如果你感觉更舒服刚刚潜入教程跳到第2章。
CG是C,C ++和Java不同,因为它是非常专业的。没有人会写在CG电子表格或字处理程序。相反,CG靶向以编程方式控制的形状,外观,并使用图形硬件呈现的对象的运动的能力。概括地说,这种类型的语言的被称为着色语言。然而,CG能做的不仅仅是更多的阴影。例如,Cg程序可以进行物理模拟,合成等nonshading任务。
一个CG程序看作一个详细的食谱如何使用可编程图形硬件渲染的对象。例如,你可以写一个CG程序,使表面出现凹凸不平,或者以动画一个虚拟人物。后来,在1.3节中,您将了解更多有关着色语言的历史并在CG融入这段历史。
除了被专门用于图形,因为它们是基于数据流的计算模型CG和其他着色语言是从传统的编程语言中的不同。在这样的模型中,计算出现在响应于数据流经的处理步骤的序列。
Cg程序顶点和片段(想想“像素”现在,如果你不知道一个片段是什么)正在呈现图像时处理工作。认为一个CG程序作为黑箱到哪些顶点或片段在一侧流动的,在某种程度上改变,然后流出在另一侧。然而,箱子是不是一个真正的黑盒子,因为你来决定,由你写的Cg程序的手段,里面究竟发生了什么。
每当一个顶点处理或光栅生成一个片段在呈现3D场景,你的相应的顶点或片段CG程序执行。1.3节进一步解释CG的数据流模型。
最近的个人电脑和所有最新的游戏机,包括专用于图形任务,如转换和光栅化三维模型的图形处理单元(GPU)。您的Cg程序实际上您的计算机的GPU内执行。
不论是否在个人计算机或游戏控制台具有GPU的,必须有在运行操作系统和应用程序的CPU。CPU是按照设计,通用的。的CPU执行的应用程序(例如,文字处理器和计费包)写入通用语言,如C ++或Java。
因为GPU的专门设计的,它是在图形任务,诸如渲染3D场景,比通用CPU会快得多。新的GPU处理数以千万计的每秒顶点和光栅化数亿甚至数十亿每秒的片段。未来的GPU会更快速。这是压倒性比在其中的CPU可以处理类似的顶点和片段的数目的速度快。然而,GPU无法执行相同的随意性,通用程序,一个CPU可以。
GPU的专业化,高性能的本质就是CG的存在。通用编程语言过于开放式的处理顶点和片段的专门任务。与此相反,CG语言是完全致力于此任务。CG还提供了GPU的执行模式相匹配的抽象执行模型。您将了解在第1.2节GPU的唯一执行模型。
为了保持互动的错觉,3D应用程序需要保持每秒15或多个图像的动画速度。通常,我们考虑每秒60或更多的帧是“实时”的速率与应用程序的交互出现瞬间发生。计算机的显示屏上也可能需要重画一万以上像素。对于3D场景中,GPU通常处理在屏幕上多次的每个像素以考虑对象如何阻塞彼此,或以提高每个像素的外观。这意味着,实时3D应用可能需要数亿每秒像素更新。以及所需的象素处理,3D模型是由它们被组装成多边形,线和点将被光栅化为像素之前必须正确地变换顶点。这可能需要改变数千万每秒顶点。
此外,该图形处理发生在除了更新为每个新的图像的动画所需的CPU的相当大的努力。现实情况是,我们需要CPU和GPU的专门面向图形的能力。两者都需要呈现在交互式率场景和质量标准的3D应用程序和游戏需求的用户。这意味着开发人员可以编写C ++中的3D应用程序或游戏,然后用CG制作的最GPU的额外的图形马力。
决不做CG替换任何现有的通用语言。CG是一种辅助语言,专门为GPU的设计。在常规语言,例如C或C为CPU写的程序++可以使用CG运行时(在第1.4.2节中所述)来加载Cg程序为GPU来执行。重心运行是一套标准,用于加载,编译,操作和配置Cg程序由GPU执行子程序。应用程序供应Cg程序指导如何实现可编程的渲染效果,否则不会有可能在渲染率GPU能够实现的CPU在GPU上。
CG能够并行处理的专业风格。同时您的CPU执行的常规应用,该应用程序也编排顶点和片段的并行处理在GPU上,通过写入Cg程序。
如果一个实时着色语言是一个好主意,为什么没有人发明CG越快?答案与计算机图形硬件的演进做。2001年之前,大多数计算机图形硬件的肯定的种类中的PC和游戏便宜的图形硬件的游戏机-被硬连线到顶点和片段的处理的特定任务。通过“硬连线”,我们的意思是,该算法被固定在硬件内,如在一个方式,是对图形应用程序可访问的反对是可编程的。即使这些硬接线图形算法可以由图形应用程序以各种方式来配置,则应用程序不能重新编程的硬件做由硬件的设计者意料之外的任务。幸运的是,这种情况发生了变化。
图形硬件设计的进步,以及顶点和片段处理单元在最近的GPU真正可编程的。可编程图形硬件问世之前,有在提供一种编程语言为它没有任何意义。现在,这样的硬件是可用的,有一个明确的需要,使其更容易向此硬件进行编程。CG使得它更容易在C制备更容易编程的CPU相同的方式GPU的编程。
CG存在之前,针对GPU的可编程能力,只有通过低级别的汇编语言是可能的。该神秘指令语法和汇编语言,如DirectX 8的顶点和像素着色器和OpenGL的一些需要人工硬件寄存器操作的扩展,使得它对于大多数开发人员一个痛苦的任务。随着GPU技术制成更长,可能更复杂的汇编语言程序,需要有一个高层次的语言变得清晰。已被要求达到最佳性能的广泛低级编程现在可以委托给编译器,优化代码输出,并处理繁琐指令调度。图1-1是用于表示皮肤的复合汇编语言片段程序的一小部分。显然,这是很难理解,特别是在向硬件寄存器的具体引用。
。。。 DEFINE LUMINANCE = {0.299,0.587,0.114,0.0}; TEX H0,F [TEX0],TEX4,2D; TEX H1,F [TEX2],TEX5,CUBE; DP3X H1.xyz,H1 LUMINANCE; MULX H0.w,H0.w,LUMINANCE.w; MULX H1.w,H1.x,H1.x; MOVH H2,F [TEX3] .wxyz; MULX H1.w,H1.x,H1.w; DP3X H0.xyz,H2.xzyw,H0; MULX H0.xyz,H0,H1.w; TEX H1,F [TEX0],TEX1,2D; TEX H3,F [TEX0],TEX3,2D; MULX H0.xyz,H0,H3; MADX H1.w,H1.w,0.5%,0.5; MULX H1.xyz,H1,{0.15,0.15,1.0,0.0}; MOVX H0.w,H1.w; TEX H1,H1,TEX7,CUBE; TEX H3,F [TEX3],TEX2,1D; MULX H3.w,H0.w,H2.w; MULX H3.xyz,H3 H3.w; 。。。
相比之下,注释良好企业管治守则是更便携,更清晰,更容易调试,更易于重用。CG为您提供了一个高层次的语言的优势,如C,同时提供的低级汇编代码的性能。
CG是编程语言“中的小。” 这使得它要比一个现代的通用语言如C ++简单。由于CG专业变换顶点和片段,它不目前包括许多大规模的软件工程任务所需的复杂的功能。与C ++和Java,CG不支持面向对象的编程中使用类和其他功能。当前CG实现不提供指针,甚至内存分配(尽管未来实现可能和关键字适当保留)。CG有文件输入/输出操作绝对没有支持。总的来说,这些限制都没有在语言永久的限制,而是仅指示今天的最高性能GPU的能力。随着技术的进步,以允许在GPU上更普遍的可编程性,你可以期望CG适当地生长。由于CG是密切基于C,未来CG的更新很可能会采取从C和C ++语言特性。
CG提供了数组和结构。它具有所有现代语言的流控制结构:循环,条件和函数调用。
CG原生支持向量和矩阵,因为这些数据类型和相关的数学运算的显卡根本,最图形硬件直接支持矢量数据类型。CG有一个函数库,称为标准库,这是非常适合的那种图形所需的操作。例如,CG标准库包括反映用于计算反射的载体功能。
Cg程序执行相对隔离。这意味着一个特定顶点或片段的处理,对在同一时间处理的其他顶点或片段没有影响。有没有副作用至CG程序的执行。这种缺乏顶点和片段之间的相互依存使得CG软件中极其由高度流水线和并行硬件非常适合硬件执行。
当您在专为使用现代操作系统现代CPU的语言写一个程序,你期望一个更或多或少任意程序,只要它是正确的,将编译并正确执行。这是因为处理器,由设计,执行用于该整个系统具有比足够的资源更多的通用方案。
然而,GPU是专门的,而不是通用的,和GPU的功能集仍在发展。没有你可以在CG写什么都可以编译在一个给定的GPU执行。CG包括硬件的概念“配置文件”,其中之一的你,当你编译程序的CG指定。每个轮廓对应于GPU架构和图形API的特定组合。您的方案不仅必须是正确的,但它也必须自己局限在由用于编译程序的CG特定的简施加的限制。例如,一个给定的片段简档可以限制你每片段不超过四个纹理存取。
随着GPU的发展,更多的配置文件将被CG对应于更强大的GPU架构的支持。今后,型材将不太重要,因为图形处理器变得更加功能全面。但现在CG程序员需要限制方案,以确保他们能够编译并执行现有的GPU。在一般情况下,未来的轮廓将是电流分布超集,以便为当今的型材编写的程序编译,而无需使用未来轮廓变化。
这种情况可能听起来限制,但在实践上千万的GPU的这本书表现出的一个Cg程序,并产生令人信服的渲染效果。另一个原因限制程序的大小和范围的是,更小的和更有效的Cg程序是,它们将运行速度更快。实时图形往往是如何去平衡增加场景的复杂性,动画率,并提高阴影。所以这是一件好事通过明智的CG编程以最大限度地提高渲染效率。
请记住,由配置文件规定的限制确实目前的GPU,而不是CG的限制。重心的语言是强大到足以表达着色技术,还不可以与所有的GPU。随着时间的推移,GPU功能将演变远远不够,CG配置文件将能够运行复杂的惊人Cg程序。CG是当前和未来的GPU的语言。
为了把CG成适当的情况下,你需要了解如何GPU的渲染图像。本节介绍了图形硬件将如何发展,然后探讨了现代图形硬件渲染管线。
计算机图形硬件以令人难以置信的速度推进。三种力量正在推动创新的这种快速的节奏,如图1-2。首先,半导体产业一直致力于增加一倍晶体管适合于微芯片每18个月的数量(计算机硬件的基本单位)。电脑电源的这种不断的加倍,历史上被称为摩尔定律,意味着更便宜,更快的计算机硬件,是我们这个时代的常态。
第二个力的计算来模拟我们周围的世界所需要的大量。我们的眼睛和消费我们的大脑以惊人的速度,并以惊人的敏锐理解我们的3D世界影像。我们永远不可能达到一个地步,计算机图形成为现实的替代品。现实是太真实。毫不气馁,计算机图形学从业人员继续迎接挑战。幸运的是,生成图像是一个尴尬的并行问题。我们所说的“尴尬的并行”,是图形硬件设计人员可以反复拆散创建逼真的图像,投入到工作中的多个块更小,更容易解决问题。然后硬件工程师可以安排,并联的晶体管可在越来越大的数目来执行工作的所有这些不同的块。
我们的第三个力是持续的愿望,我们都必须受到刺激和视觉娱乐。这是“连接”提供了计算机的硬件资源续加倍的源永远比以前更真实近似视觉现实的任务的力。
如图1-2所示,这些见解让我们满怀信心地预言,计算机图形硬件是会得到更快。这些创新激起我们的集体胃口更多的互动和引人入胜的3D体验。满足这个需求是什么激发了CG语言的发展。
在90年代中期,世界上最快的图形硬件组成的那共同努力,使图像并将其显示在屏幕的多个芯片。最复杂的计算机图形系统由几十个分布在多个电路板芯片。随着时间的推移和半导体技术的提高,硬件工程师纳入复杂的多芯片设计的功能集成到一个单一的图形芯片。这种发展导致了整合和规模巨大的经济体。
你可能会惊讶地得知,现在GPU超过出现在每个微芯片晶体管数量的CPU。晶体管数量是多少计算机硬件专门的微芯片粗略衡量。例如,英特尔的包装2.4 GHz奔腾4 55亿个晶体管; NVIDIA使用超过125万个晶体管,在原有的GeForce FX GPU。
NVIDIA推出了在90年代末的术语“GPU”的时候,传统的术语“VGA控制器”已不再是图形硬件的PC中的准确描述。IBM推出了视频图形阵列(VGA)的硬件在1987年当时,VGA控制器是我们现在所说的“哑”帧缓冲区。这意味着在CPU负责更新所有的像素。今天,CPU很少直接操纵像素。相反,图形硬件设计师打造的像素更新的“智慧”进入GPU。
行业观察家已经确定了GPU的进化四代至今。每一代人提供了更好的性能和GPU功能集的演变可编程性。每一代也影响和集成了两个主要的三维编程接口,OpenGL和DirectX的功能。OpenGL是一个开放的标准为3D编程用于Windows,Linux,UNIX和Macintosh计算机。DirectX是微软的多媒体编程接口,包括对Direct3D的3D编程的一组不断发展。
之前引进的GPU,公司如Silicon Graphics公司(SGI)和埃文斯和萨瑟兰设计专业和昂贵的图形硬件。这些公司开发的图形系统推出了很多的概念,如顶点变换和纹理映射,我们今天认为理所当然。这些系统是计算机图形学的历史发展很重要,但因为他们是如此昂贵,他们并没有达到设计的PC和视频游戏机的单芯片GPU的大众市场的成功。今天,GPU是比任何现有的系统更强大,更便宜得多。
第一代的GPU(直至1998年),包括NVIDIA的TNT2,ATI的愤怒,而3dfx的Voodoo3的。这些GPU能够栅格化前的三角形转化和应用一个或两个纹理。他们还实施了DirectX 6的功能集。当运行大多数3D和2D应用程序,这些GPU完全免除更新单个像素的CPU。然而,在这一代的GPU从两个明确的限制的影响。第一,他们缺乏变换3D对象的顶点的能力; 相反,发生在CPU中顶点变换。第二,它们具有一组相当有限的数学运算的用于组合的纹理来计算光栅化的像素的颜色。
第二代GPU(1999- 2000年)包括NVIDIA的GeForce 256和GeForce2的,ATI的Radeon 7500,和S3的的Savage3D。这些GPU卸载从CPU的3D顶点变换和光照(T&L)。快速顶点变换是在此之前这一代分化高端工作站从个人电脑的主要功能之一。OpenGL和DirectX 7的支持硬件顶点变换。虽然结合在这一代扩大到包括立方体贴图纹理和签署数学运算的纹理和像素着色集数学运算,可能性仍然有限。换句话说,这一代是更可配置的,但仍然没有真正可编程的。
第三代GPU(2001),包括NVIDIA的的GeForce 3和钛的GeForce4,微软的Xbox和ATI的Radeon 8500。这一代人提供了可编程的顶点,而不是仅仅提供更多的可配置性。代替支承由OpenGL和DirectX 7中指定的常规转化和照明模式,这些GPU让应用程序指定的用于处理的顶点的指令序列。相当多的像素级可配置是可用的,但这些模式没有强大到足以被认为是真正的可编程。由于这些GPU支持可编程的顶点,但缺乏真正的像素可编程性,这一代是过渡性的。DirectX 8的和多厂商ARB_vertex_program OpenGL扩展暴露顶点级可编程性的应用程序。DirectX 8的像素着色器和各种供应商特定的OpenGL扩展揭露这一代人的片段级配置性。
第四和目前这一代的GPU(2002年以后),包括NVIDIA的GeForce FX系列的的CineFX架构和ATI的Radeon 9700图形处理器,这些都提供了顶点级和像素级的可编程性。可编程的这个水平开辟了从CPU到GPU卸载复杂顶点变换和像素着色操作的可能性。DirectX 9和各种OpenGL扩展揭露这些GPU的顶点级和像素级的可编程性。这是GPU的CG的地方变得非常有趣的产生。表1-1列出了选择代表这些不同代的GPU的NVIDIA GPU。
代 |
年 |
产品名称 |
处理 |
晶体管 |
反锯齿填充率 |
多边形率 |
注意 |
---|---|---|---|---|---|---|---|
第一 |
1998年晚期 |
RIVA TNT |
为0.25 中号 |
的7M |
50公尺 |
6M的 |
[1] |
第一 |
1999年早期 |
RIVA TNT2 |
0.22 中号 |
9米 |
7500万 |
9米 |
[2] |
第二 |
1999年晚期 |
的GeForce 256 |
0.22 中号 |
23男 |
120米 |
15米 |
[3] |
第二 |
2000年初 |
的GeForce2 |
0.18 中号 |
25男 |
200海里 |
25男 |
[4] |
第三 |
2001年初 |
的GeForce3 |
0.15 中号 |
57男 |
800米 |
30男 |
[5] |
第三 |
2002年初 |
钛的GeForce4 |
0.15 中号 |
63男 |
1200米 |
60男 |
[6] |
第四 |
2003年年初 |
的GeForce FX |
0.13 中号 |
125微米 |
2000 M |
200海里 |
[7] |
笔记 |
该表使用以下术语:
音符突出在每个设计中最显著的改进。性能利率不得与其他硬件厂商的设计相媲美。
未来的GPU将进一步概括目前的GPU的可编程方面,以及CG将会使这个额外的可编程易于使用。
一个管道是并行和以固定的顺序操作阶段的序列。每个阶段从现有阶段接收其输入,其输出发送到后续阶段。像数十汽车都在同一时间在不同阶段的行制造,每个汽车装配线,常规的图形硬件流水线处理的顶点,几何图元,和片段的以流水线方式众多。
图1-3显示了今天的图形芯片所使用的图形硬件管道。3D应用程序发送成批GPU进入几何图元的顶点的序列:典型的多边形,线条和点。如图1-4所示,有许多方式来指定几何图元。
每个顶点有一个位置,而且还通常有几个其他属性,例如颜色,仲(或镜面)色,一个或多个纹理坐标集,以及法线矢量。法线矢量指示表面面对在顶点什么方向,并且通常在照明计算中使用。
顶点变换是在图形硬件流水线第一处理阶段。顶点变换执行数学运算上的每个顶点的序列。这些操作包括转化顶点位置成由光栅使用屏幕上的位置,产生纹理坐标纹理和照明顶点,以确定它的颜色。我们将解释许多在后面的章节这些任务。
转化的顶点顺序流动到下一个阶段,称为原始装配和光栅扫描。首先,将原始的装配步骤组装的顶点为基于伴随顶点的顺序的几何图元配料信息几何图元。这导致的三角形,线,或点的序列。这些原语可能需要限幅的视锥(三维空间中的视图的可见光区),以及任何启用应用程序指定的剪辑平面。光栅也可以丢弃基于它们是否面临向前或向后多边形。这个过程被称为灭杀。
存活下来,这些剪报和扑杀措施多边形必须被光栅化。光栅是确定该组由一个几何图元覆盖的像素的过程。多边形,线和点根据每个类型的原始指定的规则的每个栅格化。光栅化的结果是一组像素位置以及一组片段。有顶点的原始拥有的数目和当它被光栅化产生的片段的数量之间没有任何关系。例如,一个三角形由刚刚三个顶点可能占用整个屏幕,并因此产生数百万碎片!
此前,我们告诉你想一个片段作为一个像素的,如果你没有确切地知道一个片段是什么。在这点上,然而,片段和像素之间的区别变得重要。术语像素是短期的“图像元素”。的像素表示该帧缓冲器中的特定的位置的内容,例如颜色,深度,和与该位置相关联的任何其他值。一个片段是更新的特定像素的潜在需要的状态。
术语“片段”是因为光栅打破了每个几何图元,例如三角形,到每个象素的原始封面像素大小的片段。片段具有相关联的像素的位置,深度值,和一组内插参数,诸如颜色,仲(镜面)的颜色,以及一个或多个纹理坐标集。这些各种内插参数从转化的顶点构成用于生成片段的特定的几何图元的。你可以把一个片段作为一个的“势像素”。如果一个片段通过各个光栅化试验(在光栅操作阶段,这是不久描述的),该片段更新在帧缓冲器中的像素。
一旦一个基元被光栅化为零个或多个片段的集合,该内插,纹理和着色阶段插值作为必要的片段的参数,执行纹理和数学运算的序列,并确定每个片段的最终颜色。除了 确定该片段的最终颜色,该阶段也可确定一个新的深度或甚至可丢弃该片段,以避免在更新帧缓冲区的对应的像素。允许该阶段可以丢弃碎片的可能性,这一阶段发出一个或零有色片段为接收每个输入片段。
该光栅操作阶段立即更新帧缓冲区之前执行每个片段操作的最终序列。这些操作是OpenGL和Direct3D的一个标准部分。在这个阶段中,隐藏表面通过称为过程消除深度测试。其它的效果,如混合和基于模版遮蔽,在此阶段也可能发生。
光栅操作阶段检查的基础上大量的测试,包括剪刀,阿尔法,模板和深度测试的每个片段。这些测试包括片段的最终颜色或深度,像素的位置,以及每像素的值,如深度值和该像素的模板值。如果任何测试失败,这一阶段丢弃片段,而不更新像素的颜色值(虽然可能会发生模板写操作)。通过深度测试可替换片段的深度像素的深度值。试验后,混合操作结合的对应像素的颜色值的片段的最终颜色。最后,一个帧缓冲器写操作替换像素的与混合色的颜色。图1-5显示了这样的操作顺序。
图1-5显示了光栅操作阶段实际上本身就是一个系列管道阶段。事实上,所有先前描述的阶段可以被分解成substages为好。
图1-6示出了图形流水线的各阶段。在图中,两个三角形被光栅。该过程开始于顶点的变换和着色。接着,将原始装配步骤创建从顶点的三角形,如虚线表示。在此之后,光栅化“填写”与碎片的三角形。最后,从顶点的寄存器值被内插和用于纹理和着色。请注意,许多片段从几顶点生成。
在当今图形硬件设计的主流趋势是将GPU内公开更多的可编程性的努力。图1-7显示了在可编程GPU的流水线顶点处理和片段处理阶段。
如图1-7所示,比图1-3更详细的,但更重要的是,它显示分解成可编程单元顶点和片段处理。该可编程顶点处理器是运行你的CG顶点程序,而硬件设备可编程碎片处理器是运行你的CG片断程序的单位。
如第1.2.2解释,GPU设计的演变,以及GPU内部的顶点和片段处理器已经被配置成是可编程的转变。在接下来的两节中的描述呈现可编程顶点和片段处理器的关键功能特性。
图1-8示出了典型的可编程顶点处理器的流程图。用于顶点处理的数据流模型开始通过加载每个顶点的属性(如位置,颜色,纹理坐标,等等)插入顶点处理器。顶点处理器然后反复取出下一条指令,直到顶点程序终止执行它。说明访问几个不同的套包含矢量值,如位置,法线,或颜色寄存器银行。顶点属性寄存器是只读的,并包含应用程序指定的设置了顶点属性。临时寄存器可以读出和写入,并且用于计算的中间结果。输出结果寄存器是只写。该计划负责编写它的结果对这些寄存器。当顶点程序终止,输出结果寄存器包含新变换的顶点。三角形设置和光栅扫描之后,每个寄存器中的内插的值被传递到片段处理器。
最顶点处理使用操作的有限调色板。上的两个,三个或四个分量的浮点矢量矢量数学运算是必要的。这些操作包括加,乘,乘 - 加,点积,最小值和最大值。矢量否定和组件明智的交叉混合(任意重新排序向量组件的能力)硬件支持推广这些向量运算指令提供否定,减法,交叉产品。组件的方式写屏蔽控制的所有指令的输出。结合倒数,倒数平方根运算矢量乘法和点产品,分别实现矢量 - 标司和矢量归。指数,对数,和三角函数的近似促进照明,雾和几何计算。专用指令可以使照明和衰减功能更易于计算。
进一步的功能,例如相对寻址为分支和循环常数和流量控制支持的,也就是在较近期的可编程顶点处理器可用。
可编程片段处理器需要许多相同的数学运算的可编程顶点处理器做的,但它们也支持纹理操作。纹理操作使处理器使用一组纹理坐标的访问纹理图像,然后返回纹理图像的一个过滤的样品。
较新的GPU提供了浮点值的全力支持; 老的GPU更有限的定点数据类型。即使当浮点运算是可用的,使用较低精度数据类型时片段操作经常更有效。图形处理器必须在一旦任意分支不在当前GPU的世代可处理如此多的片段,但这很可能作为硬件的发展随时间而改变。CG还允许您编写该分支片段程序并通过模拟这种构造条件赋值操作或循环展开迭代。
图1-9示出了用于当前可编程片段处理器的流程图。作为具有可编程顶点处理器,所述数据流包括执行指令序列,直到程序结束。再次,有一组输入寄存器。然而,而不是顶点属性,碎片处理器的只读输入寄存器包含从插入片段的原语的每个顶点的参数得出每个片段参数。读/写临时寄存器存储的中间值。写操作只写输出寄存器成为颜色和任选片段的新的深度。片段程序指令包括纹理拾取。
在GPU这两个可编程处理器需要你,应用程序员,提供为每个处理器来执行的程序。什么CG提供的是一种语言,可以你的阴影算法翻译成你的GPU硬件可以执行的形式的编译器。随着CG,而不是在图1-8和1-9所示的水平程序,你可以在一个非常相似的C.高级语言编程
CG的文物来自三个方面,如图1-10。首先,CG据以对通用C编程语言的语法和语义。第二,CG包含从由学术界开发离线着色语言如RenderMan规范,以及现有硬件着色语言许多概念。三,CG立足于对实时3D的OpenGL和Direct3D程序编程接口的图形功能。
图1-11示出了通用的编程语言,3D应用编程接口,并且激发了CG的发展着色语言。
此前,我们提到CG如何利用C'S语法和语义。在这本书的过程中,你会发现,大部分CG做什么C程序员期望。CG不同于在任何CG的专门用于GPU的性能或证明发生变化的情况下进行。
NVIDIA与微软合作开发的CG语言。微软称它实现高级着色器语言,或HLSL的简称。HLSL和CG是相同的语言,但反映每个公司使用识别语言及其底层技术的不同的名字。HLSL是微软的DirectX显卡方面,DirectX 9的多媒体框架的一个组成部分的一部分。Direct3D是微软的DirectX图形的3D组件。CG是独立的3D程序接口,并完全不是的Direct3D或OpenGL集成。一个正确编写的CG应用程序可以写一次,然后用OpenGL或Direct3D的工作。
这种灵活性意味着NVIDIA的CG实现提供一种方式来笔者,既主导3D编程任何操作系统选择界面和工作方案。CG作品无论你选择Windows,Linux和Mac OS X中,游戏控制台,或嵌入3D硬件为您的3D计算平台。Cg程序与硬件的工作来自多个硬件厂商,因为CG层在干净的Direct3D两种或OpenGL。Cg程序从所有主要的图形硬件厂商,如3DLABS,ATI,的Matrox和NVIDIA可编程GPU工作。
编写可编程GPU程序时的CG语言的多厂商,跨API和多平台的特性使得它的最佳选择。
该RenderMan的接口标准描述了非交互式阴影最知名的着色语言。皮克斯开发的语言在80年代后期,以产生高品质的电脑动画与先进的阴影为电影及广告。皮克斯创造了一个完整的渲染系统,其实施的RenderMan接口标准,离线渲染PRMan(照相真实感的RenderMan)的。该RenderMan规范只是一个该系统的组成部分。
为RenderMan规范的灵感来自早期的想法称为绿树掩映。罗布库克,然后在卢卡斯电影公司,后来剥离了皮克斯公司,于1984年发表了一篇关于绿树掩映一个SIGGRAPH论文树荫举办各种着色等运算为树结构中的节点。图1-12显示了渲染铜表面树荫。叶节点是数据输入到树荫。在非叶节点代表简单着色操作。在渲染的过程中,渲染器的计算结果与给定的表面相关联,以确定渲染图像中的表面的颜色的灯罩的树。为了评估树荫,渲染器执行与在树荫下树的最顶层节点关联的着色操作。然而,要评估的给定节点,渲染器必须首先评估该节点的子节点。此规则适用于递归全面评估树荫。在一个表面上的给定点树荫评价的结果是该点的颜色。
绿树掩映脱胎于实现对所有人们可能会想渲染的对象和场景一个预定义的着色模型绝不会是足够的。
树荫图是伟大的可视化着色等运算的数据流。但是,如果遮荫树是复杂的,他们的图表尾大不掉。皮克斯的研究人员和其他地方认为每个荫树是一个有限的一种程序。这样就实现了一种新型的已知为着色语言的编程语言提供了动力。
该RenderMan规范的前身是绿树掩映,并且呈现表面的追求写实的外观的开放式控制需要编程实现。
在实际生产中使用的今天,大多数离线渲染有着色语言某种类型的支持。该RenderMan规范是历史最悠久和离线渲染最有名的,它被显著检修,并在90年代后期扩展。
当任务分解成阶段,其中每个阶段的通信被限制在其前阶段和其后级的长序列(即,当它可以被流水线)的算法的硬件实现是最有效的。
第1.2节中所描述的,基于片段顶点为基础的管道是非常适合硬件实现。然而,通过照相真实感的RenderMan使用的雷耶斯算法并不十分适合于高效的硬件实现,主要是由于它的较高级别的几何处理。当代的GPU基于顶点和片段图形管线完全依靠。
在北卡罗莱纳州(UNC)大学的研究始于上世纪90年代中期调查可编程图形硬件,当联合国军司令部正在开发一种新的可编程图形硬件架构,称为PixelFlow。该项目促进了计算机图形学研究的一个新的行成由Marc Olano硬件服从着色语言和其他在UNC。不幸的是,PixelFlow太贵和商业失败。
随后,研究人员在Silicon Graphics工作的系统上翻译成着色器OpenGL渲染多次通过。尽管目标OpenGL硬件没有在这样的GPU编程今天,在OpenGL着色系统编排大量的渲染通道,实现了着色器的预期效果。
斯坦福大学研究人员,包括Kekoa Proudfoot,比尔·马克,斯韦托斯拉夫Tzvetkov,和Pat Hanrahan的,开始建造专门为第二代和第三代的GPU而设计的着色语言。这种语言,被称为斯坦福实时着色语言(RTSL),可以编译写在RTSL着色器到一个或多个OpenGL渲染通行证。
在斯坦福研究激发了NVIDIA自身的努力来开发商业品质的硬件适合着色语言。比尔马克于2001年加入NVIDIA带头努力,制定并实施了着色语言我们现在称之为CG。在此期间,NVIDIA与微软合作,在共同语言的语法和功能集认同。
在CG的第三个影响是一对标准的3D编程接口,OpenGL和Direct3D。在CG这些编程接口的影响仍在进行,如在下一节中解释。
CG只是一个整体的软件和硬件基础设施,渲染复杂的3D场景与实时价格可编程GPU的组成部分。本节将介绍如何CG实际的3D应用程序和游戏交互。
在PC上的3D图形过去(前有图形处理器),则CPU处理的所有的顶点变换和渲染3D场景所需像素推任务。图形硬件提供的硬件显示在屏幕上的象素仅在缓冲。程序员不得不在软件中实现自己的3D图形渲染算法。从某种意义上说,有关的顶点和片段处理一切回到当时完全可编程的。不幸的是,CPU是产生引人注目的3D效果太慢。
这些天来,3D应用程序不再实施自己的3D渲染使用的CPU的算法; 相反,他们依靠OpenGL或Direct3D的,这两个标准的3D编程接口,沟通渲染命令到GPU。
在90年代初期,Silicon Graphics公司开发的OpenGL协同叫了OpenGL架构评审委员会(ARB)的组织,该组织由所有主要的计算机图形系统供应商。原来,OpenGL的只跑了强大的UNIX图形工作站。微软的ARB的创始成员,然后实现OpenGL作为的方式来支持它的Windows NT操作系统的3D图形。微软后来添加的OpenGL支持Windows 95和所有微软的桌面操作系统。
的OpenGL不限于单一的操作或窗口系统。除了支持UNIX工作站和Windows PC时,OpenGL是由苹果公司为它的Macintosh个人计算机上的支持。Linux用户可以使用的OpenGL梅萨开放源代码实现或硬件加速实现,如NVIDIA的OpenGL驱动程序的Linux版本。这种灵活性使OpenGL的业界最佳的跨平台编程接口,3D图形。
在过去的十年中,OpenGL的已与图形硬件一起发展。OpenGL是可扩展的,这意味着OpenGL的实施者能够以增量的方式来OpenGL的添加新功能。如今,OpenGL扩展的分数所有最新的GPU功能的访问。这包括顶点和片段可编程ARB-标准化扩展。作为扩展被建立,它们经常滚入芯OpenGL标准,使得标准作为一个整体的进步。在写这篇文章的时候,OpenGL的当前版本是1.4。正在进行的工作演变OpenGL是在不同的OpenGL ARB工作组正在进行中。这项工作包括装配层次和高层次的编程接口。由于CG这样的接口层以上的操作时,它会继续以兼容的方式OpenGL的未来修订工作。
微软开始开发约1995年的Direct3D程序编程接口作为多媒体的DirectX计划的一部分。Direct3D是编程接口构成的DirectX之一。微软推出的DirectX和Direct3D,以启动消费市场对3D图形,特别是游戏,在Windows PC上。微软的Xbox游戏机还支持Direct3D的。Direct3D是在Windows游戏最流行的图形API,由于其紧密匹配可用的图形硬件的功能历史。
每一年左右的时间,微软已经更新的DirectX,包括Direct3D的,跟上PC硬件创新的快速发展。的DirectX在写这篇文章时的当前版本是支持DirectX 9,其中包括HLSL,微软的实施同一种语言的语法和结构在CG中发现的。
几年前,OpenGL和Direct3D竞争,看看哪些编程接口将占据主导地位,尤其是在Windows个人电脑的领域。竞争仍然是好的两个编程接口,并且每个在性能,质量和功能有所改善。在到Cg解决的GPU编程的区域,这两个编程接口具有可比较的能力。这是因为这两个OpenGL和Direct3D在相同GPU硬件运行和图形硬件确定可用的功能和性能。OpenGL的有轻微的优势功能,因为硬件厂商能够更好的暴露自己的全部功能,通过OpenGL的设置,但具体供应商的扩展做添加一些复杂性的开发。
大多数软件开发人员现在选择基于程序员的偏好,历史,他们的目标市场和硬件平台,而不是基于技术理由三维编程接口。
CG既支持编程接口。你可以写Cg程序,使他们与无论是OpenGL或Direct3D的编程接口工作。这是3D内容开发者一个巨大的福音。他们可以对自己的3D内容写在CG程序,然后呈现内容不管什么编程接口的最终应用程序使用3D渲染。
没有GPU可以直接从他们的文字形式执行Cg程序。被称为编译进程必须Cg程序翻译成该GPU可以执行的形式。重心编译器首先会将您的CG程序到应用程序的选择3D编程接口接收的形式,OpenGL或Direct3D的。然后,你的应用程序中的CG程序的OpenGL或Direct3D的翻译转移到使用适当的OpenGL或Direct3D的命令GPU。在OpenGL或Direct3D的驱动程序执行的最后翻译成硬件可执行形成你的GPU需要。
这个翻译的细节取决于GPU和3D编程接口的综合能力。一个CG程序如何编译它的中间OpenGL或Direct3D的形式取决于GPU的计算机类型和生成。这可能是你的显卡是不是能够支持,因为GPU本身的局限性的特定有效地Cg程序。例如,如果你的程序不是你的目标GPU支持访问更多纹理单元的CG片段程序将无法编译。
当你编译一个程序与传统的编程语言如C或C ++,汇编是一种离线的过程。你的编译器编译程序为直接运行在CPU上的可执行文件。一旦编译,你的程序不需要重新编译,除非你改变程序代码。我们称之为静态编译。
CG是不同的,因为它鼓励动态编译,虽然静态编译也支持。重心编译器是不是一个单独的程序,但被称为CG运行时库的一部分。使用Cg程序的3D应用程序和游戏必须使用CG运行时链接。使用CG然后调用CG运行时例程,都以字母前缀的应用CG,编译和操纵Cg程序。动态编译允许Cg程序,为安装在用户的计算机GPU的特定模型进行优化。
除了核心运行时CG,CG提供了两个密切相关的库。如果您的应用程序使用OpenGL,您将使用CgGL库调用适当的OpenGL程序到你的翻译CG程序传递给OpenGL驱动程序。同样,如果您的应用程序使用Direct3D,您将使用CgD3D库调用适当的Direct3D程序到你的翻译CG程序传递给Direct3D的驱动程序。通常情况下,你会请使用CgGL或CgD3D库,但不能同时,因为大多数应用程序使用OpenGL或Direct3D的,不能同时使用。
与包含CG编译芯CG运行时库相比,CgGL和CgD3D库都比较小。他们的工作是做适当的OpenGL或Direct3D的要求您配置Cg程序执行。这些调用翻译的CG程序传送到相应的驱动程序,将程序进一步翻译成你的GPU可以执行的形式。在大多数情况下,该CgGL和CgD3D库也有类似的例程。在CgGL库的程序首先cgGL ;在CgD3D库中的例程开始cgD3D。
图1-13显示了一个典型的3D应用程序如何使用CG库。如果你是一个程序员,你会想了解更多的CG运行时,为3D API应用程序使用,以渲染3D图形的专用库。本书的大部分集中于CG语言本身和如何编写Cg程序,但附录B有大约CG运行时库的更多信息。
Cg程序需要的3D模型,纹理和其它数据进行操作。没有任何相关的数据的CG程序是没用的。Cg程序和数据也需要正确的3D编程接口配置和状态。它往往是有帮助的方式来捆绑所有的渲染3D模型,包括其相关的CG程序所需要的信息。
CgFX的是代表完全的效果和外观标准化的文件格式。当他们用CG做,微软和NVIDIA合作开发的CgFX格式。的CgFX文件是基于文本的,具有一个语法是CG的的超集,并可以含有任何数量的Cg程序的。该的.fx后缀标识的CgFX文件。一个CgFX的文件描述了完整的呈现状态的特定效果:多遍,纹理状态和任意数量的单个顶点和片段程序可能会被定义为创建一个完整的外观或效果。一位随行的开发工具包提供了一种使用和解析的CgFX文件。该工具包暴露用户界面挂钩主机应用程序,从而使的CgFX的应用程序可以自动提供有意义的控制和语义用户和开发者的一致好评。
Cg程序描述顶点或片段处理,发生在一个单一的渲染通道,但有些复杂的着色算法需要的多个渲染通道。的CgFX提供编码复杂的多次效果的格式,其中包括CG程序用于每个渲染传递指定。
更具体地说,支持的CgFX超出了核心CG语言支持三个附加的功能:
该CgFX的文件格式封装为一个给定的着色器Cg程序的多个实现。这意味着你可以有一个第三代或第四代GPU写了一个CG着色器程序,同时还包括一个支持能力较差,第二代GPU的简单程序。加载的CgFX文件可以在运行时确定最合适的着色器的实现应用程序使用基于计算机的可用的GPU。
与CgFX的Cg程序的多个实例,以解决不同代或不同硬件厂商的GPU功能变化的一种方式。多个实例,您还可以开发专门为特定的3D API,例如一个CG程序,如果通过OpenGL的一个扩展暴露出额外的功能。专门用于Direct3D的,标准的OpenGL,或OpenGL扩展名为Cg程序都可以被包含在单个的CgFX文件。
该工具包的CgFX包含的CgFX编译器,它支持完整的CgFX语法; 在的CgFX运行时API,用于加载和处理的CgFX文件; 和插件模块主要数字内容创作(DCC)应用,如别名| Wavefront公司的Maya和Discreet的3ds Max软件。图1-14显示了这些应用程序利用的CgFX的。SOFTIMAGE | XSI 3.0提供了在其渲染的CG树编译直接支持。
之前的CgFX,有的DCC应用到3D内容导出了所有必要的相关着色知识来呈现实时内容没有标准的方式。现在各大DCC应用在他们的内容创建过程中使用的CgFX和支持的CgFX文件格式。这意味着它们的CgFX可以显著改善由DCC应用到的实时游戏和其他3D应用的艺术工作流程。使用的CgFX,艺术家可以查看和调整CG着色器和相关的3D内容看,从他们的选择的DCC工具中的工作怎么会出现在3D游戏或应用程序。
图1-15显示了如何包含多个实例化的着色器的CgFX文件由与CG运行时和您的渲染API的选择相结合的应用程序。本书的大部分集中于CG语言本身和如何编写Cg程序,而不是CgFX的,但请参阅附录C有关的CgFX文件格式和其相关的运行时API的更多信息。
说完这个介绍CG编程语言,你现在准备采取教程章,将教你如何编写Cg程序。
在每一章帮助最终的练习,你检查你的知识和开发实用编程技巧。
回答这个问题:名您可以编译Cg程序两种标准的3D编程接口。什么操作系统每个编程接口的支持?
回答这个问题:什么是图形管线的主要阶段?按照什么顺序阶段安排?
回答这个问题:在哪里顶点和片段程序融入管道?
回答这个问题:什么是顶点?什么是片段?区分从像素的片段。
这个尝试自己:我们还没有开始写Cg程序,但(我们会到达那里很快在接下来的章节),所以休息一下,看一个良好的长篇计算机图形动画,如怪物公司
CG生成的计算机语言设计,计算机硬件设计和计算机图形学概念的主机上。对得住在本教程的上下文中的所有这些贡献并不总是可行的。我们试图在“延伸阅读”部分中每章的结尾是什么,为您提供指向更多地了解背后的主题在每章的贡献。
有很多在书本C. C程序设计语言,第三版(Prentice Hall出版社,2000年),由Brian Kernighan和丹尼斯里奇,是一个典型的; 作者发明了C语言。CG包括来自C和C ++的概念。现在有可能实际上是关于C更多的书籍比++约C.经典的C ++的书是在C ++编程语言,第三版(Addison-Wesley出版社,2000年),由Bjarne Stroustrup的,是谁发明的语言。
要了解更多关于RenderMan规范,阅读的伴侣的RenderMan:程序员指南真实感图形学(Addison-Wesley出版社,1989年),由史蒂夫Upstill。帕特汉拉汉和吉姆·罗森发表了有关的RenderMan一个SIGGRAPH论文名为“用于着色和光照计算的语言”(ACM出版社)于1990年。
罗伯特·库克1984年SIGGRAPH论文标题为“行道树”(ACM出版社)动机的RenderMan的发展。
可编程图形硬件及其相关语言的发展一直是积极和富有成果的研究领域工作近十年。安塞尔莫拉斯特拉,史蒂芬莫尔纳,马克Olano和玉兰王在联合国军司令部于1995年名为“实时可编程着色”(ACM出版社)出版的早期的研究论文。在北卡罗来纳大学的研究人员也发表了他们的可编程PixelFlow图形架构了多篇论文。马克Olano和安塞尔莫拉斯特拉发表了题为“关于图形硬件着色语言:本PixelFlow遮阳系统”一文SIGGRAPH 1998年(ACM出版社)。
Kekoa Proudfoot,比尔·马克,斯韦托斯拉夫Tzvetkov,和Pat Hanrahan的发表了题为“一个实时可编程图形硬件程序遮阳系统”(ACM出版社),描述在斯坦福大学开发了面向GPU的着色语言在2001年SIGGRAPH论文。
实时渲染,第二版(AK彼得斯,2002年),由埃里克·海恩斯和Tomas Akenine -默勒写的,是关于图形硬件和互动技术的进一步信息的绝佳资源。
显卡的OpenGL系统:规范记录了OpenGL三维编程接口。学习的OpenGL编程最好的教程是OpenGL的编程指南:官方指南学习的OpenGL,第三版(Addison-Wesley出版社,1999年),由梅森佑,成龙Neider,汤姆·戴维斯和Dave Shreiner。该www.opengl.org网站提供上涨约OpenGL的更多的信息。
为Direct3D的编程接口文档可从微软的msdn.microsoft.com网站。
NVIDIA提供了有关CG运行时,CgFX以及CG本身在其开发者网站的详细信息developer.nvidia.com/Cg。
许多制造商和销售商来区分自己的产品名称都声明为商标。如果这些名称出现在这本书,Addison-Wesley出版社意识到商标索赔,名称已打印的首字母大写或全部大写。
作者和出版商都在这本书的编写照顾,但要任何形式的明示或暗示的保证并承担错误或遗漏不承担任何责任。无责任承担与或因使用本文所载资料或程序的连接,附带或相应的损害赔偿。
在订购数量为批量采购和特价销售时,出版商提供这本书的折扣。欲了解更多信息,请联系:
美国企业和政府销售
(800)382-3419 [email protected]
对于美国以外的销售,请联系:
在Web上访问Addison-Wesley出版社:www.awprofessional.com
美国国会图书馆控制号:2002117794
版权所有©2003 NVIDIA公司
封面图片©2003 NVIDIA公司
版权所有。本出版物的任何部分进行复制,存储在检索系统或传播,以任何形式,或以任何方式,电子,机械,复印,录音或其他方式,未经出版者的事先同意。印刷美利坚合众国。在加拿大同时出版。
有关获取许可使用的材料从这个工作的信息,请提交书面请求:
培生教育出版公司
的权利和合同部门
75阿灵顿街,套房300
马萨诸塞州波士顿02116
传真:(617)848-7047
文字克劳福兹,印第安纳州当纳利克劳福兹再生纸印制。
8 9 10111213 DOC 09 08 07
8日印刷,2007年11月