Cg使用说明 第一章 介绍

原创内容,欢迎转载,转载请注明出处:http://blog.csdn.net/tianyu2202/

 

Cg使用说明

第一章介绍

本章有以下四个部分:

“什么是Cg?”介绍Cg编程语言

“顶点、片段和图形管线”描述现代显示硬件的数据流,以及Cg如何与之融为一体的使用

Cg开发历史”讲述Cg开发的背景

Cg开发环境”介绍如何使用Cg对现存的3D图形API进行开发

 

1.1  什么是Cg

本书教会你如何使用Cg编程语言。你可以使用Cg对可编程图形硬件进行编程,以控制图形、显示和运动物体的绘制中的硬件加速。通过它,现代的图形处理器为你提供了不可置信的图形处理速度。它前所未有的提高了计算机图形学从业者、艺术家和程序员对实时图像的控制。

Cg在多个平台上提供了一个支持快速创建特效和像电影一样的视觉体验的编程环境。Cg提供了一个新的抽象层,实开发者不需要去了解图形硬件的汇编语言,从而更容易的实现OpenGLDirectXWindowsLinuxMac OS还有像XBOX一样的平台上的图形编程。CG在开发中充分的与微软进行合作,兼容OpenGL API和微软的HLSLDirectX 9.0)。

Cg的意思是“图形处理的C语言”。C语言是70年代开发的一种使用广泛的编程语言。由于它的流行和出色的设计,它成为了后来很多种预言的基础。比如说:C++Java的语法和结构都与C语言十分相似。Cg也是一门以C语言为基础的编程语言。如果你熟悉C语言或者以C语言为基础的一门语言的话,学习CG也将会更容易。

而如果你对C语言不熟悉,甚至是对编程语言没有什么了解,仅仅是喜欢计算机图形学或者是想要看看新东西。Cg也是很容易被理解的。

本章的大部分内容都是在描述Cg的背景,以使你更好的理解它。如果你觉得不看这些也无所谓的话可以直接跳到第二章。

1.1.1 一门图形硬件编程语言

CgC,C++,Java不同的地方是它是一门非常专业的语言。没人会用Cg创作一个电子表格或者是文字处理程序。因为Cg的用处是使用图形硬件处理图形、显示和运动的物体。所以,这种语言被称为着色器语言。当然了,Cg也能完成除了着色以外的事情,比如物理模拟、混合和其他并非着色的任务。

一个Cg程序就是一个如何用图形硬件去呈现一个物体的实现流程。比如说,你可以使用Cg使一个表面看起来崎岖或者栩栩如生。在稍后的1.3节中,你将会更详细的了解到着色器语言的历史和CG出现的位置。

1.1.2 Cg的数据流模型

作为专业的图形编程语言,Cg和其他通用语言的不同也体现在数据流模型上。在这样一个模型中,计算发生在数据从一系列的处理器中流过的过程中。

Cg程序的操作对象是图像呈现过程中的顶点和片段(如果不知道什么是片段,请想象一下点的集合)。想象Cg是一个顶点和片段从中流过的黑盒子。然而Cg并不是黑盒子,而是顶点和片段流动过程中你对它们做了什么。

你的Cg程序决定了一个顶点在3D场景中被处理或者被光栅化的过程。1.3节将更深入的讲解Cg的数据流模型。

大多数的个人电脑和所有的游戏主机都有一个专注于图形处理和3D模型光栅化的GPU。你的Cg程序就会在你的电脑中的GPU上得到执行。

1.1.3 GPU处理图形数据 CPU处理一般数据

不管一个个人电脑或游戏主机有没有一个GPU,它都会有一个用来运行操作系统和应用程序的CPUCPU设计时就是为了处理一般的数据。CPU执行像C++Java这样的一般语言写成的应用程序(比如文字处理软件等)。

因为GPU的专业化的设计,使得它在处理图形任务和呈现3D场景方面的速度远远超过CPU。新型的GPU每秒能处理数以千万计的顶点或数以亿计甚至十亿计的片段。以后的GPU将会更快。在这些方面,GPU具有压倒性的优势。但是GPU却不能像CPU一样执行任意的、一般的应用程序。

这种专门设计的高性能的GPU就是Cg存在的理由。普通的编程语言相对于只能处理顶点和片段的GPU来说实在是太开放了。相反的,Cg完全的满足了这项工作的需求。Cg也提供了一个同GPU一样的抽象执行模型。在1.2节中,将会讲解这种唯一的GPU执行模型。

1.1.4 Cg的理论性能

