OpenGL高级课题与纹理映射技术教程

合集下载

基于OpenGL的纹理映射技术

基于OpenGL的纹理映射技术

人工智能及识别技术本栏目责任编辑:李桂瑾电脑知识与技术1引言纹理映射技术产生上个世纪七十年代,是模拟自然景物表面细节的一种有效方法,在生成真实感图形中得到了大量的应用。

在过去的几十年中,人们一直通过建模的方法仿真客观世界,由于客观世界千变万化、错综复杂,要把客观世界的各种细微结构直接用几何模型表示出来,不仅模型难以建立,而且计算量庞大,难以满足实时显示的要求。

因此,在实际应用中,为了获得比较高的显示速度,往往以牺牲图形的真实感为代价。

尽管这样,显示一幅较复杂的图形往往需要好几个小时,并且能满足实时性要求的几何模型一直没有找到。

于是,人们就想象是否可以用“贴”墙纸的方法将反映物体表面细节的图案贴到物体表面上,从而开辟了一个新的研究领域———纹理映射(texturemapping)。

2OpenGL简述OpenGL是由SGI公司推出的独立于操作系统和硬件环境的开放式三维图形库,作为一种用于实时3D图形的工业标准API(ApplicationProgramminInterface)已经得到了广泛的认可和接受。

OpenGL提供了155个图形函数,开发人员可以利用这些函数来构造景物模型,开发三维图形实时交互软件。

OpenGL具有强大的图形功能和良好的跨平台移植能力,目前已被广泛应用于可视化技术、实体造型、CAD/CAM、模拟仿真等诸多领域。

纹理映射技术是OpenGL的一个重要的技术,在进行模型转换和投影转换都能执行操作,可用到所有的图元:点、线、多边形、位图和图像上。

3纹理的定义和分类我们可以从自然角度、运算角度及分析角度分别给出纹理的定义:从自然角度来看,纹理是在某一确定的图象区域中,以近乎周期的种类和方式重复其自身的局部基本模式元。

这一定义由Pratt给出,它适合应用于确定类型的线条模式。

基于运算角度,纹理是在某一运算表达式规定下,为近乎不变或者近乎周期性的数量表达。

此定义由Sklansky给出,它适合于根据数学的分析方法抽取纹理特征以实现纹理区域分类的应用领域。

基于VC_的OpenGL纹理映射技术的研究与实现_肖源源

基于VC_的OpenGL纹理映射技术的研究与实现_肖源源

DOI:10.15958/ ki.gd xbzrb.2008.02.023第25卷第2期贵州大学学报(自然科学版)V o l.25N o.2 2008年 3月J o u r n a l o f G u i z h o uU n i v e r s i t y(N a t u r a l S c i e n c e s)M a r.2008文章编号 1000-5269(2008)02-0158-03基于V C++的O p e n G L纹理映射技术的研究与实现肖源源,王子牛(贵州大学机械学院,贵州贵阳550003)摘 要:三维图像是当前计算机图形学、地理信息系统等学科研究的热点之一。

本文在计算机图形学的基础上,利用O p e n G L开发库函数,在V C++6.0的编译环境下,详细讨论了三维图形的关键技术纹理映射,根据二维纹理的特性,实现三维立方体的贴图以及三维效果图的展示。

关键词:图形学;地理信息系统;纹理贴图中图分类号:T P391.41 文献标识码:AR e s e a r c ha n dI m p l e m e n t a t i o n f o r T e x t u r eMa p p i n g o f O p e n G LB a s e dO nV C++X I A OY u a n-y u a n,W A N GZ i-n i u(G u i z h o uU n i v e r s a r y,G u i z h o uG u i y a n g550003)A b s t r a c t:3Di m a g e o r f i g u r e s i s o n e o f t h e h o t i s u u e s o f c o m p u t e r g r a p h i c s,g e o g r a p h i c i n f o r m a t i o ns y s t e m.T h i s p a p e r i n t r o d u c e s t h e k e y t e c h n o l o g y i n d e t a i l a b o u t T e x t u r e m a p p i n g o f3d i m a g e a n d a c-c o rd i n g t o s pe c if i c p r o p e r t y o f2d t e x t u r e b a s e d o n O p e n G L a n d V C++6.0,a c h i e v e s p i c t u r e m a p p i n gf o r3d c u b e a n d s h o w s t h e r e s u l t o f3d p i c t u r e m a p p i n g.K e y w o r d s:g r a p h i c s;g e o g r a p h i c i n f o r m a t i o n s y s t e m;t e x t u r e m a p p i n g0 引言O p e n G L的英文全称为O p e n G r a p h i c s L i b r a r y,即开放的图形程序接口。

