版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四 几何物体的表示三角网格的表示与显示1. 实验目的l 熟悉三角网格的表示l 熟悉三角网格的显示l 熟悉纹理的显示2. 实验内容l 设计三角网格的数据结构l 解析Obj文件格式的三角网格l 显示三角网格及纹理贴图3. 实验指导存储三角网格数据的文件格式多种多样,常见的文件格式有:l Wavefront OBJ (*.0bj)l 3D Max (*.max, *.3ds)l VRML (*.vrl)l Inventor (*.iv)l PLY (*.ply, *,ply2)本实验主要以OBJ文件为例,了解其数据格式,建立三角网格在内存中的数据结构,从而将文件中的数据读取到内存,并最终显示出来
2、。3.1 OBJ文件格式OBJ文件是Alias|Wavefront公司为他的一套基于工作站的3D建模和动画软件“Advanced Visualizer”开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的数据交换。目前几乎所有知名的3D软件如3dsMax,LightWave,Maya都支持OBJ文件的读写。OBJ文件是一种纯文本文件,可以直接用写字板打开进行查看和编辑修改。这种文件以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。OBJ的每一行,都有极其相似的格式,每行的格式如下:前缀 参数1 参数2 参数3 其中,前缀标识了这一行所存储的信息类型,参数则是具体的数据。OB
3、J文件的前缀可以有:前缀说明v表示本行指定一个顶点此前缀后跟着3个单精度浮点数,分别表示顶点的x,y,z坐标值vt表示本行指定一个纹理坐标此前缀后跟着两个单精度浮点数,分别表示此纹理坐标的u,v值vn表示本行指定一个法线向量此前缀后跟着3个单精度浮点数,分别表示顶点法向量x,y,z坐标值f表示本行指定一个表面(Face)此前缀后面的数据见“面的格式说明”usemtl此前缀后只跟着一个参数。该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质可以在此OBJ文件所附属的MTL文件中找到具体信息。mtllib此前缀后只跟着一个参数,该参数指定了此OBJ文件所使用
4、的材质库文件(*.mtl)的文件路径面的格式说明:每个三角面片的数据由f开头,后面跟组成该三角面片的各顶点的顶点坐标索引,纹理坐标索引,顶点法向索引,其格式为:f 顶点坐标索引/纹理坐标索引/顶点法向索引 其中纹理坐标索引和顶点法向索引可以为空,如果为空的索引位于末尾时,/也可以省略,例如:f 1 2 3这样的行表示以第1、2、3号顶点组成一个三角形,等同于1/ 2/ 3/。f 1/3 2/5 3/4这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,第二个顶点的纹理坐标的索引值为5,第三个顶点的纹理坐标的索引值为4。f 1/3/4 2/5/6 3/4/2这样
5、的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4;第二个顶点的纹理坐标的索引值为5,其法线的索引值是6;第三个顶点的纹理坐标的索引值为6,其法线的索引值是2。f 1/4 2/6 3/2这样的行表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;第二个顶点的法线的索引值是6;第三个顶点的法线的索引值是2。除此之外,以“#”开头的表示注释,以g开头的表示组的前缀。但这些前缀并不影响模型的外观,因此我们可以忽略它们。下面来看一个具体的实例,该文件是用3dsMax创建的一个长方体存储成OBJ文件的结果:# Max
6、2Obj Version 4.0 Mar 10th, 2001#mtllib ./Box.mtlg# object (null) to come .#v -46.508743 -45.052959 50.796341v 49.442947 -45.052959 50.796341v -46.508743 -45.052959 -48.019585v 49.442947 -45.052959 -48.019585v -46.508743 48.034504 50.796341v 49.442947 48.034504 50.796341v -46.508743 48.034504 -48.019
7、585v 49.442947 48.034504 -48.019585# 8 verticesvt 0.000000 0.000000 0.000000vt 1.000000 0.000000 0.000000vt 0.000000 1.000000 0.000000vt 1.000000 1.000000 0.000000vt 0.000000 0.000000 0.000000vt 1.000000 0.000000 0.000000vt 0.000000 1.000000 0.000000vt 1.000000 1.000000 0.000000vt 0.000000 0.000000
8、0.000000vt 1.000000 0.000000 0.000000vt 0.000000 1.000000 0.000000vt 1.000000 1.000000 0.000000# 12 texture verticesg (null)f 1/10 3/12 4/11f 4/11 2/9 1/10f 5/9 6/10 8/12f 8/12 7/11 5/9f 1/5 2/6 6/8f 6/8 5/7 1/5f 2/1 4/2 8/4f 8/4 6/3 2/1f 4/5 3/6 7/8f 7/8 8/7 4/5f 3/1 1/2 5/4f 5/4 7/3 3/1# 12 facesO
9、bj格式对纹理的支持则是通过关键字mtllib指定的。从上述例子可以看出,mtllib指定了对应于该obj文件的材质文件,材质文件的格式类似于obj的文件格式,也是由关键字前缀+对应的内容组成。newmtl blinn1SGillum 4Ka 0.2 0.2 0.2Kd 1 1 1Ks 0.2 0.2 0.2Tf 1.00 1.00 1.00map_Kd carp.bmpKa,kd,ks分别指定了物体材质中环境光,漫反射光,镜面光的颜色,map_Kd指定了纹理图像的路径,通过该纹理图像的路径,可以读取obj文件对应的纹理图像。3.2 三角网格的数据结构三角网格的数据由几何和连接关系两部分组成,
10、几何包括顶点的x,y,z坐标及顶点的法向量等,连接关系即三角网格是如何连在一块的。如图 3.1所示。 (a) (b)图 0.1 三角网格数据常用的三角网格数据结构包括:l 顶点边(Vertex-Edge)l 顶点面(Vertex-Face)l 邻接矩阵(Adjacency matrix)和邻接表(Adjacency List)l 顶点边面(Vertex-Edge-Face)l 半边结构(Half Edge)在各种数据结构的表示方式中,几何的表示基本一致,可以用链表或者数组的方式加以存储,对于图 0.1.a中的网格,可表示为:顶点坐标v1(x1, y1, z1)v2(x2, y2, z2)v3(
11、x3, y3, z3)v4(x4, y4, z4)v5(x5, y5, z5)v6(x6, y6, z6)区别的地方主要在于连接关系的存储,不同的存储方式决定了顶点、边、面的邻接关系的复杂度:顶点边(Vertex-Edge)的数据结构只包含边的连接关系,对于图 0.1.a中的网格,可表示为:边顶点e1(v1, v3)e2(v1, v2)e3(v2, v3)e4(v2, v4)e5(v3, v5)e6(v3, v6)e7(v4, v6)e8(v4, v5)e9(v5, v6)顶点面(Vertex-Face)的数据结构只包含面的连接关系,对于图 0.1.a中的网格,可表示为:面顶点(CCW)f1(
12、v1, v2, v3)f2(v2, v4, v3)f3(v3, v4, v6)f4(v4, v5, v6)邻接矩阵(Adjacency matrix)的数据结构以矩阵的方式存储点与点之间的连接关系,对于图 0.1.a中的网格,可表示为:v1v2v3v4v5v6v111v2111v31111v41111v511v6111顶点边面(Vertex-Edge-Face)的数据结构同时包含了边和面的连接关系,对于图 0.1.a中的网格,可表示为:边顶点e1(v1, v3)e2(v1, v2)e3(v2, v3)e4(v2, v4)e5(v3, v5)e6(v3, v6)e7(v4, v6)e8(v4,
13、v5)e9(v5, v6)面顶点(CCW)边f1(v1, v2, v3)(e1, e2, e3)f2(v2, v4, v3)(e3, e4, e5)f3(v3, v4, v6)(e5, e7, e6)f4(v4, v5, v6)(e7, e8, e9)数据结构的选取,取决于对三角网格所进行的操作,如果需要频繁的对三角面片进行删除和插入的操作,如对三角网格进行简化时,则需要利用链表而非数组的方式来存储顶点的几何信息及连接关系,如果需要频繁的对顶点、边、面的邻接关系进行查询,则需要在避免过多冗余信息的同时,尽可能保存多的邻接关系,使得查询的复杂度为,如在顶点边面(Vertex-Edge-Face)
14、的数据结构中对边的信息增加保存邻接三角形的信息,对顶点增加邻接边的信息。对于图 0.1.a中的网格,边的信息变成为:边顶点邻接面e1(v1, v3)f1e2(v1, v2)f1e3(v2, v3)f1, f2e4(v2, v4)f2e5(v3, v5)f2, f3e6(v3, v6)f3e7(v4, v6)f3, f4e8(v4, v5)f4e9(v5, v6)f43.3 三角网格的绘制在OpenGL中,任何复杂的几何物体最终都要描述成一个顶点的有序集合,即使是连续的曲线曲面,也需要首先对这些曲线曲面进行离散化,而后这些有序的顶点集合再组装成基本图元的集合。OpenGL中,基本图元包括点、线段
15、、三角形、多边形,而三角网格即为三角形这种基本图元的集合。顶点表示:glVertex2, 3, 4s, i, f, dv(坐标)此函数指定顶点的各个坐标分量。基本几何图元基本几何图元的定义,以函数glBegin()开始,glEnd()结束,两函数之间的部分由组成该几何图元的顶点序列组成,如显示一个三角形,可以表示成:glBegin(GL_TRIANGLES);glVertex3f(x0, y0, z0);glVertex3f(x1, y1, z1);glVertex3f(x2, y2, z2);glEnd();glBegin(mode);此函数标志着描述一个几何图元的顶点序列的开始,图元的类型
16、由参数mode指定,如表 1所示,各个图元类型的效果如图 3.2所示。表 1 几何图元的名称和意义值意义GL_POINTS独立的点GL_LINES一对顶点表示一条线段GL_LINE_STRIP一系列相连的线段GL_LINE_LOOP同上,在开始和结束顶点之间增加一条线段,使其闭合GL_TRIANGLES三个顶点表示一个三角形GL_TRIANGLE_STRIP连接的三角形带GL_TRIANGLE_FAN连接的三角形扇面GL_QUADS四个顶点表示一个四边形GL_QUAD_STRIP连接的四边形带GL_POLYGON简单的、凸多边形边界图 0.2 几何图元的类型glEnd()此函数标识着顶点列表的
17、结束。glBegin()和glEnd()函数对之间除了可指定顶点坐标的信息外,还可以指定法向、颜色、纹理坐标等信息,分别通过glNormal*(),glColor*(),glTexCoord()来实现。以下代码将绘制一个红色和绿色三角形。glBegin(GL_TRIANGLES);/red triangleglColor3f(1.0f, 0.0f, 0.0f, 1.0f);glVertex3f(x0, y0, z0);glVertex3f(x1, y1, z1);glVertex3f(x2, y2, z2);/green triangleglColor3f(0.0f, 1.0f, 0.0f,
18、1.0f);glVertex3f(x3, y3, z3);glVertex3f(x4, y4, z4);glVertex3f(x5, y5, z5);glEnd();三角网格中面的法向及顶点法向的计算每个面片处的法向可以通过两条边的叉乘得到,而顶点处的法向则可以取为相邻各三角面片法向的平均值,如Error! Reference source not found.所示。图 0.3 三角网格中免得法向及顶点法向的计算方法Obj文件中不但包含顶点几何坐标,还可以指定纹理数据,mtlib命令指定了材质属性的文件,材质属性文件中可以指定纹理图像所在的文件。纹理的显示包括如下三个主要步骤:(1) 生成纹理
19、数据(2) 将纹理数据载入纹理内存(3) 将纹理数据映射到物体表面3.4 生成纹理数据纹理数据可以由程序生成,也可以通过载入图像文件得到。对于纹理映射而言,其目的一般是为了增强图形的真实感,因此通过拍摄实际场景得到相应的图片,然后再将图片映射到物体表面是使用较多的一种方法。本实验也将采用载入图像文件的方法得到纹理数据。3.4.1 位图图像数据对于位图图像数据,可以通过MFC中的LoadImage()函数载入内存,而后通过CBitmap类中的GetBitmap()函数获取图像的具体信息,如图像的宽度,高度等信息,这些信息由BITMAP这个数据结构表示,如图 4.4所示。但值得注意的是,通过Loa
20、dImage()函数从文件载入的位图图像,GetBitmap()函数获取的图像信息中不包含位图的像素信息,bmBits为空,这需要通过CBitmap类中另一个函数GetBitmapBits()获得。位图数据使用完后,还要通过CBitmap:DeleteObject()函数进行内存释放。MFC中获取位图信息的数据流如图 4.5所示。typedef struct tagBITMAP LONG bmType; LONG bmWidth; LONG bmHeight; LONG bmWidthBytes; WORD bmPlanes; WORD bmBitsPixel; LPVOID bmBits;
21、BITMAP图 0.4 BITMAP的数据结构图 0.5 MFC中获取位图信息的数据流表示HANDLE LoadImage(hInstance, lpszName, uType, cxDesired, cyDesired, fuLoad)该函数用于从文件和资源中装载图标、光标、或位图。hInstance:指定装载图像的模块特例,对于从文件载入图像可以设置为NULL。lpszName:图像文件的路径或资源名称uType:指定被装载图像类型。此参数可以为下列值,其含义如下: IMAGE_BITMAP:装载位图;IMAGE_CURSOR:装载光标;IMAGE_ICON:装载图标。cxDesired,
22、cyDesired:指定图标、光标的宽度和高度,以像素为单位。若为载入位图,通常指定为0。fuLoad:指定装载的类型,对于载入位图图像而言,该参数设定为LR_LOADFROMFILE。通常,载入位图图像的调用方式为:HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, imagePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)为获取位图的具体信息,需要将HBITAMP句柄转换为CBitmap类,这可以通过两种方式得到:(1) 通过静态函数CBitmap:FromHandle()得到,即:CBitmap *pBitmap =
23、CBitmap:FromHandle(hBitmap);这里需要注意的是,通过该函数得到位图变量pBitmap是一个指向临时CBitmap对象的指针,MFC框架会在空闲处理函数OnIdle()中自动释放这样的临时变量。因此,不适合于作为类的成员变量反复使用。(2) 通过成员函数Attach()实现,即:CBitmap bitmap;bitmap.Attach(hBitmap);对于网格中的纹理数据而言,由于需要在整个程序运行期间保存该数据,通常采用第二种方式实现。整个读取过程可以用代码表示为:/read the imageHBITMAP hBitmap = (HBITMAP)LoadImage
24、(NULL, texturePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);if(hBitmap)CBitmap *pBitmap = new CBitmap(); pBitmap-Attach(hBitmap);pMesh-SetTexture(pBitmap);位图图像的具体数据可以通过函数CBitmap:GetBitmap()获得,即:BITAMP bitmap;pBitmap-GetBitmap(&bitmap);BITMAP中包含了图像的宽度(bmWidth)、高度(bmHeight),每个像素的颜色位数(bmBitsPixel),图像的像素数据
25、(bmBits)等信息,但对于从文件载入的位图图像数据,bmBits为空,即不能通过该方法获取位图的像素数据,需通过CBitmap:GetBitmapBits()方法得到,其通常用法如下:int nCount = bitmap.bmWidthBytes * bitmap.bmHeight; unsigned char *pData = new unsigned char nCount;pMesh-m_pTexture-GetBitmapBits(nCount, pData);delete pData;这里需要考虑的另一个问题是:Windows中位图数据的存储是从左下角开始的,而OpenGL中的
26、纹理坐标原点则通常是在左上角,因此,如果要能够正常显示位图纹理,需要将位图数据沿水平方向进行镜像操作,如图 4.6所示。图 0.6 位图数据翻转示意图其代码实现为:/vertical flip unsigned char *temp = new unsigned char bitmap.bmWidthBytes;int start = 0, target = nCount - bitmap.bmWidthBytes;for (int i = 0; i 1); +i)memcpy(temp, &pDatastart, bitmap.bmWidthBytes);memcpy(&pDatastart
27、, &pDatatarget, bitmap.bmWidthBytes);memcpy(&pDatatarget, temp, bitmap.bmWidthBytes);start += bitmap.bmWidthBytes;target -= bitmap.bmWidthBytes;delete temp;3.4.2 常用图像数据类型然而,目前图像文件的格式多种多样,常用的有bmp,jpg,png,tiff等,为了方便对多种图像格式的支持,增强代码的鲁棒性,我们利用OpenCV库来实现纹理图像的读取。OpenCV(Open Computer Vision)是Intel开源计算机视觉库。它由
28、一系列 C 函数和少量 C+ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV库可以通过访问网址3.4.3 OpenCV的使用方法同其他以动态链接库(dll,Dynamic-Link Library)方式提供的功能库一样,需要将OpenCV相关的头文件,lib文件,dll文件放在系统能够找到的路径下。这里所谓系统能够找到的路径,包括:(1)当前路径;(2)系统路径;(3)path所定义的路径。本实验中需要用到的头文件、lib文件以及dll文件分别包括:头文件:highgui.h,该头文件同时依赖于cxcore.h,cxtypes.h,cxerror.h,cvver.h等头文件
29、;Lib文件:cxcore.lib,highgui.lib;Dll文件:cxcore100.dll,highgui100.dll。3.4.4 图像文件的读取cvLoadImage(filename,flags)参数中filename即为要读入的图像文件的路径,flags指定读入图像的颜色和深度:指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR), 单信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。目前支持如下文件格式: l Windows位图文件 - BMP, DIB; l JPEG文件 -
30、JPEG, JPG, JPE; l 便携式网络图片 - PNG; l 便携式图像格式 - PBM,PGM,PPM; l Sun rasters - SR,RAS; l TIFF文件 - TIFF,TIF; l OpenEXR HDR 图片 - EXR; l JPEG 2000 图片- jp2。同位图图像数据一样,如果图像数据是以左上角开始存储,通常需要沿水平方向进行翻转,这可以通过cvFlip()函数实现,即:IplImage *pImage;If(pImage-origin = IPL_ORIGIN_TL)cvFlip(pImage, NULL, 0);cvFlip(src, dst, fl
31、ip_mode)src:原图像dst:目标图像,即翻转后的图像,如果dst = NULL,则翻转是在内部替换(Inplace)flip_mode:翻转的模式。flip_mode = 0,沿x轴翻转;flip_mode 0,沿y轴翻转;flip_mode 0,沿x轴和y轴翻转3.5 将纹理数据载入纹理内存3.5.1 指定纹理纹理数据按照其维数来分,可以分为一维纹理、二维纹理、三维纹理,我们使用最多的通常是二维纹理,OpenGL中通过函数glTexImage2D()来生成二维纹理,一维纹理和三维纹理分别通过函数glTexImage1D()和函数glTexImage3D()来生成。glTexImag
32、e2D(target, level, internalFormat, width, height, border, format, type, pixels)参数target通常被设置为GL_TEXTURE_2D;如果提供了多种分辨率的纹理,则需要用到参数level,当纹理图只有一种分辨率时,level为0;参数internalFormat指明纹理图像的颜色类型,如GL_RGB,GL_RGBA,GL_INTENSITY等;参数width和height给出纹理图像的尺寸,参数border指明边界的宽度,它或者为0或者为1。这里需要注意的是,width和height在减去边界后,都必须是2的幂次方
33、,即满足的形式,其中为非负整数,为参数border指定的边界值。参数format和type指明了纹理图像数据的数据格式和数据类型。参数format可以是GL_COLOR_INDEX、GL_RGB、GL_RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_LUMINANCE等;参数type可以是GL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT等参数pixels包含了纹理图像数据纹理反走样MIPMAP通过函数glTexImage2D()生成的纹理容易产生纹理走样的现象,
34、如图 4.7所示,为了缓解纹理走样的现象,OpenGL中提供了一种MipMap的方法,通过函数gluBuild2DMipMaps()来生成MipMap纹理。gluBuild2DMipMaps(target, internalFormat, width, height, format, type, pixels)该函数构造了一系列的mipmap,并且调用glTexImage2D()函数来转载图像。参数target,、interanlFormat、width、height、format、type和pixels与函数glTexImage2D()中的参数完全一样。图 0.7 纹理走样现象3.5.2 过
35、滤处理纹理图像经映射到多边形物体并投影到屏幕上后,往往不可能达到纹理像素与屏幕像素的一一对应。当纹理图像大于投影后的屏幕图像时,我们需要对纹理图像进行缩小操作,而当纹理图像小于投影后的屏幕图像时,则需要对纹理图像惊醒放大的操作。OpenGL分别为缩小和放大操作提供了不同的差值方法,如表 2所示。表 2 用于放大和缩小的过滤方法参数值GL_TEXTURE_MAG_FILTERGL_NEARESTGL_LINEARGL_TEXTURE_MIN_FILTERGL_NEARESTGL_LINEARGL_NEAREST_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_L
36、INEAR_MIPMAP_NEARESTGL_LINEAR_MIPMAP_LINEAR用以实现过滤处理的函数为:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, method)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, method)3.5.3 重复和截取处理有时我们需要用重复的同一张纹理图像映射到三维几何模型,使得这样的多张纹理图像恰好覆盖整个三维模型。对于这种情况我们有两种做法:一种是在图像空间中将原来的纹理图像拼成一张更大的纹理图像当给定的纹理坐标大于纹理图像的宽度和
37、高度时,glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WARP_S, method)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WARP_T, method)表 3 用于放大和缩小的过滤方法参数值GL_TEXTURE_WARP_SGL_TEXTURE_WARP_TGL_REPEATGL_CLAMP纹理图像不但可以直接被用作表面渲染颜色,而且可以使用这些值来调节不带纹理的表面的颜色,或者将纹理颜色与不带纹理的物体原始表面颜色相结合。通过为函数glTexEnv*()提供合适的参数,就可以实现相关的功能。glTexEnvi
38、, f(target, pname, param)参数target必须是GL_TEXTURE_ENV,pname是GL_TEXTURE_ENV_MODE,参数param的取值可以为:GL_DECAL、GL_REPLACE、GL_MODULATE、GL_BLEND,从而制定纹理值是如何与所处理的片元的颜色相结合的,其各参数的意义如表所示。参数意义GL_DECALGL_REPLACEGL_MODULATEGL_BLEND3.5.4 图像数据的对齐方式glPixelStorei(GL_UNPACK_ALIGNMENT, 1)将纹理数据载入纹理内存的典型代码如下: glGenTexture (1, &
39、id); glBindTexture (GL_TEXTURE_2D, id); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexImage2D (GL_TEXTURE_2D, 0, texFormat, imageWidth, imageHeight, 0, texFormat, GL_UNSIGNED_BYTE, imageDat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年职业能力(计划能力)考题及答案
- 中职第三学年(汽车检测与维修)汽车电气系统检修2026年阶段测试题及答案
- 2025年中职(药剂)药物制剂设备使用基础阶段测试题及答案
- 2026年天津单招医药卫生大类医学影像技术职业技能模拟题含答案
- 2025年中职美容与美体艺术(美甲技术)试题及答案
- 2025年高职大气科学技术(气象数据处理)试题及答案
- 2026年江苏单招现代殡葬技术与管理专业适应性测试卷含答案
- 2025年中职电工(低压电气安装)试题及答案
- 2025年大学行政管理(行政管理教育心理学)试题及答案
- 2026年住院医师规培(神经内科)试题及答案
- 江苏省G4联考2026届高三上学期数学试题(解析版)
- 酒驾恢复合同范本
- 湖南省长沙市望城区2024-2025学年四年级上学期期末考试数学试题
- 保安押运合同范本
- 甘肃省兰州新区2024-2025学年六年级上学期期末考试数学试题
- 公交车站设施维护管理方案
- 2024初级会计真题及答案(实务+经济法)
- 2025中国融通资产管理集团有限公司社会招聘考试笔试参考题库附答案解析
- 2025心肺复苏理论考试试题及答案
- 雨课堂在线学堂《不朽的艺术:走进大师与经典》课后作业单元考核答案
- 公司海藻繁育工合规化技术规程
评论
0/150
提交评论