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)读取纹理⽂文件。

基于OpenGL纹理映射反走样技术的研究

基于OpenGL纹理映射反走样技术的研究

Computer Knowledge and Technology 电脑知识与技术本栏目责任编辑:唐一东人工智能及识别技术第7卷第17期(2011年6月)基于OpenGL 纹理映射反走样技术的研究赵方,张军和,彭亚雄(贵州大学计算机科学与信息学院,贵州贵阳550025)摘要:在计算机图形学中,引人注目的是图像的真实感问题。

图像的真实感来源于建模软件中渲染效果的好坏,渲染用时越少,质量越高,渲染出来的图像就越逼真。

利用纹理映射技术,即“贴”墙纸的方法将反映物体表面细节的图案贴到物体表面上。

现有的纹理映射技术存在诸多方面的缺陷,用时长,清晰度低,走样等使得渲染出来的图像不能满足实时的需求。

在原有纹理映射反走样技术的基础上,利用OpenGL 图像库,改进原有纹理映射技术中存在的问题,能得到高度真实感的图像。

关键词:真实感;纹理映射;OpenGL ;走样;反走样中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)17-4160-02The Anti-aliasing Research of Texture Mapping Based on OpenGLZHAO Fang,ZHANG Jun-he,PENG Ya-xiong(Computer Science and Information Department,Guizhou University,Guiyang 550025,China)Abstract:In Computer Graphics,the most important is the realistic of images.The realistic of images is form the stand or fall of rendering effects in modeling software,the less time spent,the high quality is,the images more e texture mapping technology,that is stick wallpaper,it will reflect object surface detail design on the object surface tack.The existing texture mapping technology has many defects,more time,low duration,aliasing and so on,it could not satisfy the real-time demand.In the original texture mapping technology based on anti -aliasing,using OpenGL image library,improving the original texture mapping technology,problem existing in the image can be sloved.Key words:realistic;texture mapping;OpenGL;aliasing;anti-aliasing计算机图形学中,图形的真实感是指计算机所生成的图形反映客观世界的程度。

OpenGL完全教程 第六章 纹理贴图

OpenGL完全教程 第六章 纹理贴图

OpenGL完全教程 第六章 纹理贴图作者:何咏 日期:2006-2-3 20:56:39 点击:4719如需转载本文,请声明作者及出处。

第六章 纹理贴图截至目前为止,我们已经能够绘制各种3D物体,并为它们增加光照效果,使它们更具有立体感。

但是,在实际运用中,我们不仅仅需要简单地绘制一个物体的轮廓,我们需要绘制蓝天白云、真实的墙壁和物体、人物和树木。

要达到这一目的,简单的将模型的轮廓绘制出来时远远不够的。

我们需要使用纹理贴图来再现真实的细节。

在计算机硬件高速发展的今天,即使是最低端的显卡也能很快地处理大量的纹理,满足我们的需求。

这些条件可以让我们毫无顾虑的使用OpenGL的纹理贴图功能,绘制出形形色色的物体。

本章将是学习OpenGL的最后一个基础章节。

本章之后,我们将开始接触一些OpenGL的高级专题学习本章内容,你将了解:•什么是纹理贴图•如何创建纹理图像•OpenGL中贴图的方式•使用纹理对象来管理的纹理•将纹理运用到图元上•自动生成纹理坐标•多贴图纹理6.0 准备工作由于Delphi为我们所提供的OpenGL头文件是OpenGL1.0版本的,因此里面缺少一些函数的声明,这导致我们不能使用直接调用这些函数。

因此我们要手动为OpenGL库添加下面的代码一进行补完:procedure glBindTexture(target: GLEnum; texture: GLuint); stdcall; external opengl32;procedure glDeleteTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32;procedure glGenTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32;function glIsTexture(texture: GLuint): GLboolean; stdcall; external opengl32;procedure glPolygonOffset(factor, units: GLfloat); stdcall; external opengl32;function gluBuild2DMipmaps(target: GLEnum; components, width, height: GLint; format, atype: GLEnum;Data: Pointer): GLint; stdcall; external GLU32;6.1 什么是纹理贴图纹理贴图,从本质上讲,是一个位图图像。

高级纹理映射-计算机游戏程序设计

高级纹理映射-计算机游戏程序设计