高级计算机图形学OpenGL纹理映射

高级计算机图形学OpenGL纹理映射
为GL_TEXTURE0

GLboolean glIsTexture(GLuint textureName);
• •

void glBindTexture(GLenum target, GLuint textureName); void glDeleteTextures(GLsizei n, const GLuint *textureNames);
• GLubyte • •
my_texels[512][512][3];

定义纹理图像所用的像素图
扫描图像 由应用程序代码创建

激活纹理映射
• glEnable(GL_TEXTURE_2D); • OpenGL支持一至四维纹理映射
9
把图像定义为纹理
void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

本节只讨论从二维纹理到曲面的映射
4
基本策略
应用纹理需要下面三个步骤



• • •
• •
指定纹理
读入或生成图像 赋给纹理 激活纹理映射功能
由应用程序建立适当的映射函数 环绕(wrapping), 滤波(filtering)
5
给每个顶点赋纹理坐标 指定纹理参数
纹理映射
几何体
屏幕
图像
6
纹理示例

mipmapped 的线性滤波
23

02-配合视频讲解纹理的基本概念和纹理映射的基本方法。

02-配合视频讲解纹理的基本概念和纹理映射的基本方法。

让人头疼的纹理(上):颜色纹理华中科技大学软件学院万琳提纲1纹理的概念2纹理的定义和映射3基于OpenGL的颜色纹理1纹理的概念用简单光照明模型生成真实感图象,由于表面过于光滑单调,反而显得不真实。

现实物体表面有各种表面细节,这些细节就叫纹理。

1纹理的概念用简单光照明模型生成真实感图象,由于表面过于光滑单调,反而显得不真实。

现实物体表面有各种表面细节,这些细节就叫纹理。

1纹理的概念用简单光照明模型生成真实感图象,由于表面过于光滑单调,反而显得不真实。

现实物体表面有各种表面细节,这些细节就叫纹理。

1纹理的概念纹理实例:纹理的概念1纹理:体现物体表面的细节纹理类型:◆颜色纹理物体表面(平面或者曲面)花纹、图案◆几何纹理基于物体表面的微观几何形状二维纹理几何纹理2纹理的定义和映射◆生成纹理的一般方法,是预先定义纹理模式,然后建立物体表面的点与纹理模式的点之间的对应。

◆当物体表面的可见点确定之后,以纹理模式的对应点参与光照模型进行计算,就可把纹理模式附到物体表面上。

这种方法称为纹理映射(Texture Mapping)。

像素区物体表面纹理模式2纹理的定义和映射纹理模式定义:•图象纹理:将二维纹理图案映射到三维物体表面,绘制物体表面上一点时,采用相应的纹理图案中相应点的颜色值。

•函数纹理:用数学函数定义简单的二维纹理图案,如方格地毯。

或用数学函数定义随机高度场,生成表面粗糙纹理即几何纹理。

函数纹理定义的方格地毯图像纹理2纹理的定义和映射纹理映射:•建立纹理与三维物体之间的对应关系•扰动法向量图像纹理映射到我们课程原创的动画人物帽子上纹理的定义和映射2◆纹理模式定义方法:纹理空间纹理定义在纹理空间上的函数,纹理空间通常是一个单位正方形区域0≤u ≤ 1,0≤ v ≤1之上。

