在论坛里,经常看到有些网友说中国的游戏开发别的都不缺,就缺好的创意策化.其实,中国游戏开发什么都缺,游戏程序设计开发,美工,3D,AI都很落后.
目前国外流行的都是3D游戏(如半条命2),开发该类游戏的重要基础之一就是计算机图形学,而且是real-time rendering(实时绘制).因此游戏程序开发与一般程序设计不同,有一定的门槛,不象写信息管理系统程序,无论谁学几句SQL语句,便能操刀上阵了.
我不知道大家有没有深入地研究过计算机图形学. 要真正理解计算机图形学,必须灵活地运用高等数学,线性代数,计算数学等知识,还要有较好的英语(因为资料大部分是英文的), 当然还要学习大量的图形学算法。(很多算法并不是一成不变的,在真正实现时有很多的技巧). 所以我说搞计算机图形学,要求的门槛较高,要求理论与实践并举。
要开发3D游戏,首先要学习计算机图形学,但由于各种原因,国内现有的计算机图形学书籍都比较初级,没有深入的.而且都是比较传统的.2000年左右,随着显卡技术(GPU)的革命性突破,实时绘制大行其道,国外这方面的书籍很多,可在中国却看不到,我国没有把外版书直接放在书店卖的传统(怕太贵卖不掉,一本书要五百人民币左右);要等翻译吧,国内一年在这方面也翻译不了几本,而且等到翻译出来了,有些技术也成昨日黄花了,再说翻译的水准也不行(估计翻译的人员自己也不太懂);等影印版吧,便宜,可国外出版社哪肯把能卖大价钱的畅销书贱卖给我国.
国内学术界的杂志关于计算机图形学的文章很少,不象国外有很本多专门的计算机图形学杂志,而且高水平的很少.于是国内这方面的印刷资料基本上没有.国内也有些人编过3D的编程书籍,但太小儿科,这样的书没什么帮助.
大家都看过水世界,泰坦尼克号,我们都为电影中那些以假乱真的电影特技深深地折服.那些计算机生成的高度真实感的海洋让人看不出破绽.国外的计算机图形学研究和实际的应用贴得很近,电影特效、动画中所用到的都是最新的研究成果。反观国内,学术界和CG界就像是两个陌生人一样。从无来往,也从不关心对方的存在。
而且还有一个奇怪的现象,学术杂志,书籍很少提到那些国际上知名的图形学研究专家,新的技术,在非技术性的CG杂志上却有介绍,在CG杂志上有不少图片来自于SIGGRAPH(世界图形学年会).再看看国内学术界编的那些图形学教材,在"正文"里根本不提到SIGGRAPH这几个字.为什么有这种现象???
常看英文文献的网友,会去国外下载高水平论文(如SIGGRPAH),但由于这些论文都需要一定的背景知识,否则很难看懂.这些背景知识散见于以前的论文和书籍.前面说过图形学外文书籍国内是不容易找到的,有些论文在网上只有会员才能下,一般人只能看个摘要.当然还有一个途径,花钱还是能买到的,贵啊.(国内的一些大图书馆有这项服务)
所以,在国内一个业余爱好者研究计算机图形学的环境很差, 由于资料的限制,学习中充满着艰辛. 对于一些深入的课题,比如说绘制具有高度真实感的水流,海洋,高山,火焰,烟雾,布料,没有相关的系统性资料. 有一些图形学中相当经典的图书,论文,作业余爱好者,是看不到的. 由于3D知识不普及,周围很少有人与你有同样的兴趣. 说到3D,就知道3DMAX,MAYA,很少有人去想一想这背后的图形学原理.永远只能跟在外国人之后亦步亦趋.有些网友虽然会依葫芦画瓢写VERTEX SHADER,PIXEL SHADER来达到特殊的效果,但对于这些程序背后的原理却一点儿不清楚,direct3D下有很多例子,能理解的人又有几个,HDRI,Subsurface Scattering,PRT这些术语背后后技术更是很少有人涉及.可能有人会说,既然你想学,可以直接去AMAZON买原版书啊.可是一个人处于学习能力最旺盛时候,往往是在学生时代,但那个时候也是最缺钱的时候,一本原版书需要五六百…
由此造成国内民间对计算机图形学的认识很肤浅,没有普及,大部分计算机专业的学生都不太懂,运动员都是从群众中选拔出来的,群众体质较差,运动员也好不到哪儿去.可想而知专业的3D游戏程序设计水平会高吗?--- 空中楼阁.
而国外不一样,一个业余爱好者占有的资料会比大学教授都多,水平也就更高.(看看国外那些个3d引擎)国内大部分的游戏开发论坛都没有实质性内容,很肤浅.
所以希望出版社或相关部门能意识到这个问题,出版社最好能直接引进高水平,有深度的计算机图形学图书(不要老是VC,VB,JAVA),语言是工具,只有运用到各个专门领域才能发挥更大的作用.
这些都是高水平的real-time rendering书籍,看看国外有这么多,那儿的业余爱好者多幸福.这些书国内基本上没有,国内的业余爱好者有多悲惨.(其中部分书籍有英文电子版,但一些经典的好书往往没有电子版)
Essential Mathematics for Games and Interactive Applications, Jim Van Verth and Lars Bishop, ISBN 1-55860-863-X
GPU Gems, edited by Randima Fernando.
Collision Detection, by Gino van den Bergen (table of contents)
Game Physics, by Dave Eberly (companion web site)
ShaderX2: Introductions and Tutorials with DirectX 9, edited by Wolfgang F. Engel (table of contents)
ShaderX2: Shader Programming Tips and Tricks with DirectX 9, edited by Wolfgang F. Engel (table of contents) note that this is a separate volume from the previous book
Essential Mathematics for Games and Interactive Applications, by Jim Van Verth and Lars Bishop, Sept. 2003
Graphics Programming Methods, edited by Jeff Lander, July 2003
Real-Time 3D Terrain Engines Using C++ and DirectX 9 , by Greg Snook, June 2003
3D Computer Graphics: A Mathematical Introduction with OpenGL, by Samuel R. Buss, June 2003 (sample code, etc.)
Advanced 3D Game Programming with DirectX 9.0, by Peter Walsh and Adrian Perez, April 2003.
The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics, by Randima Fernando and Mark J. Kilgard, February 2003 (Sample chapters and more, Gamasutra excerpt)
Game Programming Tricks of the Trade, by Lorenzo Phillips, Sept. 2002
Direct3D ShaderX: Vertex and Pixel Shader Tips and Tricks, by Wolfgang F. Engel (Table of Contents and more; Introduction; Samples 1 & 2), 2002
The OpenGL Extensions Guide, by Eric Lengyel (table of contents and sample, in-depth table of contents)
3D Games, Volume 2: Animation and Advanced Real-Time Rendering, by Alan Watt and Fabio Policarpo (their Fly3D SDK is online), 2003
Game Programming Gems 3, edited by Dante Treglia and Mark DeLoura, 2002 (see the series web site for upcoming volumes)
Geometric Tools for Computer Graphics, by Philip Schneider and David Eberly, Sept. 2002 (companion web site)
Focus On 3D Terrain Programming, by Trent Polack, Dec. 2002 (comes with CD; Publisher's description)
Vector Game Math Processors, by James C. Leiterman, Dec. 2002.
3D Math Primer for Graphics and Game Development, by Fletcher Dunn and Ian Parberry, Dec. 2002. (more information at their site)
Fundamentals of Computer Graphics, by Peter Shirley, July 2002
Real-Time Shading, by Marc Olano et al., July 2002
Level of Detail for 3D Graphics, by David Luebke et al., July 2002 (companion web site)
Advanced 3D Game Development with OpenGL, by David Byttow and Ryan Parker, 2002
Real-Time Shader Programming, by Ron Fosner, Dec. 2002
Jim Blinn's Corner: Notation, Notation, Notation, by Jim Blinn, July 2002
Software Optimization Cookbook, by Richard Gerber, March 2002
Real Time Rendering Tricks and Techniques in DirectX, by Kelly Dempski, 2002
Texturing & Modeling: A Procedural Approach, 3rd Edition, by David Ebert et al., 2002 (companion web site)
Special Effects Game Programming with DirectX 8.0, by Mason McCuskey, 2002
Non-Photorealisting Computer Graphics, by Thomas Strothotte and Stefan Schlechtweg, June 2002 (companion web site)
Mathematics for 3D Game Programming & Computer Graphics, by Eric Lengyel, 2001
Game Programming Gems 2, edited by Mark DeLoura (Table of Contents and introduction), 2001
OpenGL Game Programming, by Kevin Hawkins and Dave Astle (source code), 2001
Subdivision Methods for Geometric Design: A Constructive Approach, by Joe Warren and Henrik Weimer, 2001 (companion web site and publisher's web site)
Non-Photorealistic Rendering, by Gooch and Gooch, 2001
Computer Animation: Algorithms and Techniques, by Richard Parent, 2001
Practical Algorithms for 3d Computer Graphics, by R. Stuart Ferguson, 2001
Game Programming Gems, edited by Mark DeLoura (Table of Contents and code updates), 2000
Game Engine Design: A Practical Approach to Real-Time Computer Graphics, by Dave Eberly (his code is online), 2000
3D Games, Volume 1: Real-time Rendering and Software Technology, by Alan Watt and Fabio Policarpo (their Fly3D SDK is online), 2000
3D Graphics Programming: Games and Beyond, by Sergei Savchenko, 2000
Computational Geometry: Algorithms and Applications, by deBerg, Van Kreveld, Overmars, and Schwarzkopf, 2000
Computer Graphics Using OpenGL by F.S. Hill, Jr., 2000 (Table of Contents and sample chapter)
3D Game Engine Design, by David Eberly, Jan. 2001 (companion web site)
Essential Mathematics for Computer Graphics Fast, by John Vince, Oct. 2001
Computer Graphics Through Key Mathematics, by Huw Jones, May 2001
Mathematics for Computer Graphics Applications, by Michael Mortenson, 1999
国内无书可读的环境一日不改变,说什么提高中国游戏开发水平都是空谈.
中国人很聪明,为什么在学术上一直落后?一个很重要的原因是,一个人大学本科毕业,研究生期间,教师便没有更多的东西教给他了,他即使想自学,图书馆里也没有什么新的,深入的图书可供阅读.而国外就不同,研究生期间,有大量令人兴奋的知识在等着他来学.
No one knows,and each person can have a significant effect on the way the future turns out.There is no one future,no course that must occur.You create it.
摘自<real-time rendering>的最后一句.
You create it.我很欣赏这句话.
国内的学者,是吝啬这句话的,好象学术只是大学里的专利.
最后我还是以You create it.来结尾.
|
OpenGL
OpenGL是以SGI的GL三维图形库为基础制定的一个通用共享的开放性三维图形标准。
采用者:Microsoft、SGI、IBM、DEC、SUN、HP等。
开发软件:动画制作 Soft Image、3D Studio MAX
仿真 Open Inventor
VR World Tool Kit
CAM ProEngineer
GIS ARC/INFO等
OpenGL
功能
1。建模 2。变换 3。颜色模式设置 4。光照和材质设置 5。纹理映射 6。位图显示和图像增强
7。双缓存 8。消隐算法
OpenGL图形库共有一百多个函数,其中包括核心函数115个,前缀"gl".
OpenGL实用库(OpenGL utility library, GLU)的函数功能更高级,共43个,前缀"glu".
OpenGL辅助库(OpenGL auxiliary library, GLAUX)的函数是一些特殊的函数,共有31个,前缀"aux".
另外还有六个WGL函数,用于和Windows系统连接。
作为一个与硬件独立的图形接口,OpenGL不提供硬件设备操作函数,同时也不提供复杂性体的图形操作函数。用户必须从最基本的图形单元构造三维模型。
OpenGL基本几何图元绘制
1.点、线、多边形
glBegin(GLenum mode);
glVertex{234}{sifd}[v](TYPE coords);
glEnd();
其中mode可以是。。。。。。其中一种
注意:多边形必须为凸多边形,否则必须进行剖分。
2.设置点、线、多边形属性
glPointSize(GLfloat size);
glLineWidth(GLfloat width);
glLineStipple(GLint factor, GLushort pattern);
glPolygonStipple(const GLubyte *mask);
glColor();
glIndex();
glNormal();
glEvalCoord();
glCallList();
glCallLists();
glTexCoord();
glEdgeFlag();
glMaterial();
Windos环境下的OpenGL编程机制
一般Windows绘图通过GDI和设备上下文DC(Device Contexts)实现;
OpenGL绘图是在渲染上下文RC(Rendering Contexts)和设置了像素格式的DC一起作用下进行的。
由PIXELFORMATDESCRIPTOR结构描述
一个线程只能同时拥有一个当前的渲染上下文RC。用户如果在一个线程内对不同设备作图,只能通过调用函数wglMakeCurrent更换与RC对应的DC来完成,与此对应,一个RC也只能属于一个线程,不能被不同线程同时共享。
OpenGL变换
几何变换
glLoadMatrix{fd}(const Type *m);
glMultMatrix{fd}(const Type *m);
glTranslate{fd}();
投影变换
正射投影、透视投影
OpenGL 投影分为正交投影和透视投影。
正交投影即将 3D 模型平行的映射到平面上。函数:
glOrtho(xleft, xright, ybottom, ytop, znear, zfar);
透视投影将 3D 模型映射到相对某个观察点的平面上。 函数:
gluPerspective(fovy, aspect, znear, zfar);
OpenGL 几何变换可以:平移, 旋转, 缩放。
glTranslatef(x, y, z);
glRotatef(θ, x, y, z);
glScalef(x, y, z);
为了维护几何变换和投影变换, OpenGL 维护两个栈: 投影变换栈, 几何变换栈。 每次投影或者几何变换, 都是用相应的矩阵乘对应的栈顶元素, 并替换掉上次的栈顶。 每次要计算屏幕输出时, OpenGL 采取这样的方式进行:
屏幕坐标点 = 3D 模型点 * 几何变换栈矩阵(n...1) * 投影变换栈矩阵(n...1)。
上面的 n...1 表示从栈顶到栈底。 更复杂点的流程是:
屏幕坐标点 = 3D 模型坐标 -〉 (几何变换矩阵) -〉 人眼坐标 -〉 (投影变换矩阵) -〉 正则设备坐标(相对于 OpenGL 屏幕坐标原点) -〉 校正成窗口坐标(相对于窗口坐标)
一般的, 如果想变化观察模型的角度, 可以在切换到几何变换栈的时候进行:
glMatrixMode(GL_MODELVIEW); // 模型视图矩阵
glLoadIdentity();
gluLookAt(6.0, 8.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 旋转视点
变换细节。 OpenGL 使用状态机的思想。 我们可以用两个函数切换当前栈。
切换当前操作的栈为投影变换栈:glMatrixMode(GL_PROJECTION);
切换当前操作的栈为几何变换栈:glMatrixMode(GL_MODELVIEW);
其中可以使用下面的函数来清除当前操作栈的内容:
glLoadIdentity();
对于几何变换栈, 还有下面两个操作可以使用:
glPushMatrix(); // 保存当前坐标系
glPopMatrix(); // 恢复当前坐标系
glPushMatrix 复制当前栈顶, 并把复制的内容再次放到栈顶上, 能够保护栈上以前的内容。
一般的,我们可以这样操作栈:
glMatrixMode(GL_PROJECTION); // 切换到投影变换栈
glLoadIdentity(); // 初始化投影变换栈
gluPrespective(30.0, aspect, 1.0, 50.0); // 压入透视投影矩阵
glMatrixMode(GL_MODELVIEW); // 切换到几何变换栈
切换到 GL_MODEVIEW 时, OpenGL 自动清空几何变换栈的内容。
裁剪变换
视口变换
显示列表
帧缓存和动画
OpenGL纹理映射
纹理定义
纹理控制和滤波
OpenGL光照
设置光源
明暗处理
材质
void glMaterial{if}[v](GLenum face,GLenum pname,TYPE param);
face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;pname说明一个特定的材质;param是材质的具体数值,若函数为向量形式,则param是一组值的指针,反之为参数值本身。非向量形式仅用于设置GL_SHINESS。pname参数值具体内容见表:
参数名 缺省值 说明
GL_AMBIENT (0.2, 0.2, 0.2, 1.0) 材料的环境光颜色
GL_DIFFUSE (0.8, 0.8, 0.8, 1.0) 材料的漫反射光颜色
GL_AMBIENT_AND_DIFFUSE 材料的环境光和漫反射光颜色
GL_SPECULAR (0.0, 0.0, 0.0, 1.0) 材料的镜面反射光颜色
GL_SHINESS 0.0 镜面指数(光亮度)
GL_EMISSION (0.0, 0.0, 0.0, 1.0) 材料的辐射光颜色
GL_COLOR_INDEXES (0, 1, 1) 材料的环境光、漫反射光和镜面光颜色
材质的颜色与光源的颜色有些不同。对于光源,R、G、B值等于R、G、B对其最大强度的百分比。若光源颜色的R、G、B值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;若R=G=1.0,B=0.0,则光源为黄色。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R=1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。
同样,如果有两束光,相应的值分别为(R1、G1、B1)和(R2、G2、B2),则OpenGL将各个颜色成分相加,得到(R1+R2、G1+G2、B1+B2),若任一成分的和值大于1(超出了设备所能显示的亮度)则约简到1.0。
最后,材质是单个物体的属性,对于不同物体,应该分别设置。
注意很重要的一点:不管是单个还是多个光源,LIGHT0和其他光源如LIGHT1、LIGHT2等等效果是不一样的,默认设置不同,在相同条件下得到的结果也不一样。具体原因不知道为什么,但是测试一下就会发现确实有很大差别。
OpenGL字体
|