Cg使用说明

第一章介绍

本章有以下四个部分:

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

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

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

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

1.1什么是Cg

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

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

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

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

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

1.1.1一门图形硬件编程语言

Cg和C,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,它都会有一个用来运行操作系统和应用程序的CPU。CPU设计时就是为了处理一般的数据。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++编写游戏程序时使用Cg给GPU加足马力。

1.1.5与传统编程语言的共存

Cg无论如何也无法替代显存顶点传统编程语言。Cg是专为GPU开发的辅助性语言。使用传统编程语言C或C++编成的程序可以调用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};

TEXH0,f[TEX0],TEX4,2D;

TEXH1,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特性的增长就像C向C++的发展一样。

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

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

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

1.1.7 Cg程序执行环境的限制

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

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

CG系统提交Java程序_Cg使用说明 第一章 介绍相关推荐

  1. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc

    坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...

  2. java 网页空白_win8系统运行Java程序网页会出现空白的解决方法

    我们在操作win8系统电脑的时候,常常会遇到win8系统运行Java程序网页会出现空白的问题.那么出现win8系统运行Java程序网页会出现空白的问题该怎么解决呢?很多对电脑不太熟悉的小伙伴不知道wi ...

  3. Java程序员常用开发软件介绍

    Java程序员常用开发软件介绍 Java程序员常用开发软件介绍 后端开发利器:idea / eclipse及各种封装版本 数据库客户端:Navicat / Heidisql 前端开发: vs code ...

  4. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  5. 使用java实现面向对象编程第十章嗖嗖移动业务大厅项目_ACCP6.0使用Java实现面向对象编程-第一章.ppt...

    ACCP6.0使用Java实现面向对象编程-第一章 练习--用类图设计Dog和Penguin类 需求说明: 运用面向对象思想抽象出Dog类和Penguin类,画出对应类图 根据类图编写Dog类和Pen ...

  6. 软考 程序员教程-第一章 计算机系统基础知识

    软考 程序员教程-第一章 计算机系统基础知识 为了督促自己学习,告别懒惰,在此先给自己定个小目标,请大家监督哟! 目标:一个月内过一遍<程序员教程>,下一个月开始上真题. 简单看了下,我在 ...

  7. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

  8. c语言程序第一章编程,c语言程序的设计第一章 C语言编程入门.ppt

    c语言程序的设计第一章 C语言编程入门 第1章 C语言编程入门 本章是本书的入门篇,专为初学者熟悉编程过程.掌握程序结构而准备的. 本章学习目标 ? 1)? 能够通过模仿与改变来构造带有测试函数的C语 ...

  9. java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍

    Win7系统下JAVA摄像头调用_实例代码介绍.由于要搞个人脸识别登录(JAVACV),百度谷歌了一下午,找了网上简单的样例代码来试,可是老是调试不过,出现CaptureDeviceManager.g ...

最新文章

  1. as3(actionScript3.0) 操作摄像头(Camera)实例
  2. C++STL源代码学习(之slist篇)
  3. 深入理解学习Git常用工作流
  4. 5GS 协议栈 — Overview
  5. linux centos7 重启服务器报错 Run 'systemctl daemon-reload' to reload units
  6. 需求评审五个维度框架分析及其带来的启示-4-需求条目化管理
  7. 揭秘:神策数据产品矩阵,全方位筑就你的数据驱动闭环
  8. TreeView数据绑定的方法
  9. qt5 窗体显示完毕信号_iPhone手机信号不好?试试这样设置,随时随地让你的手机信号满格...
  10. linux认证哪家好,linux认证 考哪种好?
  11. 基于JAVA+SpringBoot+Mybatis+MYSQL的网上商城系统
  12. Flutter TextField设置默认值默认值和光标位置
  13. 《Kafka权威指南》阅读小记
  14. html转换成avi,swf怎么转换成avi,swf转换avi的方法
  15. 基于用户 的协同过滤算法
  16. VS2017 Git操作教程
  17. SNMP 枚举工具 Snmpwalk
  18. 2022年施工员-土建方向-岗位技能(施工员)考题模拟考试平台操作
  19. HTML笔记(课堂笔记整合)
  20. noip模拟赛 斐波那契

热门文章

  1. 技术胖React博客实战 - 新版问题解决方式整理
  2. web课程设计网页规划与设计:个人毕设网站设计 —— 二手书籍(11个页面) HTML+CSS+JavaScript
  3. MySql 数据库10038问题终极解决
  4. 通过movie_id来查询数据库获取电影名字和平均得分
  5. LeetCode-只出现一次的数字-哈希表-异或-py
  6. NetSuite SuiteQL Query Tool
  7. c语言计算圆的周长和面积double,符号常量,浮点数(计算圆的周长和面积) | 新思维:C语言程序设计...
  8. 心血漏洞(OpenSSL升级)
  9. 解决关于在安装Linux后Grub中没有原先Windows引导的问题
  10. it does not have a type annotation and is referenced directly or indirectly in its own initializer