纹理映射中最常见的纹理•一个二维纹理的函数表示•纹理图象V(0,1)(0,0)(1,0) U⎣⎦⎣⎦⎣⎦⎣⎦⎩⎨⎧⨯+⨯⨯+⨯=evenv u odd v u v u g 881880),(纹理的定义和映射2◆纹理映射方法:建立物体空间表面和纹理空间之间的对应关系根据物体空间的表面坐标(x,y,z)计算其纹理空间坐标(u,v)值:对物体表面坐标(x,y,z)用u 、v 进行参数化(第一步),然后反求出参数u 、v 用物体表面坐标(x,y,z)的表达(第二步);根据纹理空间定义的纹理(u,v)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射(第三步)。

纹理映射的简单案例_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共6页]

纹理映射的简单案例_Android 3D游戏开发技术宝典——OpenGL ES 2.0_[共6页]

Android 3D游戏开发技术宝典206256个像素对应纹理坐标为1,其他情况依此类推。

右侧是一个三角形图元,其3个顶点A、B、C都指定了纹理坐标,3组纹理坐标正好在右侧的纹理图中确定了需要映射的三角形纹理区域。

从上述两点可以看出,纹理映射的基本思想就是首先为图元中的每个顶点指定恰当的纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中纹理区域中的内容根据纹理坐标映射到指定的图元上。

回忆一下第3章介绍过的渲染管线,最终用户看到的是显示在屏幕上的像素,而像素是由片元产生的。

因此,进行纹理映射的过程实际上就是为右侧三角形图元中的每个片元着色,用于着色的颜色需要从左侧的纹理图中提取,具体过程如下。

首先图元中的每个顶点都需要在顶点着色器中通过易变变量将纹理坐标传入片元着色器。

经过顶点着色器后渲染管线的固定功能部分会根据情况进行插值计算,产生对应到每个片元的用于记录纹理坐标的易变变量值。

最后每个片元在片元着色器中根据其接收到的记录纹理坐标的易变变量值到纹理图中提取出对应位置的颜色即可,提取颜色的过程一般称之为纹理采样。

提示OpenGL ES中进行纹理映射时,规定纹理图片尺寸的宽与高必须为2的n次方,如:8×8、16×8、32×32、64×64、32×256等。

不满足2的n次方尺寸要求的纹理图在程序运行时会产生问题,请读者在开发中要特别注意这一点。

7.1.2 纹理映射的简单案例介绍了纹理映射的基本原理后,本小节将给出一个将砖墙纹理映射到3D空间中三角形的案例。

本案例中采用的原始纹理如图7-2所示,案例的具体运行效果如图7-3所示。

▲图7-2 原始纹理 ▲图7-3 案例运行的效果图说明图7-3中三角形的上面、左下、右下3个顶点的纹理坐标分别为(0.5,0)、(0,1)、(1,1),左侧的图是三角形原始姿态的情况,右侧的是三角形旋转一定角度后的情况。

opengl纹理映射(下)

opengl纹理映射(下)

齐次坐标
齐次坐标(homogeneous coordinates)
是对普通坐标的扩展 二维平面点(x,y)的齐次坐标表示为(x, y,w)
(x,y,w)→(x/w,y/w)
三维空间点(x,y,z)的齐次坐标表示为 (x,y,z,w)
(x,y,z,w)→(x/w,y/w,z/w)
齐次坐标
两个重要性质
驻留纹理
驻留策略
为纹理对象指定驻留优先级
void glPrioritizeTextures(GLsizei n, const GLuint *textureNames, const GLclampf *priorities) 优先级范围在[0.0,1.0]之间,0最低,1最高
为当前绑定纹理指定优先级
GL_NEAREST_MIPMAP_NEAREST GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_LINEAR
mipmap下的过滤处理
GL_NEAREST_MIPMAP_NEAREST
寻找最合适的一层mipmap,再应用GL_NEAREST规则寻找合适 的纹元
OpenGL三维图形编程
纹理映射(下)
纹理高级技术
一维纹理 纹理代理 驻留纹理 自动纹理坐标 环境映射 纹理矩阵 齐次坐标 细节多层次(mipmap)
一维纹理
与二维纹理相关函数类似,target参数使用 GL_TEXTURE_1D
从内存纹理数据定义纹理 从帧缓存数据创建纹理 使用内存数据替换纹理图像 使用帧缓存数据替换纹理图像 ……
查询多个纹理的驻留情况
GLboolean glAreTexturesResident(GLsizei n, const GLuint*textureNames, GLboolean *residences) 纹理全部驻留,返回GL_TRUE,residences不变 纹理部分驻留,返回GL_FALSE,residences相应改变