为了使人产生动的概念,一个3D的应用程序必须每秒更新画面15次以上。一般我们把每秒更新60次以上的画面称为实时画面,它在人们眼中表现出立刻出现的感觉。计算机屏幕的每次更新都要重新绘制上百万的像素。而为了提升3D场景的显示效果,或是因为点与点之间的遮挡,GPU在每次刷新时都需要对每个点进行数次处理。这通常意味着实时的3D场景每秒需要处理数以亿计的点。在需要对点进行处理的同时,3D模型也需要经过正确的变换成多边形、线和点,才能被光栅化为可显示的点。这需要每秒处理千万计的顶点。

此外,图形处理还发生在CPU更新变动的画面时所需的计算。事实是,在呈现3D场景或游戏时,CPU的运算能力和GPU的专业计算能力都是十分必要的。这就要求一个程序员用C++编写游戏程序时使用CgGPU加足马力。

1.1.5 与传统编程语言的共存

Cg无论如何也无法替代显存顶点传统编程语言。Cg是专为GPU开发的辅助性语言。使用传统编程语言CC++编成的程序可以调用Cg写成的GPU程序。Cg的运行时设计被用来支持在GPU上装载、编译、执行和配置程序。Cg程序告诉GPU怎样去执行操作绘图操作。

Cg提供了并行计算的能力,当你的CPU执行一段传统的程序时,它可以调用Cg编成的并行顶点和片段处理程序。

如果一个实时的着色器语言有那么多的优越性,为什么没有人早些创造它?答案和计算机图形硬件的发展有关。在2001年的时候,一般的图形硬件还都是使用固定处理管线来处理顶点和片段。“固定处理管线”的意思是所有的算法都是被固定在硬件中,不能通过编程的方式去改变的。尽管它们能被一些图形应用程序所配置,但是它们不能处理从未遇到过的情况。幸而,这种状况改变了。

图形硬件的设计升级了,在最新的GPU中,顶点和片段的处理器彻底的变成了可编程的。在图形硬件变得可编程以前,没有理由会出现一种用来对图形硬件进行编程的语言。现在既然图形硬件已经可编程了,我们就会需要一种能对它进行编程的语言。Cg使得GPU的编程更加简单,就像当年C语言对于CPU一样。

Cg出现以前,GPU只能执行由低级语言写成的汇编程序。汇编语言需要使用特殊的语法并且需要对硬件寄存器的深入了解,就像DirectX 8的顶点和点的着色器或者是OpenGL的一些扩展一样,对它们进行编程是一种折磨。当GPU的技术发展使得更长更复杂的汇编程序能被执行时,对一个高级编程语言的需求就更加迫切了。例1.1是一小段用来在片段上表现皮肤的复杂汇编程序。它很难被理解,尤其是你必须准确的指定硬件寄存器。

 

例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语言会更轻便、更易读,更利于调试和代码的重用。Cg能给你C语言一样的编译能力和低级汇编程序一样的执行效率。

1.1.6 Cg的其他方面

Cg编写的程序跟普通C++程序比起来是短小的,因为它只负责对顶点和片段的变换,而不是执行一些大块的复杂的操作。跟C++Java不同的是,Cg不支持类和一些其它的面向对象的编程方式所支持的特性。当前Cg并不支持指针甚至是内存分配。Cg也绝对不支持文件的写入和读取。这些限制并不是永久性的,但是这已经代表了现代GPU的最高成就。当技术进步时,你会经历到Cg预言的成长。因为Cg是以C为基础的,Cg特性的增长就像CC++的发展一样。

Cg提供了数组和结构,并且支持现代编程语言的所有流程控制语句:循环、条件和函数调用。

Cg原生的支持向量和矩阵,因为它们对图形硬件来说是小菜一碟。Cg也有一个库,名叫基础库,非常适合于进行图形相关的计算。比如说Cg基础库包括了一个Reflect函数来进行反射向量的计算。

Cg程序是单独执行的,这意味着每个执行Cg程序的处理器之间是没有任何联系的。这对执行Cg程序没有任何副作用,这种方式极端的适合使用管线方式和并行方式执行程序的硬件。

1.1.7 Cg程序执行环境的限制

当你使用一种现代的编程语言去编写一个现代的CPU程序,你可以期待只要你的程序是正确的,不管它有多长或是有多大的自由度,都能够被正常的编译和执行。这是因为现代的CPU设计的时候就为这样的需求留下了足够多的资源。

可是GPU的特性还在发展中,并且是为了专门的应用而设计的。并不是你用Cg编出的所有的程序都能被GPU执行。Cg有一个硬件“配置”的概念,使用不同的硬件能支持不同的特性。每个配置对应一种特定的GPU操作API。而新的硬件总是会包括更多的特性,所以今天所编写的GPU程序几乎不用修改就能在将来的硬件上执行。

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值