云海航行Q+伟的幻想乡

热爱探索未知事物的coder 、 writer 、watcher and thinker
posts - 16, comments - 6, trackbacks - 0, articles - 0

视频游戏(VideoGame),是绝对离不开图形的。计算机图形学(Computer Graphic Science),涉及图形硬件(GPU)、图像标准(bmp,png,jpeg..)、渲染算法(render method)、动画(Animation)、虚拟现实(VR)等。而跟游戏相关的主要是图像和图形(Kinect类的游戏涉及计算机视觉,也就是图像分析、模式匹配)。注意,图像跟图形要区分开,不严格地说,图像是标量,指通过拍照、扫描等方式得到的位图(Bitmap);图形是矢量,指根据数据、公式、算法用计算机生成的图形。而3D模型基本就是图形和图像在三维空间上的组合,内部是一系列的顶点坐标和贴图坐标的组合及贴图文件等。

        

大二我在做一个2D游戏《东方千⑨谭》的时候,一开始绘图使用的是QT的图形库,读取图片、显示图片都可以用这个库做到。后来做Demo,测试同时绘制300个人物(64x64的贴图)的时候,帧率已经无限低了。后来知道了是因为这个库的绘图API内部是软件渲染的。软件渲染,顾名思义,即是用CPU来处理图像显示的工作,换言之就是自不量力地抢了GPU的活来干。最后我明白了,拿QT来做游戏是个很蠢的行为。而要加快渲染的速度,就需要使用硬件渲染的方法。也就是使用3D图形APIOpenGL / Direct3D

 

我是在大一的暑假开始接触3D图形学,至今算是学了一年有余。我个人认为,对于3D和图形学,必须搞清楚两者之间的关系。计算机世界里的3D其实就是数学,举例来说就是,线性代数中平移、旋转、缩放的应用,曲线曲面技术中的Bezier、和NURBS,还有计算机动画的插值算法(样条插值、平滑插值、线性插值)等。而3D图形学要做的就是,怎样根据物体的三维数据来模拟显示物体,即如何渲染到二维平面,再输出到显示器。

这个工作是有多个步骤的,称作图形处理流水线,或者渲染管道。这条流水线大部分工作都是GPU来执行,而实际上3D数学部分(矩阵变换或四元数计算)也是GPU的工作,目前通过CudaOpenCL还可以利用GPU做图形学以外的事,这一个领域叫做通用并行计算技术。

关于渲染管道(pipeline),OpenGLDirectX的教程肯定都会说到。要搞懂什么是管线,估计刚学图形学的人都需要一定时间。学一套3D API 不是什么难事,有一本好的入门图书和一份API查询手册就够了。学习3D图形学重要的是理解它的工作原理。如矩阵变换的旋转矩阵,就是比较复杂的一个core矩阵,要搞懂它就要去看一遍这个矩阵的推导,再看下旋转矩阵是如何应用到实际中去的。

 

关于OpenGLDirect3D的抉择问题,初学3D图形学肯定会有,我个人觉得OpenGL是初学者必学的,不仅跨平台性强(D3D只能用在WindowsWP7Xbox,而OGL几乎所有平台都支持,另外,假如WebGL,势必会带来一场网站开发的革命),而且接口设计得简单易懂。D3D应该是在实际项目开发的时候,再根据环境条件等来考虑是否使用。如果OpenGL学得差不多了,学D3D不过就是学习另一套API的事。下面是OpenGL Vs Direct3D的一篇文章,值得一看:

OpenGL 3 & DirectX 11: The War Is Over》:繪圖 API 終戰之日?

http://blog.monkeypotion.net/reading/gameprogreading/opengl-versus-directx-the-war-is-over

OpenGL的教程,个人推荐《OpenGL的超级宝典4th(Super Bible),这里就不做介绍了。

 

3D图形学的高速发展是从3D游戏之父卡马克开发的《DOOM》出现在人们面前算起的。(推荐一本书《DOOM启示录》,讲述了卡马克和罗梅洛两位游戏界传奇人物的传奇故事,绝对霸气,震撼人心)至今3D图形学发展十几二十年,固定渲染管道也是很多年的产物了。现在这个管道不再是完全让计算机管理,而是其中的几个环节可以由程序员来控制。这个技术就叫shader,着色器(顶点着色器、片段着色器、 几何着色器)。