opengl算法学习---纹理映射

opengl算法学习---纹理映射

opengl算法学习---纹理映射纹理映射纹理映射(Texture Mapping),⼜称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。

简单来说,就是把⼀幅图像贴到三维物体的表⾯上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多⾮常漂亮的效果。

纹理纹理可看成是⼀个或多个变量的函数,因此根据纹理定义域的不同,纹理可分为⼀维纹理、⼆维纹理、三维纹理和⾼维纹理。

基于纹理的表现形式,纹理⼜可分为颜⾊纹理、⼏何纹理两⼤类。

颜⾊纹理指的是呈现在物体表⾯上的各种花纹、图案和⽂字等,即通过颜⾊⾊彩或明暗度的变化体现出来的细节。

如⼤理⽯墙⾯、墙上贴的字画器⽫上的图案等。

⼏何纹理(也可称为凹凸纹理)是指基于景物表⾯微观⼏何形状的表⾯纹理,如桔⼦、树⼲、岩⽯、⼭脉等表⾯呈现的凸凹不平的纹理细节。

⽣成颜⾊纹理的⼀般⽅法是在⼀个平⾯区域(即纹理空间)上预先定义纹理图案,然后建⽴物体表⾯的点与纹理空间的点之间的对应—即映射。

以纹理空间的对应点的值乘以亮度值,就可把纹理图案附到物体表⾯上⽤类似的⽅法给物体表⾯产⽣凹凸不平的外观或称凹凸纹理。

普通纹理映射常见的2D纹理映射实际上是从纹理平⾯到三维物体表⾯的⼀个映射。

凹凸纹理映射前述各种纹理映射技术只能在光滑表⾯上描述各种事先定义的花纹图案,但不能表现由于表⾯的微观⼏何形状凹凸不平⽽呈现出来的粗糙质感,如布纹,植物和⽔果的表⽪等1978年Blinn提出了⼀种⽆需修改表⾯⼏何模型,即能模拟表⾯凹凸不平效果的有效⽅法⼀⼏何(凹凸)纹理映射(bump mapping)技术⼀个好的扰动⽅法应使得扰动后的法向量与表⾯的⼏何变换⽆关,不论表⾯如何运动或观察者从哪⼀⽅向观察表⾯,扰动后的表⾯法向量保持不变。

Blinn表⾯法⽮扰动法在表⾯任⼀点处沿其法向附加⼀微⼩增量,从⽽⽣成⼀张新的表⾯,计算新⽣成表⾯的法⽮量以取代原表⾯上相应点的法⽮量。

透明效果与混合光学原理:透射,折射,反射颜⾊调和法设a为透明体的不透明度,0≤a≤1,则I=αI a+(1−α)I ba=1,完全不透明a=0,完全透明alpha融合技术BlendingRGBA(a)不透明度a表⽰穿透该表⾯光线的数量a=1,完全不透明;a=0,完全透明gl.blendFunc(src_ factor,dst factor)混合后颜⾊=源颜⾊src_factor+⽬标颜⾊dst_factor源颜⾊:当前对象⽬标颜⾊:帧缓存像素透明与Z-Buffer消隐当对象A是透明的,即B透过A是部分可见时先画B再画A,可以处理先画A再画B,深度缓冲会从B取⼀个像素,同时注意到⼰经绘制了⼀个更近的像素(A),然后它的选择是不绘制BZ-Buffer消隐不能很好处理透明的物体,需要修正才⾏开启深度测试gl.enable(gl.DEPTH_TEST);绘制所有不透明物体(a=1.0)锁定深度缓冲区gl.depthMask(false);按从后向前次序绘制所有半透明物体释放深度缓冲区gl.depthMask(true);光线跟踪光线跟踪算法[WH1T80]是⽣成⾼度真实感图形的主要算法之⼀。