上面
左面
前面
右面
背面
下面
立方体映射
D3D Demo
球面映射
早期的球面映射版本称为Lat/Long映射 (1976),它在物体中心放置一个球面。
改进方法:
◦ 对每个纹理坐标(s,t), 沿-Z轴投射一根光线 到球面,记录下它的反射方向的光亮度
◦ 等价于用一个平行投影的相机(长焦距、 长距离)对一个反射球面进行成像
c b
0, 0
1, 0 s
(0.4, 0.2) B
C (0.8, 0.4)
表面 微结 构
环境 影响
高级纹理映射
标准纹理映射:物体本身的颜色 凹凸纹理映射
◦ 法向扰动:Bump mapping ◦ 法向图:Normal mapping ◦ 任意细节扰动:Detail mapping ◦ 曲面的反射属性:Reflectance map
真正改变了物体的表面几何属性,而凹 凸映射仅修正了曲面的法向量.
视差映射(Parallax mapping)
高分辨率表面几何细节
低分辨率几何
A B
相机
C
D
绘制C时,利用视差纹理中的位移从A移到B。
视差映射
深度校正位移映射(Z-correct displacement mapping )
输入高度图,将象素的Z值沿相机方向位移 并不改变物体表面几何 缺点是在像素层次上修改深度值会关闭图形硬件的早期深度测试
我们可以在运行时刻在线计算一个单独的动态光 照纹理。
并将该纹理做为额外的纹理步骤添加到场景中
Demo
Demo 开门时:移动的阴影
动态局部光照的改变
方法1:重新创建纹理,简单,低效; 方法2:改变光照图

实验五纹理映射实验

实验五纹理映射实验

实验五纹理映射实验实验项目性质:设计性实验所属课程名称:3D游戏图形学实验计划学时:3学时一、实验目的和要求掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术。

二、实验原理纹理映射是真实感图形制作的一个重要部分,运用纹理映射可以方面地制作真实感图形,而不必花更多的时间去考虑物体的表面纹理。

如一张木制桌子其表面的木纹是不规范的,看上去又是那么自然,如果在图形制作中不用纹理映射,那么只是这张桌面纹理的设计,就要花费很大精力,而且设计结果也未必能像现实中那么自然。

如果运用纹理映射就非常方便,可以用扫描仪将这样的一张桌子扫成一个位图。

然后的具体的操作中,只需把桌面形状用多边形画出来,把桌面纹理贴上去就可以了。

另外,纹理映射能够在多边形进行变换时仍保证纹理的图案与多边形保持一致性。

例如,以透视投影方式观察墙面时,远端的砖会变小,而近处的砖就会大一些。

此外,纹理映射也可以用于其他方面。

例如,使用一大片植被的图像映射到一些连续的多边形上,以模拟地貌,或者以大理石、木纹等自然物质的图像作为纹理映射到相应的多边形上,作为物体的真实表面。

在OpenGL中提供了一系列完整的纹理操作函数,用户可以用它们构造理想的物体表面,可以对光照物体进行处理,使其映射出所处环境的景象,可以用不同方式应用到曲面上,而且可以随几何物体的几何属性变换而变化,从而使制作的三维场景和三维物体更真实更自然。

在OpenGL中要实现纹理映射,需要经历创建纹理、指定纹理应用方式、启用纹理映射、使用纹理坐标和几何坐标绘制场景几个过程。

用于指定一维、二维和三维纹理的函数分别为:Void glTexImage1D(GLenum target, Glint level, Glint components, GLsizei width, Glint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage3D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLsizei depth, Glint border, GLenum format, GLenum type, const GLvoid *texels);其中,参数target取值一般为GL_TEXTURE_1D, GL_TEXTURE_2D和GL_TEXTURE_3D,分别与一维、二维和三维的纹理相对应。

第五章 纹理映射基础

第五章 纹理映射基础

也可以定义一维或三维纹理,函数分别是 GLTexImage1D()和GLTexImage3D()
2.2 控制纹理
控制纹理:控制纹理图像的纹理如何对应到屏幕上的像素, 怎样通过纹理贴图实现纹理缩放和纹理重复等 函数: void glTexParameter{if}[v](GLenum target, GLenum pname,TYPE param) 该函数控制设置几个纹理参数,这些参数绑定到当前的纹 理状态,可以通过glBindTexture设置为当前状态 target——指定的纹理目标 pname——将要设置的纹理参数 param——pname所指定的参数值
GL_LINEAR线性过滤: 将纹理坐标周围的纹理单元的加权平均值 应用到这个纹理坐标上(线性插补) 特点:纹理被拉伸时出现"失真",但是, 和最邻近过滤相比,这种"失真"更真实, 没有人工操作的痕迹
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR)
GL_REPEAT:在纹理坐标超过1.0的方向上对纹 理进行重复
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT)
2.5 分配纹理坐标
几何坐标决定顶点在屏幕上绘制的位置,纹理坐标 决定纹理图像中哪个像素赋予该顶点 纹理坐标:定义成一,二,三四维坐标,称为s,t,r,q 坐标,以区别于几何坐标(x,y,z,w) 一维纹理用s坐标表示,二维纹理用(s,t)坐标表 示,q坐标像w一样,一般取值为1 ,用于建立齐次坐 标