Shader编程是完全不同于其他语言的,因为它考虑的是并行的问题,并不是线性的问题。Shader语言有三种,OpenGLGLSL, D3DHLSL,还有NvidiaCg(此Cg不是通常意义的CG,而是C for graphic,即用于图像的类C语言)。Cg是由Nvidia提出的,目的是为了调和OpenGLDirectX的矛盾。Cg的优点在于,它是处在GLSLHLSL两者之上的,用Cg写的着色器代码编译后就变成GLSL或者HLSL的代码,shader程序员只需写一份Cg语言的代码就可以了(Cg语言的语法几乎和HLSL一样)。

另外可以看一下这篇文章:《着色语言(Shader Language),以及HLSL VS GLSL VS CG

链接:http://bbs.gameres.com/showthread.asp?threadid=138918&page=1

Cg的各种信息和SDKSample下载可以到英伟达官网查找:

http://developer.nvidia.com/cg-toolkit-archive

 

学习Shader编程,有很多不错的书,虽然我都没看过,比如Nvidia的《GPU gem123,这3本有中文版。另外《Shader X1-7,看介绍也是很不错的,不过基本没中文版。

Shader 可以实现目前大部分的实时、非实时渲染算法(阴影、光照等)。注意,Shader着色器语言是用来实现渲染算法的,当然存在有人利用shader语言来做AI等事情(这些以后估计都会是cudaOpenCL的工作)。

 

说回游戏。游戏实际上并不会用到太多最新最前沿的技术,因为要考虑到老百姓的PC配置都是参差不齐的。顶点着色器和片段着色器,现在大部分的显卡都至少支持最基本的功能,而Geometry shader,就仍未普及,即只有近几年内的显卡才有这个能力。

 

对于二维平面游戏,图形图像技术通常是用来做特效,完全用贴图的游戏已经过时了。例如可以用shader做模糊(Blur)、扭曲、灰度图化、强光等等PS中的滤镜效果,还有利用3D API来增强画面效果,如3D旋转菜单、游戏场景三维化(实际上只是起美化的作用,如东方Project的一系列弹幕作)。并且存在有二维游戏中的贴图是通过把由三维模型压到二维平面而得到的。

 

三维游戏,就复杂太多了,甚至比做计算机动画还复杂,因为不仅要考虑效果、还要考虑效率(达到60/秒左右的图像输出能力就是实时渲染)。在效果上有非真实渲染和真实性渲染。真实性渲染就是尽可能地仿真,如如何实现现实中的镜面反射、次表面散射、雾、镜头光晕、阴影等。非真实渲染就是将人物、场景渲染成卡通效果。利用shader就可以实现这些效果。

 

         如果是小团队开发游戏,而且打算自己做一个商业级的3D游戏引擎,那这个小团队处境堪忧。首先技术硬实力要过关,这不是一件个人英雄可以办到的事(3D算法、渲染算法,没有潜心学习个几年,做出来的引擎不会强到哪里去)。全3D游戏涉及的技术太多,与其冒风险自己开发一个引擎,不如花钱买一个商业级的或者使用开源引擎(LGPL license的应该有)。而如果是做2D游戏,应用一些shader特效来强化视觉冲击力倒是可以。

 

图形只是游戏的一个方面,还有很多方面需要重视,像游戏引擎架构(可扩展性)、

脚本引擎、声音引擎、GUI系统、游戏编辑器、资源管理、版本更新方法等,网游的话就是另一个话题了。本人对网游暂无研究,最难的部分可能是网络安全和数据传输,同步等。

 

————————————————————————-

一不小心扯了2000+字了,也不知我的这篇经验总结对读者有没有启发作用。现在说说我自己。我是在大学时开始接触编程,兴趣不算太浓,只是因为我自己喜欢玩游戏,所以才报了软件工程专业..一开始总是在想学编程是否有前途,是不是真的很难学。而其实现在还是在想。毕竟谁也不想随随便便就过了一生。对于游戏开发,我也仅仅是个初学者,我不奢望能掌握游戏开发的全部知识,只是梦想着有一天,能拿着自己的游戏,在某个游戏展上介绍自己的游戏~

工科专业,任何一个学起来都不会轻松,如果是要成为领域高手。大学本科,确实是打基础(不只是专业课程学习)的时期,而也是寻找人生方向的时期。这个时候很容易浮躁,可能因为不喜欢自己的专业还是没有信心。个人认为,无论你的打算是怎样,只要生活态度是好的,学习态度是向上的,对自己所作的每一个决定都负责,每一天都过得充实、健康,那就够了。不要为明天忧虑。

Feedback

# re: [游戏开发经验分享]关于游戏中的图形学   回复  更多评论   

2011-09-20 02:29 by K.V
看你挺清醒的,生活应该也是充实快乐的吧。珍惜大学的时光。加油。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理