OpenGL教程009_纹理映射

OpenGL教程009_纹理映射

纹理映射(Texture Mapping,/wiki/Texture_mapping)是⼀一种中等难度的渲染⽅方法。

其基本思路是将⼀一张或者⼏几张图⽚片作为纹理,将其贴在模型表⾯面。

纹理映射的算法实在是⾮非常简单。

⽤用OpenGL实现纹理映射,最⼤大的难度不在于OpenGL,⽽而在于如何加载图⽚片!⽤用C++读取图⽚片有很多库可以选择,例如CImg、ImageStone和OpenCV之类的。

这些库都是跨平台的,但使⽤用起来过于复杂。

于是我找了⼀一个简单的库EasyBMP(/projects/easybmp/?source=directory),只能读取BMP 数据,够⽤用也跨平台。

所需要的就是将纹理图全部转换为BMP格式,⽤用图像处理软件很容易做到这⼀一点。

我们引⼊入⼀一个新的函数来加载纹理://加载纹理GLuint const char//使⽤用EasyBMP加载纹理图⽚片//使⽤用什么库没有关系,最终纹理需要⽣生成⼀一个数组,数组的格式如下://{r1,g1,b1,r2,g2,b2,...,rn,gn,bn},其中ri,gi,bi表⽰示i位置的//像素点的rgb值。

如果图像由alpha值,数组的格式如下://{r1,g1,b1,a1,r2,g2,b2,a2,...,rn,gn,bn,an}BMPReadFromFileint TellWidthint TellHeightunsigned char new unsignedchar3int0for int0for int0row col Redrow col Greenrow col Blue//创建纹理,并将纹理数据传递给OpenGLGLuint1glGenTextures1glBindTexture GL_TEXTURE_2D0//设置纹理参数glTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEATglTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEATglTexParameteri GL_TEXTURE_2D GL_TEXTURE_MAG_FILTERGL_LINEARglTexParameteri GL_TEXTURE_2D GL_TEXTURE_MIN_FILTERGL_LINEAR//传输数据glTexImage2D GL_TEXTURE_2D0GL_RGB0GL_RGB GL_UNSIGNED_BYTE deletereturn0加载纹理通常分为以下⼏几个步骤:(1)⽤用图像处理库(这⾥里是EasyBMP)读取纹理⽂文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
◦ 图元保存在显示列表中、显示列表保存在 显卡中

保留模式(retained mode)
◦ 所有数据预先置入显存
立即模式与显示列表
立即模式 多项式 求值器 顶点操作 和 图元组装
CPU
列出显示
显示 列表
光栅化
象素 操作
帧 缓冲
纹理 内存 象素 操作
显示列表
创建显示列表
GLuint id;
void init( void ) { id = glGenLists( 1 ); glNewList( id, GL_COMPILE ); /* other OpenGL routines */ glEndList(); }
抖动

glEnable( GL_DITHER );

抖动用于加强视觉效果
◦ 用于模拟更多颜色

打印设置

目前,该功能ቤተ መጻሕፍቲ ባይዱ少被用到
象素上的逻辑操作

使用位逻辑操作结合多个象素值
glLogicOp( mode );

命令模式
GL_XOR GL_AND

目前,该功能很少被用到
累积缓冲器

颜色缓冲器合成的问题
◦ 有限颜色分辨率
截断 精度损失
◦ 累积缓冲区扮演着“浮点”颜色缓冲区的 角色
合成到积累缓冲区 将结果转换到帧缓冲区
累积缓冲区存取

glAccum( op, value )
◦ 操作
在积累缓冲区中的操作: GL_ADD, GL_MULT 读缓冲区操作: GL_ACCUM, GL_LOAD 写缓冲区操作: GL_RETURN
景深

沿平行焦平面的方向移动视点
后平面
焦平面
前平面
眼睛位置1
眼睛位置2
景深
雾化

glFog{if}( property, value )

景深效果处理
◦ 指定线性雾化渐变区域大小
GL_FOG_LINEAR

