Cg(C for Graphic)语言概述

 
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”


    Cg(C for Graphcis)语言,是NVIDIA与Microsoft合作研发,旨在为开发人员提供一套方便、跨平台(良好的兼容性),控制可编程图形硬件的高级语言。Cg语言的语法结构与C语言非常类似,使用Cg编写的着色程序默认的文件后缀是*. Cg。


4.1 开始Cg之旅


    在NVIDIA的http://developer.nvidia.com/object/cg_toolkit.html网页上下载Cg Toolkit ,截止到2009年10月,Cg语言的版本为2.2。下载之后直接安装即可。在安装目录的bin目录下一个可执行程序:cgc.exe。这是NVIDIA提供的Cg程序编译器。


    Cg语言规范是公开和开放的,并且 NVIDIA开放了Cg编译器技术的源代码,使用无限制的、免费的许可证。


    目前还没有一个主流的专门为编写着色程序而开发的IDE,很多人都是直接在文本中写好程序后,然后将文件后缀改为.cg。在网上有一个名为NShader(http://nshader.codeplex.com/)的Visual Studio2008插件,安装之后可以支持编写着色程序。图 11展示了使用该插件之后的使用效果。
 


4.2 CG特性


    Cg同时被OpenGL与Direct3D两种编程API所支持。这一点不但对开发人员而言非常方便,而且也赋予了Cg程序良好的跨平台性。一个正确编写的Cg应用程序可以不做任何修改的同时工作在OpenGL和Direct3D之上。


4.3 CG 编译
4.3.1 CG编译原理


    计算机只能理解和执行由0、1序列(电压序列)构成的机器语言,所以汇编语言和高级语言程序都需要进行翻译才能被计算机所理解,担负这一任务的程序称为语言处理程序,通常也被称为编译程序。例如C或者C++ 编写的程序,需要首先编译成可执行文件(.exe文件),然后才能在GPU上运行,且一旦编译后,除非改变程序代码,否则不需要重新编译,这种方式称为静态编译(static coompilation)。静态编译最重要的特征是:一旦编译为可执行文件,在可执行文件运行期间不再需要源码信息。而动态编译(dynamic compilation)与之相反,编译程序和源码都要参与到程序的运行过程中。


    Cg语言通常采用动态编译的方式,即,在宿主程序运行时利用Cg运行库( Cg Runtime library)动态编译Cg代码,使用动态编译的方式,可以将Cg程序当作一个脚本,随时修改随时运行,节省大量的时间,在OGRE图形引擎中就是采用这样的方法。在文献[2]的1.4.2章节中提到Cg语言同样支持静态编译方式,即,Cg源码编译成汇编代码后,这部分目标代码被链接到宿主程序最后的可执行程序中。使用静态编译的好处是只要发布可执行文件即可,源码不会被公开。


    Cg编译器首先将Cg程序翻译成可被图形API(OpenGL和Direct3D)所接受的形式,然后应用程序使用适当的OpenGL和Direct3D命令将翻译后的Cg程序传递给图形处理器,OpenGL和Direct3D驱动程序最后把它翻译成图形处理器所需要的硬件可执行格式。NVIDIA提供的Cg编译器为cgc.exe。


    Cg程序的编译不但依赖于宿主程序所使用的三维编程接口,而且依赖于图形硬件环境,因为图形硬件自身的限制,不一定支持某种Cg语句,例如,如果你所使用的GPU并不支持循环控制指令,那么在Cg程序中编写的循环控制语句将无法通过编译。被特定的图形硬件环境或AIP所支持的Cg语言子集,被称为Cg Profiles。需要注意的是: profile分为顶点程序的profile和片段程序的profile,这是因为顶点着色器和片段着色器原本就不是工作在同一个硬件。


    Cg Profiles是Cg语言的重要组成部分,在使用Cg语言编写着色程序时,首先要考虑的一点就是“当前的图形硬件环境支持那个Cg Profile”,这直接关系到您所编写的着色程序是否可以在当前的图形硬件上运行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个C语言的图形迷宫游戏可以分为以下几个步骤: 1. 创建迷宫地图 首先需要定义迷宫地图的大小和布局,可以使用二维数组来表示迷宫地图,其中0表示可以通过的通路,1表示墙或障碍物。 2. 绘制迷宫地图 使用C语言的图形库,如graphics.h,可以在屏幕上绘制迷宫地图。可以使用不同的颜色和线条来表示墙和通路。 3. 实现人物移动 使用键盘输入来控制人物的移动,根据人物的位置来判断是否可以移动,如果移动到终点则游戏结束。 4. 添加音效和动画效果 为了增加游戏的趣味性,可以添加声音和动画效果,如当人物碰到墙时发出撞击声,或者当人物到达终点时播放胜利音乐。 下面是一个简单的C语言图形迷宫游戏的代码示例: ``` #include <graphics.h> // 定义迷宫地图 int maze[10][10] = { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,0,1,0,0,1}, {1,0,1,0,1,0,1,0,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,0,1,1,1,1,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,1,1,0,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1} }; // 定义人物位置 int x = 1, y = 1; int main() { // 初始化图形库 initwindow(640, 480, "Maze Game"); while (1) { // 绘制迷宫地图 cleardevice(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (maze[i][j]) { setfillstyle(SOLID_FILL, WHITE); bar(j * 40, i * 40, j * 40 + 40, i * 40 + 40); } } } // 绘制人物 setfillstyle(SOLID_FILL, YELLOW); bar(y * 40, x * 40, y * 40 + 40, x * 40 + 40); // 监听键盘输入 int key = getch(); switch (key) { case 'w': if (maze[x-1][y] == 0) x--; break; case 's': if (maze[x+1][y] == 0) x++; break; case 'a': if (maze[x][y-1] == 0) y--; break; case 'd': if (maze[x][y+1] == 0) y++; break; } // 判断是否到达终点 if (x == 8 && y == 8) { cleardevice(); outtextxy(200, 200, "You win!"); delay(2000); break; } } // 关闭图形库 closegraph(); return 0; } ``` 这个示例代码实现了一个简单的10x10迷宫游戏,使用黄色方块表示人物,白色方块表示墙或通路。玩家可以使用WASD键来控制人物的移动,当到达终点时会弹出胜利提示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值