OpenGL参数曲面纹理映射的实现

OpenGL参数曲面纹理映射的实现

的1.0。

8坐标的范围为从+Y轴的0.0处开始,到+X轴的0.25,再到一y轴的0.5,再到一X轴的0.75,最后返回到+Y轴的1.0处。

如图2,就是利用Opengl中由二次工具生成的纹理坐标的圆柱面的纹理映射。

图2圆柱面纹理映射3.NURBS曲面纹理映射(1)NURBS曲线的定义NURBS曲线为一分段的有理多项式函数,其表达式5为:…∑B“(u)EKP(1‘)=上0_——一∑B“(u)Ei=0(5)式中K为控制点,职为权因子,B“(u)为||}次日样条基函数,由递推公式定义为式6:蹦Ⅱ):f㈠t辄引ML0others删加掣+虹掣(6)(t。

.I≤址≤t。

+I,k>O)式(6)中k为幂次,‰(i=0,1,…,m)为节点,形成节点矢量U=[U0,“l’.”,u。

]。

当节点数为m+1,控制点数为n+l,幂次为k时,有关系式ltn=Ⅱ+1。

(2)NURBS曲面的定义NUP,BS曲面定义如下:∑∑Bi.。

(“)B(”)』.1职JKJP(u,∥)=上¥专—————一u,”∈[o,1](7)∑∑Bi.。

(“)曰(叱吒式(7)中KJ为控制点,职J为权因子,Bu(H),易.。

(u)分别为沿“向的k次和沿”向的t次B样条基函数。

(3)OPENGL中曲面纹理映射的实现在OpenGL中,为了绘制一条样条曲线或曲面必须先定义求值器,才能计算曲线上点的坐标并完成绘制。

对于样条曲线,OpenGL使用一维基函数,并且只使用如下形式的多项式:【40研(n)=f?k1一“)州,f=0,…・,n(8)多项式(8)称为n次或/7,+1阶Bezier多项式。

设Pj表示控制点,则c(u)=∑87(u)P,(9)这样,C(u)就是样条曲线的求值器。

u的取值范围为[0,1]。

如果u的取值范围为[u。

%],则求值器为・36・c伫二丝1(10)、%一Ul/对于曲面,求值器除了使用两个参数u和”外,其余与一维求值器基本相同。

二维求值器的数学表达是:s(u,”)=∑∑研(u)掣(。

OpenGLES纹理详解

OpenGLES纹理详解
纹理用来表示图像照片或者说一系列的数据,使用纹理可以使物体用用更多的细节。OpenGLБайду номын сангаасES 2.0 中有两种贴图:二维纹理和立方体纹 理。
每个二维纹理都由许多小的纹理元素组成,类似与片元和像素,使用纹理最简单的方式就是直接从一个图像加载数据。在OpenGL中规定 纹理图像的左下角由stst坐标(0.0,0.0)指定,右上角由stst坐标(1.0,1.0)指定,不过超过1.0的坐标也是允许的,在该区间之外的纹理在读取 时的时候由纹理拉伸模式决定。
public static native void glGenTextures( int n, // 指定要生成的纹理对象的数量 int[] textures, // 保存纹理对象ID的数组 int offset
);
纹理对象在应用程序中不再使用时,需要删除。
public static native void glDeleteTextures( int n, // 指定要删除的纹理数量 int[] textures, // 保存待删除的纹理ID的数组 int offset
);
纹理对象的 ID 必须是 glGenTextures 产生的,一旦生成纹理ID,就必须绑定纹理对象才能继续进行后续的操作。后续的操作将影响绑定 的纹理对象。一旦纹理被绑定到一个特定的纹理目标,再删除之前就一直保持着绑定状态。
public static native void glBindTexture( int target, // 绑定纹理对象到目标 GL_TEXTURE_2D 或 GL_TEXTURE_CUBE_MAP int texture // 要绑定的纹理对象ID
private Context mContext; public Rectangle(Context context) {
  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程序都能存储在显 示列表当中 显示列表创建后,状态仍然能够被改变 显示列表可以嵌套调用 显示列表一旦创建,不能进行编辑
相关文档
最新文档