环境效果
◦ 模拟真实雾化效果
GL_FOG_EXP GL_FOG_EXP2
雾化

包围盒外的象素被裁剪掉 便于更新视域的一小块区域
影响glClear()操作
模板缓冲区(stencil buffer)

用模板缓冲区的值控制绘制
◦ 无法通过模板测试的象素将不被绘制 ◦ 例子:在模板缓冲区中创建一个蒙板,并 仅绘制那些不在蒙板区域内的物体
控制模板缓冲区

glStencilFunc( func, ref, mask )
高级成像

成像子集
◦ 只有当GL_ARB_imaging有定义时才有效
颜色矩阵 卷积 颜色表 直方图 MinMax 高级混合
立即模式、显示列表和保留模 式

立即模式(immediate mode)
◦ 图元直接发送到绘制流水线并显示 ◦ 不需要显卡内存

显示列表(display list)

使用模板


当stencil = 1绘制物体
glStencilFunc( GL_EQUAL, 0x1, 0x1 )

当stencil != 1绘制
◦ glStencilFunc( GL_NOTEQUAL, 0x1, 0x1 ); ◦ glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
创建模板
glInitDisplayMode( …|GLUT_STENCIL|… ); glEnable( GL_STENCIL_TEST ); glClearStencil( 0x0 );

glStencilFunc( GL_ALWAYS, 0x1, 0x1 ); glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE ); 绘制蒙板
OpenGL高级课题与纹理映射技术
OpenGL 架构
顶点操作 求值器
顶点变换与光照计算
像素级光照计算 CPU
显示列表 光栅化 逐个象素操作 帧缓冲
OpenGL其他高级课题
纹理 后象素处理
纹理映射
帧缓冲区操作
关于帧缓冲区(frame buffer)
象素 裁剪 测试 Alpha 测试 模板 测试
深度 测试

在纹理映射时用alpha值作为蒙板
混合

结合输出与帧缓冲器中原有的象素值 glBlendFunc( src, dst )
Cr src C f dst C p
混合 方程
象素 (src) 帧缓冲器 象素 (dst) 混合后 的象素
裁剪包围盒

其他的裁剪测试
glScissor( x, y, w, h )
◦ glAccum(GL_ACCUM, 0.5)将写缓冲区 的每一个值乘以0.5,然后加到累积缓冲区 中
累积缓冲区的应用
颜色合成:透明 全屏反走样:A-buffer算法 景深:Depth Cue 滤波: 运动模糊: Motion blur

反走样(Anti-aliasing)

消除锯齿状 glEnable( mode )
混合
抖动
逻辑 操作
帧缓冲区
Alpha: 第四维颜色分量

透明度的度量
◦ 模拟透明物体
玻璃、水等
◦ 合成图像 ◦ 反走样 ◦ 混合状态下有效 glEnable( GL_BLEND );
Alpha测试

基于alpha值选择象素
glAlphaFunc( func, value ) glEnable( GL_ALPHA_TEST );
◦ 用func比较缓冲区的值与 ref ◦ 只对那些mask值为1的象素进行操作 ◦ func 是一个标准比较函数

glStencilOp( fail(模板失败), zfail(模板 通过,z失败), zpass(两者都通过) )
◦ 基于模板测试和深度测试的结果相应调整 模板缓冲区的值: GL_KEEP, GL_INCR
GL_POINT_SMOOTH GL_LINE_SMOOTH GL_POLYGON_SMOOTH
◦ 象素的Alpha值由象素被覆盖 大小决定 ◦ 可以是RGBA或颜色索引模式
全屏反走样: 视点抖动

当我们略微移动视点时,图像随之平移
◦ 每一幅图像有不同的走样情况 ◦ 用积累缓冲区对图像作平均,将消除这些 走样
调用显示列表
void display( void ) { glCallList( id ); }
显示列表



不是所有的OpenGL程序都能存储在显 示列表当中 显示列表创建后,状态仍然能够被改变 显示列表可以嵌套调用 显示列表一旦创建,不能进行编辑
相关文档
最新文档