3D.docx
- 文档编号:10229040
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:115
- 大小:372.94KB
3D.docx
《3D.docx》由会员分享,可在线阅读,更多相关《3D.docx(115页珍藏版)》请在冰豆网上搜索。
3D
抗失真或边缘修补(Anti-aliasing):
用于消除“锯齿”的一种技术。
它通过柔化线条,产生更光滑的图形显示。
背墙剔除(BackFaceCulling):
丢弃不必要的多边形,提高绘图速度。
双线过滤/插补(BilinearFiltering/Interpolation):
决定像素颜色时,不是简单地将其与最接近的质素匹配,而是通过计算最接近的四个质素的加权平均值决定。
双线MIP贴图(BilinearMIPMapping):
双线过滤和MIP贴图的一种组合形式。
首先保存好一张纹理贴图的几个副本。
接着,选中最接近选择的贴图。
最后,求选中贴图最接近的四个质素的加权平均值。
位图(Bitmap):
一种2D图形,用于表示不含多边形的物件。
它通常是一张大的纹理贴图。
剪切(Clipping):
将位于定义观察区域之外的部分或全部物件删除的过程。
深度线索(DepthCueing):
根据离观察者的距离,改变物件的颜色强度和亮度。
例如,即使一个闪亮、鲜艳的红球,如果越来越远离观察者,也会变得越来越阴暗。
双缓冲处理(DoubleBuffering):
同时显示和准备图像数据的一个过程。
一个缓冲区提供屏幕的显示数据,另一个则准备下一帧的显示数据。
雾化(Fogging):
变化所见景物可视度的一个过程,取决于景物离观察者的距离。
帧缓冲(FrameBuffer):
包含了所有帧的图形数据的显示内存。
高洛德上色(GouraudShading):
一种光影渲染技术。
它将照明模型应用于一个多边形的每个顶点,然后在整个表面铺开。
结果便是一个平滑渐变的表面。
图形函数库(GraphicsLibrary):
图形处理函数与子例程的一个集合,程序员可用它作为接口,方便地调用低级任务。
锯齿(Jaggies):
图像的锯齿效果,由映射失真造成。
照明模型(LightingModel):
一种图形处理公式,用于模拟灯光照射到物件表面的效果。
映射(Mapping):
将一种坐标体系转换成另一种。
MIP贴图(MIPMapping):
为消除计算机图形的斑驳和闪烁,保存了一张纹理贴图的几个副本。
每张贴图都代表离观察者不同距离时显示的纹理。
荧光体(Phosphor):
一种化学物质,被电子束击中时,可根据不同特性发出不同颜色的光。
三元荧(Phosphortriad):
构成一个像素的三个荧光体,分别能发出红光、绿光或蓝光。
像素(Pixel):
PictureElement(图形元素)的简称,屏幕颜色与强度的一个单位。
像素其实是能够定址和分配颜色值的最小单位。
光栅(Raster):
由像素构成的一个矩形网格。
要在光栅上显示的数据保存于帧缓存内。
光栅处理(Rasterization):
正确填充多边形,绘制物件表面的一种过程。
缩放(Scaling):
均匀缩放(UniformScaling)——保持比例不变,使整个物件增大或缩小。
不均匀缩放(Non-uniformScaling)——增大或缩小部分物件的尺寸。
哈哈镜中的镜像便是不均匀缩放一个很好的例子。
上色或光影渲染(Shading):
通过对3D物件应用一个照明模型,从而生成逼真的图形的一种技术。
这要求为物件的各个像素应用适当的颜色。
设置(Setup):
3D图形处理的一道工序,要求根据用户的观察角度改变多边形的形状。
镶嵌或嵌入(Tessellation):
将用坐标(如x,y,z)定义的一个物件重新定义成多边形的过程(采用顶点与边的形式)。
质素(Texel):
“纹理元素”(TextureElements)的简称,代表纹理贴图中的一个彩色点。
质素之于纹理贴图,就如像素之于显示帧。
纹理修补(TextureAnti-aliasing):
决定像素颜色时,不是简单地将其与最接近的质素相配,而是通过一个过滤过程(参见双线过滤),一个MIP贴图过程(参见MIP贴图),或两者的一种组合形式(参见双线纹理贴图),从而决定最终的像素颜色。
纹理贴图(TextureMapping):
通常把它想象成3D物件的壁纸,亦即将一张2D图纸“糊”到一个3D表面。
如果想产生特殊的纹理效果,比如木质或石质表面,就需要用到这一技术。
z缓存(Z-buffer):
包含显示图形深度坐标(z座标)的一个缓冲区。
在几何处理阶段进行的计算可分为四类:
镶嵌(Tessellation)、转换(Transformation)、照明(Lighting)以及设置(Setup)。
3D物件进入流水线处理之前,必须先定义成坐标数据的形式,或采用数学公式表达。
镶嵌的目的就是将这些坐标数据转换成多边形。
通常会进一步将这些多边形变成三角形或四边形,以简化计算。
镶嵌好的物件也叫作“框架”(Wireframe),可将其大致看作一个现实世界的物件。
这种物件有一些明显的特征,例如形状、尺寸以及方向等。
下面是一个镶嵌好的框架模型示例。
该模型完全由相互连接的多边形构成(这里是三角形),是绘制更真实图形的关键基础。
我们对选择点(顶点)的计算会影响多边形内的每一个像素,因为这些像素均由顶点的原始数据再计示而来。
第二步是转换。
转换是物件的一种特殊处理方法。
我们可旋转、位移以及缩放一个物件。
其中,旋转是物件围绕x,y和z轴的一种运动;位移则是物件朝一个方向的运动。
例如,地球的自转可认为是“旋转”,而地球绕太阳的公转则可认为是“位移”。
通过位移与旋转的组合,可产生任意形式的运动。
“缩放”代表物件尺寸的变化。
“均匀缩放”是指增大或减小整个物件的尺寸。
进行均匀缩放时,比例保持不变。
照相机镜头的变焦便是均匀缩放的一个例子。
“不均匀缩放”是指增大或减小部分物件的尺寸。
我们在哈哈镜里看到的镜像便是不均匀缩放的一个例子。
一个乘法矩阵定义了缩放时物件尺寸的变化因子。
变形特别适合在图形环境中产生运动效果。
现在,所有顶点都已到达最终位置(至少在流水线的这一阶段如此)。
随后,我们可决定哪些顶点不会影响最终的图形显示。
例如,位于屏幕以外的所有内容都要剔除——不画出任何内容。
这一过程叫作“剪切”。
还有一些顶点超过了指定的深度或z坐标。
删除这些部分的过程叫作z剪切(如图8所示)。
大多数时候,3D物件(如立方体)的背墙是看不见的。
此时,构建这些背墙的顶点也要剔除,为将来的计算作好准备。
剪切和剔除是非常重要的准备工作,因为它们使计算只针对那些要显示出来的元素进行。
由于并不需要计算看不见的东西,所以最终图型的质量不会受到影响。
照明是几何处理最复杂的工序。
每个顶点的灯光效果都由一个照明公式决定。
在大多数现实环境中,不同的光源会严重影响“真实”的含义。
在3D图形环境中,光源使物件显得更加真实。
有大量照明公式可供选用,每个都以独特的方式影响着多边形的构造。
通常有两种类型的照明:
点光源和泛射。
点光源是指灯光仅来自一个光源。
例如,一支手电筒便是一个点光源。
而泛射则是指无固定方向的光线照射。
若不使用泛射灯光,物件上未被点光源照到的多边形就会变成全黑。
照明公式的复杂性会对图形渲染的性能与质量造成影响。
若照明公式比较复杂,虽然可以提高质量,但渲染或图形生成速度也会变慢。
下面是用两种类型的光源进行渲染的结果。
3D数据向2D数据的转换是在“设置”阶段完成的。
这一阶段也通常称为“透视投影”。
例如,假设从正前方观看,立方体看起来就是一个正方形。
但若保持视点不变,然后旋转立方体,就会发现它渐渐变成一个平行四边形。
如正方体继续旋转,则平行四边形会变得越来越小,直至最后变成一条线,线后的那些点则逐渐被屏蔽掉。
对于3D图形在2D屏幕上的显示,“设置”过程无疑是非常关键的。
用于显示这些图形的过程叫作“光栅处理”,后面会详细讲述。
几何处理是计算特别密集的一个阶段,对计算能力的要求也特别高。
在几何处理阶段,所有信息都保存在顶点里。
光栅处理的目的就是获取这些信息,并相应填充多边形。
这一阶段决定了3D模型的表面质量,比如颜色和纹理等。
此时面临的最大问题就是计算速度。
为产生平滑的运动图像,屏幕内容必须以每秒约30帧的速度更新。
这个更新频率叫作“帧频”。
(注意不要把它与屏幕的“刷新频率”搞混淆了。
刷新频率是指荧光体的刷新频率;而帧频是指图形的显示更新频率。
)所以在1/30秒的时间里必须做些什么事情呢?
简而言之,要做的事情太多了!
通常将光栅处理划分为四个基本类别——可见性(Visibility)、纹理贴图(Texturemapping)、着色(Shading)以及平滑处理(Smoothing)。
“可见性”的定义是光栅处理的一道主要工序。
可见性决定了哪些物件或物件的哪些部分可在屏幕上看见。
有几个方面的原因决定了物件的可见性。
如一个物件位于另一个物件的前方,则只有最前面的物件才会完全显示出来。
对计算机来说,它如何判断特件之间的相对方位呢?
我们通过跟踪特件的z坐标来实现。
这一工作通常在z缓冲里完成。
z缓冲保存了下一帧的z坐标数据。
若z缓冲里的某个像素(有个较小的z值)比它在当前显示帧里对应的像素更靠近坐标原点(有更小的Z值),那么在下一帧里,较近的像素会取代较远的像素。
唯一的例外就是缓冲区内较近的像素被设为透明或半透明。
此时,较远的像素仍以某种形式保留下来。
像素的透明/半透明状态保存在第四个颜色组件里(位于红、绿和蓝之后),名为Alpha(α),或者“色层”。
Alpha值决定了透过一样东西能看到其他多少内容。
这个值在一种名为Alpha混合或色层混合的技术中特别有用。
色层混合会以近端像素颜色的透明/半透明状态以及两个元素的颜色值为基础,对颜色进行重叠与合并。
在光栅处理阶段,另一道关键的工序是纹理贴图。
它的原理非常简单,就是将纹理或材质粘贴到3D物件表面。
有些人把它想象成一个多面体的壁纸。
纹理贴图最大的好处就是在非常大的表面区域展现出大量细节。
如果仅仅原样复制该平面上的纹理而不进行额外的纹理贴图,可以快速产生大量多边形,从而节省加速器或处理器资源。
由于存在第3维,所以表面贴图并非总是这么简单。
为精确表现出纹理,必须旋转贴图,与多边形的角度配合,这就叫作“透视矫正纹理贴图”(PerspectiveCorrectTextureMapping)。
此外,根据多边形所处的位置,纹理贴图必须进行适当的缩放。
左数第一张图是一个正方形,与屏幕表面平行,粘贴了一种格子纹理。
第二个正方形则转动了一个角度,但仍用格子纹理粘贴。
最后一张图保持正方形的转角不变,也用相同的纹理粘贴,只是采用了透视矫正技术。
在这幅图中,我们为月神应用了不同的纹理光栅处理阶段的第三道工序涉及照明效果或者“着色”。
着色是指在图像中精确展现出光影效果。
在几何处理阶段,以一些照明公式为基础,已完成了大量计算,已经知道灯光会对图像的每个顶点造成什么影响。
在光栅处理阶段,必须利用这些数据判断灯光对每个像素造成的影响。
目前可利用三种流行的技术完成顶点照明数据向像素照明数据的转换,分别是平面着色(FlatShading)、高洛德着色(GouraudShading)以及补色着色(PhongShading)。
平面着色最简单,速度也最快,特别适合用它处理盒状物件。
对图像进行了平面着色以后,每个多边形只能分配到一种颜色,代表物件那一部分的状态。
为完成平面着色,只需将照明模型应用于多边形表面的某个点即可。
这儿的“照明模型”是指一个特殊的数学公式,它同时考虑到了3D物件相对于光源的方位,以及采用的是何种类型的表面。
因此,平面着色的结果是一个浓淡不均的“斑驳”表面。
高洛德着色是目前最常用的一种着色方法,它比平面着色逼真得多。
照明模型应用于多边形的每一个顶点。
结果产生的颜色(遵守照明公式)均匀分布于多边形的表面。
这样做出来的阴影显得非常光滑和真实。
补色着色模型甚至比高洛德着色还要复杂。
尽管得到的结果经常都差不多,但补色着色对镜面反光有特别强的表现能力。
“镜面反光”是指光线反射离开一个表面。
这类反射尤其在金属或塑料表面上有非常生动的效果。
之所以补色着色能有如此逼真的效果是因为它为特件上的每一个点计算了通过物件表面的总的光强,这样每一个像素都将在接收光总量的基础上表现出本色。
OpenGL实际上是一种3D程序接口(即我们常说的3DAPI),它是3D加速卡硬件和3D图形应用程序之间一座非常重要的沟通桥梁。
也可以说,OpenGL是一个功能强大,调用方便的底层3D图形库。
OpenGL具有两个主要的特点:
1.它是与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植。
因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。
2.可以在客户机/服务器系统中工作,即具有网络功能,这一点对于制作大型3D图形、动画非常有用。
例如,《玩具总动员》、《泰坦尼克号》等电影的电脑特技画面就是通过应用OpenGL的网络功能,使120多台图形工作站共同工作来完成的。
由于OpenGL是与硬件无关的3D图形接口,在Windows、Unix/X-Windows、MacOS、OS/2等不同版本的窗口相关部分(系统相关)略有差异。
由于OpenGL是3D图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。
但是,通过一些转换程序,可以很方便地将AutoCAD、3DS等3D图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数组。
另外,在OpenGL的基础上还有OpenInventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。
其中,OpenInventor应用最为广泛。
该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。
四、OpenGL的工作步骤
OpenGL在屏幕上显示图形的主要步骤如下:
1.构造几何要素(点、线、面、多边形、位图),创建对象的数学描述。
2.在3D空间中放置对象,并选择适当的观察点。
3.直接定义或由光照条件和贴图纹理给出对象的颜色。
4.将对象的数学描述和颜色信息转换为屏幕上的像素。
五、OpenGL命令的语法规则
OpenGL的函数虽然多达几百个,但由于有一套非常规范的语法规则,应用起来很方便。
这与Direct3D那种比较杂乱的语法规则相比,显然更加清晰明了。
1.前缀代表OpenGL命令的函数类型
OpenGL基本库:
函数以gl开头,如glColor3f()。
OpenGL中有115个基本函数,可以在任何OpenGL平台上使用。
OpenGL实用库:
函数以glu开头,如gluBeginSurace()。
OpenGL实用库比上面这115个函数高一级,提供高级调用。
OpenGL辅助库:
函数以aux开头,如auxInitDisplayMode()。
OpenGL辅助库可使编程简单明了,是提供初学者入门的函数,但不保证在任何平台的使用(在Win32系统下没有问题)。
Windows专用函数库:
函数以wgl开头。
wgl函数将OpenGL与Windows95、WindowsNT视窗系统联接起来管理绘图描述表,显示列表,执行函数,和文字位图。
X-Windows专用函数库:
函数以glx开头。
glx函数提供创建OpenGL命令描述表并使之与X-Windows系统连接的能力。
常量:
以GL_为开头,均用大写字母,并用下划线与关键词分开,如GL_LINE_LOOP。
2.后缀表明OpenGL命令的数据类型
后缀 类型 对应C变量
b 8bit intsignedchar
s 16bitint short
I 32bitint long
f 32bitfloat float
d 64bitfloat double
ub 8bitunsignedint unsignedchar
us 16bitunsignedintunsignedshort
ui 32bitunsignedint unsignedlong
有时会在函数后缀后加上一个“v”,如glVertex3fv等,这表示该参量是一个矢量或矩阵的指针。
3.掐头去尾,中间的关键词就是OpenGL函数的功能。
例如:
glVertex2i(100,200)表明是OpenGL的基本函数(gl-),是绘点的函数(-Vertex-),是两个整型参数(-2i)。
六、OpenGL基本库的绘图方法
“话说”了半天的OpenGL,可能有些读者已经手痒了,咱们还是以一个简单的例子来初步“感受”一下OpenGL吧!
该例子是一个由三个彩色平面围成的空心三角锥。
读者不要担心自己没有OpenGL支持的3D加速卡,程序不能运行。
实际上微软公司已经为Windows95编了一个用软件模拟硬件的动态连接库Opengl32.dll,Vc++4.0以上的版本里都有。
考虑到许多读者原先可能对OpenGL比较陌生,先简介一下OpenGL中画平面的常用方法:
glBegin(类型);
glColor3f(...);
glVertex(...)
glColor3f(...);
glVertex(...);
……
glEnd();
注:
由“类型”指定画什么平面:
GL_POINTS单个顶点集;GL_LINES多组线,2个点一条线;GL_GL_POLYGON单个简单填充凸多边形;GL_TRAINGLES多组三角形,3个点一个三角形。
/////////////////
//sample.cpp
#include"glos.h"
#include
#include
#include"windows.h"
voidmyinit(void);
voidCALLBACKdisplay(void);
voidCALLBACKreshape(GLsizeiw,GLsizeih);
//reshape()只是一个用于窗口改变大小时的处理,这里重点是display()。
myinit(void)
{
/*初始化:
*/
//窗口显示单缓存和RGB(彩色)模式
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
//屏幕大小x=500,y=500(0,0)是屏幕左上点
auxInitPosition(0,0,500,500);
//初始化窗口,标题为“sample1”
auxInitWindow("sample1");
//清屏,即将窗口清为黑色。
glClearColor(0.0,0.0,0.0,0.0);
//将颜色缓存清为glClearColor命令所设置的颜色,即背景色
glClear(GL_COLOR_BUFFER_BIT);
}
voidCALLBACKreshape(GLsizeiw,GLsizeih)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w,20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);
else
glOrtho(-20.0*(GLfloat)h/(GLfloat)w,20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
voidCALLBACKdisplay(void)
{
glBegin(GL_TRIANGLE_STRIP);//连续填充多个三角形
//第一个三角形
glColor3f(1.0,0.0,0.0);
glVertex3f(15.0,0.0,0.0);
glColor3f(0.0,1.0,0.0);
glVertex3f(-15.0,0.0,0.0);
glColor3f(0.0,0.0,1.0);
glVertex3f(0.0,15.0,15.0);
//第二个三角形
glColor3f(0.0,1.0,1.0);
glVertex3f(10.0,15.0,-15.0);
//第三个三角形
glColor3f(1.0,1.0,0.0);
glVertex3f(15.0,0.0,0.0);
glEnd();
glFlush();
}
voidmain(void)
{
myinit();
auxReshapeFunc(reshape);
auxMainLoop(display);
}
//程序结束
一、3DAPI
API是ApplicationProgrammingInterface应用程序接口的缩写,是许多程序的大集合。
一个3DAPI能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。
目前普遍应用的3DAPI有DirectX、OpenGL、Glide、Heidi。
·DirectX
微软公司专为PC游戏开发的API,与Windows95和WindowsNT操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。
由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。
具体组成及功能详情可参看本报第33期(8月31日)“MicrosoftDirectX6.0演武传奇”一文。
·OpenGL(开放式图形接口)
由SiliconGraphics公司开发,能够在Windows95、WindowsNT、Macos、Beos、OS/2、以及Unix上应用的API。
由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过DirectX,能最大限度地发挥3D芯片的巨大潜力。
在Windows98中已经支持DirectX和OpenGL。
在OpenGL的1.2版中增加了对3DNow!
标准的支持。
·Glide
这是3Dfx公司为VOODOO系列3D加速卡设计的专用3DAPI,它可以最大限度发挥VOODOO系列芯片的3D图形处理功能,由于不考虑兼容性,其工作效率远比OpenGL和Direct3D高,所以Glide是各3D游戏开发商优先选用的3DAPI。
不过,这样一来就使得许多精美的3D游戏在刚推出时,只支持3Dfx公司的VOODOO系列3D加速卡,而其它类型的3D加速卡则要等待其生产厂商提供该游戏的补丁程序。
·Heidi
Heidi是一个由Autodesk公司提出来的规格。
目前,采用Heidi系统的应用程序包括3DStudioMAX动画制作程序、Autodesk公司为AutoCADR13开发的WHIP加速驱动程序。
二、3D特性
·A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3D.docx