学了哪些知识,计算机图形学 入门才算入门

openGL从零学起之入门介绍
来源:博客园
最近项目中涉及到了一些特效,如字体描边、场景调色和精灵的一些着色等,接触到了openGl部分,再加上之前有过unity3d的开发经验,就越发的对openGl感兴趣,应该说是对3D感兴趣吧。其实自己一直都感兴趣的就是虚拟现实的仿真技术和人工智能,希望以后能有机会进入这两个领域。废话不多说,直接开始openGl之旅,这个以前没接触过,有什么理解不到位或者完全错误的地方,请大神们直接指出,在此谢过了。 当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口。值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL可以在微机中广泛应用。 OpenGL非常接近硬件,是一个图形与硬件的接口,包括了100多个图形函数用来建立三维模型和进行三维实时交互。 简单地说,OpenGL具有 建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊 等功能,具体内容会逐步学习。 大体概括一下openGl的渲染绘制过程: ① 根据基本图元建模(OpenGL中把“点、线、多边形、图像和位图”都作为基本图形单元)。 ② 调整模型位置和设置视图观察点。 ③ 渲染色彩,添加光照、材质和纹理映射。 ④ 光栈化:把模型的数学描述信息和色彩信息转化为计算机屏幕上的像素,完成绘制。 库函数 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用 C 语言风格,提供大量的函数来进行图形的处理和显示。 常用四种函数库来提供所需要的函数,分别是 基本库、实用库、辅助库、工具库 。我们需要记住一些常用函数是出自哪个库的,因为 不同的库的函数前缀不同 。 1、基本库:核心库 包含的函数有115个,提供最基本的函数,其 前缀是“gl” ;这部分函数用于常规的、核心的图形处理,由gl.dll来负责解释执行。 例如:
绘制--基本--几何图元的函数 glBegain()、glEnd()、glNormal*()、glVertex*() 矩阵操作、几何变换和投影变换的函数 矩阵入栈:glPushMatrix()
位置变换:glTranslate*()  
投影变换函数glOrtho()、glFrustum() 矩阵出栈:glPopMatrix()
旋转变换:glRotate*()
视口变换函数glViewport() 装载矩阵:glLoadMatrix()
缩放变换:glScale*() 矩阵相乘:glMultMatrix() 矩阵模式:glMatrixMode() 矩阵标准化:glLoadIdentity() 颜色、光照和材质的函数 颜色:glColor*()、glIndex*() 光照:glLight*() 、glLightModel*() 材质:glMaterial*() 显示列表函数 创建:glNewList() 结束:glEndList() 生成:glGenLists() 调用:glCallList() 删除:glDeleteLists() 纹理映射函数 一维纹理:glTexImage1D() 二维纹理:glTexImage2D() 设置纹理参数:glTexParameter*() 纹理环境:glTexEnv*() 纹理坐标:glTetCoord*() 特殊效果函数 融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。 光栅化、象素操作函数 像素位置:glRasterPos*() 线型宽度:glLineWidth() 多边形绘制模式:glPolygonMode() 读取象素:glReadPixel() 复制象素:glCopyPixel() 曲线与曲面的绘制函数 生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。 状态设置与查询函数 glGet*()、glEnable()、glGetError()等。 2、实用库(OpenGL utility library,GLU) 包含的函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个, 前缀为“glu” 。 Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作,即做了一个封装。 库中常用函数: 辅助纹理贴图函数 gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。 坐标转换和投影变换函数 相对于基本库,这里的变换函数更高级一些,个人感觉体现在维度的不同,偏三维更复杂。 透视投影:gluPerspective() 正交投影:gluOrtho2D() 三维视点(观察点):gluLookAt() 二次曲面绘制工具 创建和删除二次曲面:gluNewQuadric()、gluDeleteQuadric() 球面:gluSphere() 圆柱面:gluCylinder() 错误反馈工具 获取出错信息的字符串gluErrorString()等。 3、OpenGL辅助库(OpenGL auxiliarylibrary,GLAUX) 包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。 创建aux库是为了学习和编写OpenGL程序,它更像是一个用于测试创意的预备基础接管。 Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。 因此这里就不再研究,重点研究的工具库。 4、OpenGL工具库(OpenGL Utility ToolKit) 包含大约30多个函数,函数名 前缀为“glut” ,此函数由glut.dll来负责解释执行。 常用函数包括: 窗口操作函数 窗口初始化:glutInit(),对GLUT进行初始化, 这个函数必须在其它的GLUT使用之前调用一次 。其格式比较死板,一般照抄这句 glutInit(&argc, argv) 就可以了。 窗口显示模式:glutInitDisplayMode(),设置显示方式。 窗口大小:glutInitWindowSize()。 窗口位置:glutInitWindowPosition() 窗口创建:glutCreateWindow("窗口标题"),根据前面设置的信息创建窗口。窗口被创建后,并不立即显示到屏幕上,需要调用glutMainLoop才能看到窗口。 设置绘图函数:glutDisplayFunc(),传入一个用来绘图的函数进行绘制。 开启绘图循环:glutMainLoop,死循环,监听所有事件处理。 回调函数 响应刷新消息、 键盘 消息、 鼠标 消息、定时器函数等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。 创建复杂的三维物体 实心球体:glutSolidSphere() 网状球体:glutWireSphere() 菜单函数 创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。 OpenGl数据类型 和C语言中的类型差不多,只不过在类型名前添加前缀:GL 如:GLint整型、GLfloat浮点型、GLvoid空类型等 OpenGl函数命名规律 以点系列函数名为例:glVertex*()系列 glVertex2d glVertex2f glVertex3f glVertex3fv 数字 表示参数的个数,2表示有两个参数,3表示三个,4表示四个。 字母 表示参数的类型: s 短整型,表示16位整数(OpenGL中将这个类型定义为GLshort), i 整型,表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei), f 浮点型,表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf), d 双精度浮点型,表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。 v 数组型,表示传递的几个参数将使用指针的方式。 GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};//这三个参数以数组的形式传递过去 glVertex3fv(VertexArr3); 说了这么多,都是一些基本概念,下一篇开始对每一个知识点进行梳理并写出完整的小例子。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动求实时渲染基本算法好书推荐? - 知乎1870被浏览98110分享邀请回答74421 条评论分享收藏感谢收起8911 条评论分享收藏感谢收起查看更多回答计算机图形学(3)
3D图形学理论入门指南
& && &&&当我还小的时候,我曾以为计算机图形学是最酷的玩意儿。但是随即我认识到,学习图形学——创建那些超级闪亮的计算机程序——比我想象的要难上许多。我四处出击,阅读OpenGL渲染管线详解之类的文章,浏览关于图形工作原理的博客、网站等,对照着教程学习,试图搞懂一切。结果呢,一无所获。当我按照NeHe的教程设置好一切,却因为错误的调用了某个glXXX()函数,导致各种错误。我不具备正确调试程序的基础理论知识,所以我放弃了——就像我那个年纪的少年在遇到挫折时通常会做的那样。
& && &&&然而,在若干年之后,我有机会能够在大学里参加一些计算机图形学的课程。这次我终于知道它们是如何正确工作了。如果我早知道这些,我那时应该能获得更多成功。所以,为了帮助和我有类似困境的人们,我打算分享下我学到的东西。
图形学背后的理念
& 先想想真实世界的样子。在3D真实世界里,光线从许多个不同的光源发出,在多个物体间跳转,然后一部分光子通过眼球刺激到你的视网膜。在真实的场景里,3D的世界投影到的表面。虽然你的大脑从环境中获取各种视觉元素然后组成一个立体的影像来反映整个3D空间,但这些都源于2D信息。当场景中的物体移动,或者你相对于你的场景发生移动,或光照改变时,视网膜上的2D图像也立刻发生改变。我们的视觉系统快速处理图像,然后大脑据此构造出3D模型。
如果我们能够获取一些图片,然后以类似或更高的速率来交替显示它们,就能生成一个看起来像真实空间的场景。电影大致基于同一原理工作。在电影里,3D场景的图片高速闪过,看起来就像连续的一样。请参照上面马的例子。如果我们能够在计算机上持续的绘制一个运动的场景,那么它看起来就像一个3D的世界一样。图形学就是这样工作的:将虚拟的3D世界快速转换成2D表现形式,让大脑感觉像是一个3D的场景一样。
& && &&&人类视觉将一系列图片看作连续的阈值大约时16Hz。对计算机来说,我们有最多62.5毫秒来完成下列事情:
& && &&&判断虚拟场景中眼睛看向哪里。
& && &&&计算场景在这个角度下如何呈现。
& && &&&计算需要被绘制在屏幕上的像素的颜色。
& && &&&用这些颜色填充帧缓存。
& && &&&将缓存发送至显示设备。
& && &&&显示图片。
& && &&&这是一个复杂的。时间上的限制意味着我们不能直接硬来——比如往3D场景里扔一堆光子,计算它们的轨迹和强度,算出哪些能够照进眼睛并将之映射到2D的图片上,最后绘制。(这并不完全正确,因为这有点像光线追踪时做的事。但光线追踪技术相当复杂,而且完全是另一回事,因此也可以这么说。)幸运的是,我们可以利用一些很酷的技巧来大大缩减计算量。
基础图形理论
& && &&&整个世界是一个舞台
打个比方。假设你在一个山谷里面,四面环山,河流前方是一片草地,类似上面这张Bob Ross的绘画作品中的场景。你想用一张图展现这个3D场景。该怎么做呢?嗯,我们可以尝试绘制一张包含所有景色的图。那意味着我们必须得挑选一个观察角度,只绘制能看到的部分,忽略其余的。然后还得决定哪些部分在前,哪些部分在后。我们能看到草地,但它遮挡了部分河流。群山在远处,但它们遮挡了后方的一切景色。由于场景的真实大小远大于我们画布的大小,我们还得计算如何缩放。然后我们绘制场景,将光照和阴影考虑进去,以及远处山间的雾气,等等。这和计算机中的图形处理过程十分相像。主要步骤如下:
& && &&&决定世界中的物体长什么样子。
& && &&&决定物体在世界中的位置。
& && &&&决定相机的位置和哪些场景需要被绘制。
& && &&&决定物体相对于相机的位置。
& && &&&绘制场景中的物体。
& && &&&将场景缩放到视窗大小一致的图像上。
& && &&&上述步骤大致是为了把3D世界中的某个点映射到屏幕上的2D图像上。乍一看工作量很大,其实可以利用一些数学技巧来快速完成工作。还记得学代数的时候曾想,“学这个有什么用?”其中一个用处就是图形学!
& && &&&我们可以用矩阵来将世界中的坐标映射到图像上。为什么选择矩阵?其中一个原因是很多操作都可以用矩阵来表示。最重要的是我们可以通过矩阵乘法将多个操作连接起来,最终只用一个矩阵来代表一系列操作!即使要做50个变换,只需将所有矩阵相乘就得到一个同时执行所有变换的矩阵。
& && &&&我们可以定义一些矩阵来完成我们上述绘画示例中的操作(定义场景,定义视野等)。这些矩阵能够将场景从一个坐标系转换到另一个坐标系。这些坐标系之间的转换称为变换。我们将要讨论每一个坐标系以及不同坐标系之间的转换过程。
& && &&&模型坐标系——分解模型
& && &&&如何在屏幕上快速绘制物体呢?计算机相当擅长连续快速完成大量相对简单的指令。为了利用这一点,如果我们能够用简单的形状来表示整个世界,就能够通过快速处理许多简单的形状来优化图形算法。因此,计算机不需要知道一座山或一片草地到底是什么就能够绘制它们。
& && &&&我们需要创建一些算法把图形分解成简单的多边形。这个过程称作曲面细分(Tessellation)。虽然我们也可以用正方形,但三角形更好一些。使用三角形有很多优势,例如所有的三角形的点都是共平面(coplanar)的,而且几乎所有形状都能近似分解成多个三角形。唯一的问题是圆形物体会看起来像是有棱角的。不过,要是三角面足够小的话,比如1个像素大小,我们就不会注意到了。关于如何曲面细分的“最佳方法”有很多,具体取决于你要分解的物体的形状。
假设我们要分解一个球形。我们可以将球体的中心位置定为本地的原点。这样我们就可以用一个公式来获得球面上的一些点然后将这些点连接成多边形以供绘制。一个常用的公式是S(u,v)=[r sin u cos v,r&&sin u sin v,r cos v],u和v的取值范围分别是u∈[0,π],v∈[0,2π],r是球体的半径。就像你在图中看到的那样,球体表面的点被绘制成矩形。我们能够很方便的把它们连成三角形。
& && &&&球面上的点位于所谓的模型坐标系。坐标相对于本地的原点定义,比如示例中球体的中心位置。如果我们想要将物体放置于场景中,我们可以定义一个从场景原点到场景中球体的原点的向量,然后把这个向量和球面上每个点的坐标相加。这样我们就将模型放置到了世界坐标系中。
& && &&&世界坐标系——将物体置于世界中
& && &&&到这儿我们的图形学之旅才真正开始。我们在某处定义一个原点,场景中的每个点都基于从原点到该点的一个向量来定义。虽然场景是3D的,我们还是得用一个4维的坐标来定义每个点[x,y,z,w],代表该点的坐标为[x/w,y/w,z/w]。这种映射称为齐次坐标。使用齐次坐标有一些好处,但是这里不做讨论。只需知道我们使用齐次坐标就够了。
& && &&&假设我们要在场景中移动,那么问题来了。如果我们要移动视线,或者移动相机到另一个位置,或者让整个世界围着相机移动。在计算机的世界里,移动整个世界更容易一点,所以我们就这样做,让相机固定不动。模型-视图矩阵(modelview matrix)是一个4x4矩阵,可以用来移动世界中的每一个点,然后让相机固定不动。这个矩阵基本上就是一系列旋转、位移、缩放的集合。我们在世界坐标系中将点和模型-视图矩阵相乘,这将使我们进入观察坐标系(viewing
coordinates)。
观察坐标系—选择能看到的
& && &&&在我们旋转、位移、缩放了世界之后,我们可以只选择世界中的一部分加以呈现。我们通过定义一个视锥体来实现。视锥由观察坐标系中的六个裁剪面组成。在最终绘制阶段,所有位于视锥范围以外的物体都将被裁掉,或丢弃掉。视锥通过一个4x4矩阵来定义。OpenGL的glFrustrum()方法是这样定义这个矩阵的:
我们可以改变这个矩阵以应对不同情况如正交或透视。透视图里有一个消失的点,正交视图没有。通常在绘画里见到的是透视图,正交视图在技术图中中较为多见。因为这个矩阵决定了物体是如何投影到屏幕上的,所以也叫做投影矩阵。t,b,l,r,n,f代表顶部、底部、左侧、右侧、近处、原处的裁剪面的坐标。乘以投影矩阵将使点从观察坐标系前往所谓的裁剪坐标系(clip coordinates)。
裁剪坐标系——只绘制能看到的
& && &&&这个坐标系有点不同,因为它是左手坐标系(在此之前我们一直使用的右手坐标系),而且是从我们之前定义的视锥体映射到一个x,y,z范围都在(-1,1)之间的正方体。
&到现在为止,我们一直追踪场景中的所有点。然而,一旦进入裁剪空间,我们就可以开始裁掉一部分了。还记得坐标从4D到3D的转换吗?我们曾说过,[x,y,z,w]4D=[x/w,y/w,z/w]3D。因为我们只需要位于视锥范围以内的点,我们接下来只需处理符合-1≤x/w≤1或-w≤x≤w的点即可。y和z坐标也一样。这是一个简单的办法分辨一个点是否位于我们视野之内。
& && &&&如果某些点位于视锥体内,我们对它们执行透视出发(perspective divide),对每个坐标除以w来将其从4D坐标转换成3D坐标。这些点还是位于左手裁剪坐标系中,但是到了这个阶段,我们称其为规格化设备坐标(normalized device coordinates)。
规格化设备坐标系——计算遮挡关系
& && &&&你可以把这个想成映射到图像的中间步骤。想象一下所有可能的图像大小,我们并不想渲染成一张图片然后进行各种缩放或拉伸或当图像大小发生改变时重新渲染。规格化设备坐标(NDC)很有用,因为无论图片最终大小是多少,你可以在NDC里面针对性的进行合适的缩放。在NDC里你将看到图片如何被构造。被渲染的图像是视锥体里的物体在近裁剪面上的投影。因此,一个点在Z轴上的值越小,这个点就越近。
& && &&&这个阶段,通常我们不再进行矩阵计算,而是应用一个视窗变换。这通常只是拉伸坐标来适应视窗,或最终图像大小。最后一步是通过转换坐标到窗口坐标来绘制图像。
窗口坐标系——将物体缩放到画布
& && &&&窗口是图像最终被绘制的地方。在这里,我们的3D世界呈现为近裁剪面上的一张2D图像。我们可以使用一系列的线条和多边形算法来绘制最终图像。此时,一些2D效果,如抗锯齿和多边形裁剪,在图片被被绘制之前执行。
& && &&&然而,窗口可能有不同的坐标系统。比如,有时图片基于向右为X+,向下为Y+绘制。为了正确绘制图片,有时候可能需要做一些转换。
又回来了——图形渲染管线
& && &&&上述步骤你不用都亲历亲为。某种程度上,你会使用图形渲染库来定义诸如模型视图矩阵、投影矩阵以及世界坐标系中的多边形之类的东西,渲染库会搞定一切。如果你在设计一个游戏,你不需要在意多边形是如何被绘制的,只需确保它们执行的正确又快速,对吗?
& && &&&OpenGL和DirectX之类的库效率很高,而且能够有效利用精密的图形硬件来简单又快速的执行这些计算。它们广泛使用,所以最好适应它们。它们还给你留下很大空间来自定义一些事情,你会为你能做到的某些事感到惊讶的!
& && &&&这是一个关于图形学理论的简单概览。渲染过程中后续还有很多步骤发生,但是这应该能给你一个大致的方向,让你在阅读其它文章或论坛里的相关技术时能够理解的更好。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152571次
积分:2582
积分:2582
排名:第14809名
原创:64篇
转载:289篇
评论:17条
(5)(17)(4)(13)(5)(12)(21)(96)(36)(19)(13)(17)(41)(32)(23)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'推荐这篇日记的豆列
&&&&&&&&&&&&转载自&感谢 from &以我现在的水平观之,3D图形学分3大块的学习内容:& a.空间几何数学: & &空间几何变换,&加速算法,&多边形技术,&曲线和曲面,&相交测试,&碰撞测试。& b.光照着色系统: & &光照,&纹理贴图,&高级象素着色光照,&艺术性渲染.& c.程序技术性应用:&公告板,&精灵,&天空盒,&体绘制,&材质系统,&场景图,&渲染队列.&&&2.在实际学习过程中,3个部分相互制约,故不能单方面突进,应保持一种平衡发展,使得相互促进,深化理解,达到比较流畅的学习曲线.3.相对重要性以a,b,c序减(时间将无情淘汰现有的程序技术性应用),深刻掌握图形学基础才是王道。4.3个部分都略有小成后,大量快速阅读网上各方面的杂家资料,应用基础知识去分析理解,在短时间内掌握各种程序性技巧。5.再次通观全局基础,遍览所有细节,以图有更深的理解.& & 最近很多人在问,我该如何学习OpenGL?我学完了OpenGL了,该怎么用?我想在回答这些类似的问题以前先和大家谈谈怎么学习API的方法,或许谈完了,我就不需要回答了。 &&&&& && 首先,我认为API是工具,不是本质,OpenGL/Direct3D的本质是图形学,而不是OpenGL/Direct3D的本身,API的本身只是一些Interface而已.如果你明白图形学的原理.那么你很容易这些接口的作用,以及为什么要有这些接口的存在.所以,我要说的第一点是:你要学习3D编程,不是学会了OpenGL/Direct3D就可以了。甚至会不会这些API都不是那么的重要(虽然这么说,或许很多人不太赞同).最重要的,最根本的是,你要明白这些API背后的图形学的原理---因为那才是根本中的根本.&&& && 下面我来介绍我对API学习的看法. && 我认为API的学习有两种方法:一是正向学习.二是反向学习.&&&& && 一:正向学习,所谓的正向学习,就是学习API的本身.我觉得这种方法是一种Brute Force行为.不是很好.我们只要看看API的特性,有那些部分.就可以了。比如学习Direct3D的时候,我们要知道它如何初始化,以及它和的结合.它在Direct3D8里引入了VS/PS.最后就是创建一个Direct3D应用的步骤和方法.这些就足够了。要不然.Direct3D那么多的函数,一个几十个参数。每一个都会要了我的命.&&&& && 正向学习的第二个作用就是你在熟悉了图形学和大概了解了API后,有空就来看看API的细节,然后思索一下API里提供的一些特性对你的程序有什么作用.比如Direct3D里的Two Side Stencil.OpenGL里的TextureCombine等。&& 二:逆向学习.这是根本的方法,到了这一步,你就可以真正的算是图形学入门了。这要求你要有一定的图形学基础.比如,你现在开始做一个demo.你预计你的demo里有一堆眩眩的效果,当然你也要明白你的这些眩眩的效果要怎么实现的.然后你去找API里对应的功能,我想如果你的想法正常,一般的功能在Direct3D/OpenGL里应该都会有的.当然你也会碰到你想要的功能在这些API里没有,但是这不重要,重要的是你又学到新东西了---这个特性在XX API里不支持^_^.&&& 通常我是采用先正向,再逆向,同时再进行正向学习的方法.希望以上的建议,对各位初学者有一定的帮助.&关于计算机图形学的学习注意: 本文尽量避免理论化的描述,试图用最通俗的语言介绍一下计算机图形学的学习,以及一些参考书目和网络资源; 本文不涉及对概念的定义,以免陷入学术讨论之中 本文是作者学习计算机图形学的体会,如果有不同的意见,请不要攻击和漫骂 本文合适的题目应当是:白话说学计算机图形学? 1.&引言
什么是计算机图形学?&本文尽量避免给它做严格的定义,但是通常来说,计算机图形学是数字图象处理的逆过程,这只是一个不确切的定义,后面我们会看到,实际上,计算机图形学、数字图象处理和计算机视觉在很多地方的区别不是非常清晰的,很多概念是相通的。
计算机图形学是用计算机来画东西的学科,数字图象处理是把外界获得的图象用计算机进行处理的学科。在法国,图形图象是一门课程。
如何学习计算机图形学呢?除了计算机图形学的基础知识以外,你还需要有以下的知识,你懂的越多,当然做的越好。 *&英语,&你一定要把英语学好,如果你想学习计算机图形学的话,尽量看英文的书籍和资料 *&数学,&计算机图形学里面的数学用的比较多,,我们可以列举一些常用的: 高等数学,数值分析,微分几何,拓扑,概率,&插值理论,(偏)微分方程… *&物理,&如果你要进行基于物理的建模,一些物理理论是要学习的: 力学(运动学,动力学,流体力学…),光学,有限元… *&编程语言:&C或C++是计算机图形学最通用的‘普通话’, *&数据结构:&你需要数据结构来描述你的图形对象,除了通用的链表、树等数据结构外,图形学还有自己特殊的数据结构 *&其他类别:&有的时候你需要其他学科的知识,根据你的需要去学习吧 上面列举的不是你必须学习的东西,而是计算机图形学可能会用到的东西,一定要记住,不要指望通过一本教材就学会计算机图形学,它比你想象的要复杂的多。 2.&图形学的问题 每个学科都有自己学科的特定问题,图形学要解决的是如何画出图来,得到需要的效果,当然这是图形学最大的一个问题。 在开始学习计算机图形学的时候,找一本简单的书看,对计算机图形学有个大概的认识,你就可以开始图形学之旅了: OpenGL&Programming&Guide:&The&Official&Guide&to&Learning&OpenGL,&Version&1.4,&Fourth&Edition OpenGL&SuperBible&(3rd&Edition)& 是比较好的学习计算机图形学的入门教材,在练中去学,一开始就去啃 Foley的 Computer&Graphics:&Principles&and&Practice,&Second&Edition&in&C& 不是好主意,会看的一头雾水,一本什么都讲的书的结果往往是什么都没讲清楚。 当你把OpenGL的基本内容掌握之后,你对图形学就有了大概的了解了 那么下面你可以来学习一下计算机图形学的数据结构和算法,下面的书比较适合 Joseph&O'Rourke&的Computational&Geometry&in&C,书里面有C的源代码,讲述简单,清晰,适合程序员学习 总的来说,计算机图形学涉及到2大部分:建模和渲染 2.1建模 你想画一个东西,首先要有它的几何模型,那么这个几何模型从什么地方来呢?下面的书很不错的: Gerald&Farin&的Curves&and&Surfaces&for&CAGD:&A&Practical&Guide 这本书就有一点的难度了,呵呵,要努力看啊 这本书算是CAGD&(计算机辅助几何设计)的经典图书,CAGD方面的全貌,还有2本很好的讲述曲面的书Bezier和Nurbs的书 Les&A.&Piegl,&Wayne&Tiller&的The&Nurbs&Book& 书里面有NURBS曲线、曲面的程序伪代码,很容易改成C的,书讲的通俗、易懂,但是你要有耐心看的:) 曲线与曲面的数学 这本书是法国人写的中文翻译版,里面还有Bezie本人写的序J,翻译的很不错的,看了你就掌握Bezier曲面技术了 //另外一些你想知道的事情:其他的造型方式-开始 注意:在后面会有这样的章节,标明 //另外一些你想知道的事情:其他的造型方式-开始 //另外一些你想知道的事情:其他的造型方式-结束 里面是我认为的一些高级话题,跳过他们不影响你学习计算机图形学,但是要学好就要注意了,呵呵 还有其他的一些造型技术,比如: 隐式曲面(Implicit&Surface)的造型: 就是用函数形式为F(&x&,y&,z&)&=&0的曲面进行造型,这样的造型技术适合描述动物器官一样的肉乎乎的东西,有2本书推荐大家 Jules&Bloomenthal编辑的Introduction&to&Implicit&Surfaces,是一本专著,讲述了Implicit&Surface建模型(Modeling),面片化(Polygonization),渲染(Rendering)的问题 Luiz&Velho&的&Implicit&Objects&Computer&Graphics&也是一本专著,讲述个更新的一些进展 细分曲面(Subdivision&Surface)造型 当用NURBS做造型的时候,曲面拼接是复杂的问题,在动画的时候,可能产生撕裂或者褶皱,Subdivision&Surface用来解决这个问题 Joe&Warren的Subdivision&Methods&for&Geometric&Design:&A&Constructive&Approach就是这方面的专著 从实际物体中得到造型,现在的技术可以用三维扫描仪得到物体表面的点,然后根据这些点把物体的表面计算出来,称为重建(Reconstruction),因为这些技术之在文章中论述,所以我们省略对它的描述 //另外一些你想知道的事情:其他的造型方式-结束 下面还是一个高级话题:) //另外一些你想知道的事情:光有造型是不够的!-开始 在你的几何模型做好之后,有一些问题需要对这个模型进一步处理,得到适合的模型,当面片很多的时候,或者模型很复杂的时候,需要对几何模型进行简化,才可以满足一些实时绘制的需要,这个技术叫做层次细节(LOD-Level&of&Detail)。下面的书就是讲这个的: David&Luebke编著的&Level&of&Detail&for&3D&Graphics //另外一些你想知道的事情:光有造型是不够的!-结束 2.2渲染 有了模型,怎么把这个几何模型画出来呢?这个步骤就是渲染啦 如果你看了上面的OpenGL的书,那么你就知道一些渲染的知识了,但是别高兴的太早,OpenGL使用的是局部光照模型(Local&Illumination&Model),不要被这个词吓住了 Local&illumination&Model指的是在做渲染的时候只考虑光源和物体之间的相互作用,不考虑物体和物体之间的影响,所以OpenGL不支持阴影,一个(半)透明物体的效果..,这些需要考虑物体之间的影响才可以实现。 //另外一些你想知道的事情:OpenGL可以实现阴影-开始 OpenGL本身不支持,但是通过一些方法可以实现的:),用Google搜索一下 Shadow&Volume,&OpenGL就找到答案啦 //另外一些你想知道的事情:OpenGL可以实现阴影-结束 Global&Illumination&Model&这类模型考虑的就比较全啦。现在关于Global&Illumination的技术有3大类,具体的技术就不在这里介绍了,如果想了解,可以联系我,大家一起讨论: 光线追踪(Ray&Tracing) 关于Ray&Tracing的好书有2本: Andrew&Glassner&的An&Introduction&to&Ray&tracing& Glasser是图形界的名人,这本书也是Ray&Tracing的经典 R.&Keith&Morley,&Peter&Shirley&的Realistic&Ray&Tracing,&Second&Edition 这本书第一版是伪代码,第二版是C代码。它的结构不是很清楚,虎头蛇尾的感觉。 辐射度(Radiosity) 关于Radiosity的好书有4本: Michael&Cohen&的Radiosity&and&Realistic&Image&Synthesis&,&Cohen获得SIGGRAPH&1998计算机图形学成就奖,他把Radiosity变成实际可用,现在Cohen在MSR图形 Francois&X.&Sillion的Radiosity&and&Global&Illumination&,&Sillion是法国人,他的主要研究方向是Radiosity,这本书写的很不错的,非常清晰 Philip&Dutre&的新书Advanced&Global&Illumination&,看起来还不错,刚拿到手,还没看,呵呵,所以不好评价 Ian&Ashdown的Radiosity:&A&Programmer's&Perspective& 有源代码的书啊!!&就凭这个,得给5***** Photon&mapping 这个我也不知道怎么翻译,呵呵。这个技术出现的比较晚,一本好书! Henrik&Wann&Jensen的Realistic&Image&Synthesis&Using&Photon&Mapping Henrik&Wann&Jensen是Photon&mapping技术的发明者 3.3这些也是图形学吗?&图形和图象的区别模糊了:( 除了上面讲的‘经典’的计算机图形学,还有下面的一些东西,它们也叫计算机图形学吗?是的!!! 3.3.1非真实性图形学(Non-Photorealistic&Graphics) 真实性不是计算机图形学的唯一要求,比如:你给我画一个卡通效果的图出来,或者我要用计算机画水彩画怎么办?或者:把图象用文字拼出来怎么做?,解决这些问题要用到非真实性图形学,&好书继续推荐!!! Bruce&Gooch,&Amy&Ashurst&Gooch的&Non-Photorealistic&Rendering& 3.3.2体图形学(Volume&Graphics) 用CT机做很多切片(比如头骨),那么能通过这些切片得到3D的头骨吗?Volume&Graphics就是解决这样的问题的 Min&Chen&编著的Volume&Graphics& 上面的2个图形学技术就和图象的界限不明显了,实际上他们是图形图象的综合 4&.还有其他的书吗? 还有一些好书啊,呵呵,好书看不完的:),继续放送: Graphics&Gems&I&~&V,一大帮子人写的书,包括研究人员,程序员… 有计算机图形学的各种数据结构,编程技巧 Tomas&Akenine-Moller&等人编著的Real-Time&Rendering&(2nd&Edition)& 许多最新的计算机图形学进展 David&Ebert等人的Texturing&&&Modeling:&A&Procedural&Approach,&Third&Edition& 讲述如何通过程序实现纹理、山、地形等图形学要素 F.&Kenton&Musgrave号称分形狂(Fractal&Mania) Ken&Perlin就是Perlin噪声的发明者,用过3d软件的人对Perlin&Noise不会陌生的 关于图形学的特定对象,有特定的专题图书, Evan&Pipho&Focus&On&3D&Models,对于图形学的常用模型格式,进行了讲解 Trent&Polack的&Focus&On&3D&Terrain&Programming&,讲地形的 Donald&H.&House&的Cloth&Modeling&and&Animation&,讲布料的 Nik&Lever的Real-time&3D&Character&Animation&with&Visual&C++&,讲角色动画的 …… 还有:) Richard&Parent的&Computer&Animation:&Algorithms&and&Techniques,当然是讲动画的啦,呵呵。 David&H.&Eberly的3D&Game&Engine&Design&:&A&Practical&Approach&to&Real-Time&Computer&Graphics&,有代码的啊!呵呵:) 最后,没事情的时候,看看下面的书吧 Alan&H.&Watt,&3D&Computer&Graphics&(3rd&Edition)& James&D.&Foley等人的&Computer&Graphics:&Principles&and&Practice&in&C&(2nd&Edition)&,这本圣经没事的时候再看吧,呵呵 累了:(&不说了,上面的书差不多了,还有一些shader的书,我不了解,以后会补上的:) 5.从哪里找到这些书啊?还有什么资源啊? 我保证,上面的书在&都可以买到:)&别打我 那好,大部分的书在国家图书馆可以复印到,北京的兄弟有福啦,3年前的书借出来复印,1角/页,但是新书要早图书馆里复印,5~6角/页,还是比Amazon便宜啊,呵呵。 不行大家就到国外买,合买吧,还负担的起。 我对DirectX不了解,所以没有涉及关于DirectX的内容:) &【重剑注:clayman写的这个很赞】 &&&&&&&& 与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。&&&&&&&& 首先你要精通一门高级语言,比如C++或者C#,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为你遇到的大部分资源都将是英文的,不要总等着别人为你翻译。慢慢尝试着阅读英文资料,你会发现其实也并没有那么难:)&&&&&&&& 刚开始,你要做的就是选择一门图形API,一般就是DirectX或者OpenGL之间选一个。如果考虑到跨平台,那么OGL是首选. 如果只在ms的平台,则DX是首选。我对OGL并不是很了解,所以下面大部门资料都是和DX相关的。&&&&&&&& 当然,作为准备工作之一,你首先要到DirectX Develop Center下载最新版的DirectX SDK。&&&&&&&& 入门书籍非常重要,推荐&&Introduction to 3D Game Programming with DirectX 9.0&&(好像去年出了中文版)也就是传说中的龙书,这可以说是最好的DX入门教材,Frank Luna从浅入深,讨论了DX的方方面面。另外再配上&& Advanced 3D Game Programming With DirectX 9.0&&,书名虽然是advanced,但实际上没有多少advanced级别的内容。看完这两本书,你基本上已经对DirectX比较熟悉了。如果你希望学习XNA,也是一样的,毕竟XNA是以DX为基础。&&&&&&&& 不要一开始就看图形学的书,这个时候你对图形编程还没有一个基本的感性认识,因此八成看的云里雾里。不要以网上的教程和论坛提问作为主要学习途径,找一本好书,系统学习,效率才最高。不要马上看SDK里的例子,很多图形学的基本原理仅仅通过读代码是不会明白的。某些年代太过久远的书就不要看了,比如《windows游戏编程大师技巧》(总看到有人在找这本书)。有人说基本的思想总是不变的,可惜对于现代GPU来说,很多早期的技术和优化技巧早就过时了。图形编程是发展的非常快的技术,看看GPU的发展速度,1~2年就是一代产品的革新。&&&&&&&&& 好了,入门之后,是你巩固和拓展视野的阶段。现在看计算机图形学就比较合适了。吐血推荐&&Real-Time-Rendering&&,z这本书算得上是所有图形程序员的必读书籍和参考手册了。最近刚出了第三版。可惜国内只有第二版,稍微有点老,如果实在找不到第三版,还是值得一读。国内其他所有以图形学命名的书都有一个共同点:枯燥,过时。只需看看其中二维三维变换和曲线曲面表示的部分即可。如果这个时候发现你当年数学没有学好,那么有三本数学书是为游戏程序员量身定制的:&&3D Math Primer for Graphics and Game Development&&, &&Mathematics for 3D Game Programming and Computer Graphics&&和&&Essential Mathematics Guide 2nd Edition&&,第一本书有中文版,最后一本则是08年才出的新书。&&&&&&&& 其实入门之后,就没有固定的学习路线了,最好根据你感兴趣的方向来学习。Shader方面:《Cg_tutorial》和《The Complete Effect and HLSL Guide》都是不错的入门材料,当然还有SDK文档。&&Shaders for Game Programmers and Artists&&有大量入门的例子。&&Advanced Lighting And Materials With Shaders&&详细介绍了各种光照模型和技术。&&GPU Gems&& 1~3册肯定是必读的,虽然有1,2有中文版,但某些翻译并不是很理想,强烈建议直接看英文版。ShaderX系列也是很经典的系列,每年出版一本,包含了最新的实时渲染技术,如今已经出了第6册了。不过网络上只能找到1~3册。1,2册大部分shader都是用asm写的,不过看懂原理,转换为HLSL也并不难。另外Nvidia SDK和ATI SDK也是学习shader的重要资源。最后还有刚出的&& Programming Vertex, Geometry, and Pixel Shaders&&地形:&&Real Time 3D Terrain Engines Using C++ And DX9&&非常全面的讨论了关于地形渲染的各种技术,至少应该把第5~9章都浏览一遍。之后便可以 到virtual terrain查阅近期的地形渲染技术。模型导入和动画:&&Advanced Animation with DirectX&&,仅此一本足以。物理:&&Game Physics&&和&&Game Physics Engine Development&&都不错。&&Real-time Collision Detection&&是碰撞检测方面最好的书,可惜目前还没有电子版。LOD:&&Level of Detail for 3D Graphics&&Ray tracing:&& Physical-Based Rendering - From Theory to Implementation&&引擎设计:说实话,这方面还没有特别好的书,大概越是核心的内容,越少有人愿意写吧。&&3D Game Engine Architecture Engineering Real-Time Applications with Wild Magic&&只有第三章值得一读。&&3D Game Engine Programming&&可以选部分感兴趣的章节看看,不过总的来说,讲的比较浅。AI:&&Programming Game AI by Example&&非常不错,好像还有中文版,备选&&Artificial Intelligence for Games&&。当然&&AI Programming Wisdom&&系列也是必读作品,不过目前网络上只有1~2册。网络:...(本人是网络白痴 +_+........)综合:&&Game Programming Gems&&系列,不过由于内容涉及的过于广泛,文章质量参差不齐,选择性阅读就可以了。历年GDC, Gamefest t,Siggraph等大型会议的paper也是应该关注的。&&&&&&&& 至于那些“All in one”或者n天较你写出个FPS游戏的书就不要读了,这类书的通病是什么都说了,结果什么也没说清楚。&&&&&&&& 除了书以外,再推荐一些不错的网络资源: 除了大量教程以外,论坛里多年累计下来的内容保罗万象。好好利用论坛搜索,你会发不管你多厉害,那里总有一些比你强大的人在很久以前就遇到了和你同样的问题,并且给出了解决方案。Nvidia和ATI的开发者中心 XNA官方网站 与GameDev类似 这里的除了讨论软件以外,还能看到对硬件构架的分析 最好的XNA教程网站 国内唯一比较专业的游戏编程网站,可惜和GameDev相比就显得太寒碜了-_-#&&&&&&&& 当然,不要忘了收集各大论坛里牛人们的blog:)&&&&&&&& 最后,仅仅靠看书是不够的,多写多练才是王道。
本文已收录于以下专栏:
相关文章推荐
开始学习前,首先明确一些基本概念。
1.1 图形学是什么
在国内,图形学是一门冷僻的学科。除了GPU设计者,其余从事图形学行业的人大多与游戏相关,因为需要处理游戏的图形渲染引擎或效率性能优化而研究...
目前国内图形学研究和应用均较少,已有的教材过于学术化、专业化,使得初学者感到学习困难。在知识碎片化的时代,图形学干货中文资料不算少见;然而图形学是门槛较高的学科,入门比较困难,很多人都是在反复学习和实...
IE的 script 元素支持onreadystatechange事件,不支持onload事件。
FF的script 元素不支持onreadystatechange事件,只支持onload事件。...
最近重读Realtime Rendering 一书,对书中光照模型等内容有些感受;准备写些笔记记录一下自己的认识。本篇先主要讲讲辐射学(Radiometry)和简单光照模型;后面会讲讲BRDF及其实现...
背景上一篇文章中我们简单体验了一下Rajawali的基本功能,现在我们来具体看一下这些物体是如何封装,最终调用GLES 绘制的。上一篇中通过阅读代码我们发现Rajawali的绘制也是类似于Surfac...
转一篇Lunarg的关于Vulkan的Loader和Layer架构文章。 /app/doc/1.0.13.0/windows/LoaderAndLay...
基础就不记录了,只记录有关数学的东西彩色光源
红绿蓝分量环境光ambient
漫反射diffuse
镜面反射specular环境光
表征场景中每一处的Ia都是相同的点光源理想的电光源向所有方面...
一.OpenGL是做什么的
一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。
二.OpenGL的主要功能是什么
建模,变换,颜色模式设...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 计算机图形学 dda算法 的文章

 

随机推荐