opengl纹理映射(下)
第三章光照模型纹理映射
![第三章光照模型纹理映射](https://img.taocdn.com/s3/m/f7d608dd9b89680203d8258c.png)
第三章光照模型及纹理映射基本光照模型1.在现实生活中,当光照在非透明物体上时,部分光线被物体吸收,剩余的部分光线被反射。
人眼依靠这种反射光来感知物体的形状、颜色和其他细节。
从光源投向物体的光称为入射光,从物体表面反射回的光称为反射光。
1.1光照模型概述当光照射到物体表面上时,将出现3种情况:●光从物体表面反射,形成反射光●光穿透物体,形成透射光●光被物体吸收,转化成为物体的内能在上述三种情形的光线中,通常只有前2种情形的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。
OpenGL用一种近似的光照模型模拟现实世界的光照效果。
在该模型中,仅当物体表面吸收和反射光线时,光源才会起做作用。
每一个物体表面都假定是由某种特性的材料构成的。
一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能像镜子一样在某个方向强烈地反射入射光。
1.2光照分量在OpenGL的简化光照模型中,将光照分为4个独立的组成部分:辐射光、环境光、漫反射光和镜面反射光。
1)辐射光辐射光是直接从物体或光源发出的,不受任何其他光源的影响。
2)环境光环境光是这样一种光线,它被环境多次反射,以致于连初始方向也难以确定。
这种光线看起来就像来自于所有的方向,当它照在一个物体表面时,它在所有的方向上等量地反射。
3)漫反射光在被照射物体表面的反射光中,那些均匀地向各个方向反射出去的光,称为漫反射光,如黑板反射就属于漫反射光4)镜面反射光镜面反射光是指超一定方向的反射光,如点光源照射光滑金属球表面时,会在球表面形成一个特别亮的区域,呈现所谓的高亮(Highlight>,这就是光源在该物体表面形成的镜面反射光(SpecularLight>。
点光源照射表面光滑的物体时,高亮区域小而亮;而点光源照射表面粗糙的物体时,高亮区域大而不亮。
1.3创建光源光源有许多特性,如颜色、位置、方向等。
不同特性的光源,作用在物体上的效果是不一样的。
opengl光栅化原理
![opengl光栅化原理](https://img.taocdn.com/s3/m/59a68a6f657d27284b73f242336c1eb91a373322.png)
opengl光栅化原理OpenGL,这个被广泛使用的图形编程接口,以其强大的功能和灵活的编程方式,在计算机图形领域占据了重要的地位。
而在OpenGL 中,光栅化(Rasterization)是一个关键步骤,它把几何形状转换成像素网格。
这篇文章将带您深入了解OpenGL中的光栅化原理。
一、引言想象一下,你正在一个巨大的画布前,手中握着一把画笔,你的任务是将那些复杂的几何形状转换成实际的像素。
这就是光栅化的过程,也是OpenGL中的核心步骤。
理解这个过程,对于我们更好地使用OpenGL,尤其是进行高效的渲染,是非常重要的。
二、基本原理1.坐标变换:首先,我们需要将几何形状的顶点从世界坐标系转换到屏幕坐标系。
这个过程通常涉及到矩阵变换,包括平移、旋转和缩放等。
2.边缘检测:在转换后的顶点上,我们需要找到相邻的像素,以确定哪些部分的形状应该被绘制出来。
这通常通过使用扫描线(scanline)方法来实现。
3.细化:通过将线段分割成更小的线段,我们可以减少绘制的复杂性。
这种方法通常涉及到使用一些算法,如Z-Buffering或扫描线算法。
4.像素填充:最后,我们将每个边缘的像素部分填充为颜色。
这通常涉及到采样颜色纹理或者使用一些插值方法来生成颜色。
三、更深入的理解1.光栅化效率和精度:在光栅化过程中,我们需要平衡效率和精度。
为了提高效率,我们可以使用一些简化的算法,如简单的扫描线算法或简单的Z-Buffering。
但是,这些算法可能会牺牲精度。
相反,更复杂的算法如PhongAntialiasing或Mipmapping可以提供更好的视觉效果,但可能会降低性能。
2.纹理映射:纹理映射是OpenGL中的一项重要功能,它允许我们在渲染时使用图像数据来替代像素的颜色。
在光栅化过程中,我们需要将纹理坐标应用到几何形状上,然后将纹理采样到对应的像素上。
这个过程涉及到很多计算和存储开销,因此我们需要使用合适的纹理过滤技术来减少这些开销。
opengl面试题
![opengl面试题](https://img.taocdn.com/s3/m/7261c193185f312b3169a45177232f60ddcce793.png)
opengl面试题OpenGL(Open Graphics Library)是一种跨平台的图形程序接口,被广泛应用于计算机图形学、游戏开发和虚拟现实等领域。
在面试中,对于应聘者来说,熟悉和掌握OpenGL相关知识是非常重要的。
本文将针对OpenGL面试题,从基础知识到高级概念进行详细讲解。
一、OpenGL基础知识1. 什么是OpenGL?OpenGL是一种开放的、跨平台的图形程序接口,由一系列函数库组成,用于渲染2D和3D图形。
它提供了丰富的绘图函数和状态管理函数,可以用于创建和操控渲染管线,实现图形的绘制、变换、光照等操作。
2. OpenGL的版本有哪些?它们之间有何区别?OpenGL的版本包括OpenGL 1.0、OpenGL 2.0、OpenGL 3.0、OpenGL 4.0等。
每个版本都有自己特定的功能和特性,新版本通常会引入更强大的功能和更高效的实现方式。
主要的区别在于对硬件和图形特性的支持程度上有所不同。
3. 什么是渲染管线?渲染管线是OpenGL中的一个重要概念,它描述了图形的处理过程。
渲染管线包括几个阶段,如顶点处理、光栅化、片段处理等。
每个阶段都有特定的功能和输入输出。
熟悉渲染管线的工作原理是理解OpenGL的关键。
4. 什么是顶点缓冲对象(VBO)?顶点缓冲对象是OpenGL中用于存储顶点数据的缓冲区。
通过创建和绑定VBO,可以将顶点数据传输到显存中,从而提高渲染效率。
VBO可以存储顶点的位置、颜色、纹理坐标等信息。
二、OpenGL高级概念1. 什么是着色器(Shader)?着色器是OpenGL中用于控制图形渲染过程的程序。
着色器分为顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)。
顶点着色器用于处理顶点相关计算,如位置变换、法线变换等;片段着色器用于处理每个像素的光照、纹理采样等操作。
2. 什么是纹理(Texture)?纹理是二维图像的映射,可以应用到模型的表面上。
纹理映射技术
![纹理映射技术](https://img.taocdn.com/s3/m/00acac797f1922791788e85d.png)
2. 如何映射
• 利用纹理坐标来定义从图片到几何的映射:
– 要将该纹理映射到一个三角形上, 需设置三角形的 三个顶点在图像空间上的纹理坐标[tx ty], 再对应计 算每个几何像素在纹理图像上的对应RGB颜色;
– 一般一个四边形的纹理坐标: (0,0)(0,1)(1,0)(1,1)
– 3D Game Studio.
3. 纹理插值
• 我们只指定了三角形顶点处的纹理坐标,中间每个象素 的纹理坐标(ti, tj)可用线性插值;
• 一般双线性插值;
• 从而三角形上每个象素点都可对应地到纹理图片上去 取颜色.
思考?
• 图像与几何体的尺寸不一致怎么办?
• 几何对应的纹理空间超出[0,1)纹理空间怎么办? • 几何物体本身有颜色怎么办?
(1,1)
t1
v1
y
t2 t0
(0,0)
x
Texture Space
v0
v2
Triangle (in any space)
纹理空间与模型空间的对应
基本实现步骤:
• Three steps
-Specify texture
• Read or generate image • Assign to texture • Enable texturing
Texture Space
(1,1) (0,0)
Mirroring
常用对应函数
• wrap or tile: 纹理图像在表面重复。例子:地上的大理石 贴图
• mirror: 纹理图像在表面重复, 但每隔一幅进行翻转 (flipped)。这样在纹理的边界处,纹理可以保持连续。
• clamp : 把[0,1)范围之外的进行截断。截断到[0,1)内的半 个纹素。
02-配合视频讲解纹理的基本概念和纹理映射的基本方法。
![02-配合视频讲解纹理的基本概念和纹理映射的基本方法。](https://img.taocdn.com/s3/m/cbdb86ed51e79b8969022624.png)
让人头疼的纹理(上):颜色纹理华中科技大学软件学院万琳提纲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)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射(第三步)。
基于OpenGL的纹理映射的实现与应用
![基于OpenGL的纹理映射的实现与应用](https://img.taocdn.com/s3/m/148022080740be1e650e9a8e.png)
在 最简单情 况下 , 纹理 是单个 图像 ; 在通常情 况下 , 纹理 是二维 的,即纹 理数据是 一个矩 形数组 . O eGL 在 pn
中定义二维纹理使用的函数是gTxm g2 0其函数原型可参考相关书籍, leI aeD , 在我们的应用实例( 柳编工艺品的三 维真实感模拟 I) 也可以采用别的方法实现纹理的定义. 2 中,
模 拟 中的应 用.
关键 词 :O eGL p n ;纹 理 映射 ;柳 编 工 艺品 :真 实 感 图形
中图分类号 : P 0 . T 31 6
文献标识码 :A
1 引言
在利用计算机对现实物体进行真实感绘制 时, ¨ 如果加入了光照, 物体将会具有立体感, 如果又给出了物
体表面的材质 、 颜色等, 物体将会变得丰富多彩并且还会具有一定的质感, 从而使绘制出的图形具有了一定的真 实感. 但在有些情况下, 仅仅使用材质属性等是不能获得更为真实的图形的, 这时就需要使用纹理映射技术来 绘制物体表面的每一个三维细节.
23 纹理的 映射方式 _
在一般情况下, 纹 图像是直接作为颜色画到多边形上的. 实际上, pn L 还可以用纹理 中的值来 在O eG 中, 调整多边形甚至曲面原本的颜色, 或者用纹理图像中的颜色与多边形甚至曲面原本的颜色进行融合, 这就是纹 理 的映射方 式 . O eGL 在 pn @控 制纹理 映射方 式 的函数是 g eE v (共有 三种模式 :()L M OD U LATE, 纹 l x n ) T , 1G 理图像 以透明方式贴在物体表面上 ; 2G L N , () L B E D 使用一个R B 常量来融合物体原色和纹理图像的颜色; G A () L D C ,即贴纸 纹理 映射方式 . 3G E AL
C语言实现OpenGL渲染
![C语言实现OpenGL渲染](https://img.taocdn.com/s3/m/a64b68c6e43a580216fc700abb68a98271feaccf.png)
C语言实现OpenGL渲染OpenGL是一种强大的图形渲染API(应用程序接口),它可用于创建高性能的2D和3D图形应用程序。
在本文中,我们将探讨如何使用C语言实现OpenGL渲染。
1. 初始化OpenGL环境在开始之前,我们需要初始化OpenGL环境。
这可以通过以下步骤完成:1.1. 创建窗口使用C语言中的窗口创建库(如GLUT或GLFW)创建一个可见的窗口。
这个窗口将充当我们OpenGL渲染的目标。
1.2. 设置视口使用glViewport函数将窗口的尺寸设置为需要进行渲染的大小。
视口定义了OpenGL将渲染的区域。
1.3. 创建正交投影或透视投影矩阵使用glOrtho或gluPerspective函数创建透视或正交投影矩阵。
投影矩阵将定义OpenGL渲染的视图。
2. 渲染基本图形一旦我们初始化了OpenGL环境,我们可以开始渲染基本图形。
以下是一些常见的基本图形渲染函数:2.1. 绘制点使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个点。
2.2. 绘制线段使用glBegin和glEnd函数,以及glVertex函数,可以绘制一条或多条线段。
2.3. 绘制三角形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个三角形。
2.4. 绘制多边形使用glBegin和glEnd函数,以及glVertex函数,可以绘制一个或多个多边形。
3. 设置光照效果为了给渲染的图形添加逼真感,可以设置光照效果。
以下是一些常见的光照函数:3.1. 设置光源使用glLight函数,可以设置光源的位置、光照颜色等参数。
3.2. 设置材质属性使用glMaterial函数,可以设置渲染对象的表面材质属性,如漫反射、镜面反射等。
3.3. 使用光照模型使用glShadeModel函数,可以选择光照模型,如平滑光照模型或平面光照模型。
4. 纹理映射纹理映射能够使渲染的图形更逼真。
opengl算法学习---纹理映射
![opengl算法学习---纹理映射](https://img.taocdn.com/s3/m/f3b3584e302b3169a45177232f60ddccda38e627.png)
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的2D纹理映射技术研究
![基于OpenGL的2D纹理映射技术研究](https://img.taocdn.com/s3/m/daf70b0ade80d4d8d15a4faa.png)
( eate tfC m ue,hax nvrt eh o g , nhn ,hn 7 3 0 ) D p r n o o p t San i i s yfTc nl yHazo g C i m r U ei o o a 2 0 3
Absr c : i e t r p i g c n b id a u a t a ii s e s i e GL r g a . rty, h wi g t e t a t Usng t xu e ma p n a u l b nd n nd vv d c ne n Op n p o r msFisl s o n h r q e to t n a d sz ftx u e i g a d g vn n ee n ay sr tr nd d sg de ft e p o r m ,h n e u s fsa d r ie o e t r ma e, n ii g a l me tr tu u e a e in i a o h r g a t e
Mo ue ” 项 中的 开 始处 ( kre 3 .b前 ) 加 O e G 2 i,L 21 d ls选 在 en l 21 i 增 p n L3 .bG u3 .b和 G ax1 1 i L u .b后 单 击 O i K按 钮 , 就可 以开始 写 O e G p n L程序 了.
21 0 1年 2月
F b2 1 e .0 1
基 于 Op n e GL的 2 D纹 理 映射 技 术 研 究
杨 刚
( 陕西 理 2 学 院计 算 机 科 学 与技 术 系 , 中 1 2 汉 730 ) 2 03
摘 要 : pn L程 序 中使 用纹 理 映 射 可 以方便 地 构 建 复 杂 、 实 的场 景. 先 提 出纹 理 图像 的标 准尺 寸 要 求 , 时给 出 O eG 真 首 同
OpenGL教程009_纹理映射
![OpenGL教程009_纹理映射](https://img.taocdn.com/s3/m/900a5a39647d27284b735195.png)
纹理映射(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的视景仿真系统中纹理的应用](https://img.taocdn.com/s3/m/0a86df836529647d27285293.png)
gT x aa t i G — TE TUR l e P rmee ( L r X E
TEXTURE
—
M AG
—
FI TE , L R GL
—
LN A ; I E R)
gT x aa t i G — T X l e P rmee ( L r E TUR 一 2 GL — E D,
TEXTURE
6 2
2 1 年 4 中国制造业信息化 02 月
第4卷 1
第7 期
基 于 Opn e GL的视 景仿 真 系统 中纹 理 的应 用
陈玉 军 , 张 旭
( 江南计算技术研究所 , 江苏 无锡
240 ) 100
摘要 : 系统地介 绍 了 O eGL中纹理 映射技 术 的概 念 、 点 及 工作 流 程 , 结合 实 际视 景仿 真 系 pn 特 并
或 长方形 的 , 以在 树 的纹理 映射 时需要 消去 四围 所
中直 接 读 取。通 过 Wi o s下 提 供 的 函 数 n w d
a x B mae o d( 来 导 入 外 部 的 纹 理 数 据 , u DI I g L a )
O eGL就可 以模 拟 比较 复 杂 、 pn 自然 的纹 理 图像 ,
gVetx f2 5 一1 5 ~10 0 ; l r 3 ( . , . , 8 . ) e
g x o r2 ( . ,0 0 ; l C od f0 0 2 . ) Te g r x f 一2 5 一1 5 一10 0 ; l t 3 ( . , . , 8 . ) Ve e
g n (; l d ) E
n m] ; u )
21 02年 4月 中国制造业 信 息化
glgeneratemipmap用法
![glgeneratemipmap用法](https://img.taocdn.com/s3/m/028fac35f56527d3240c844769eae009581ba2f5.png)
glgeneratemipmap用法
glGenerateMipmap是一个OpenGL函数,用于生成纹理的多级渐远纹理映射。
多级渐远纹理映射使用一个纹理的不同分辨率级别来提供更好的渲染效果和性能。
在使用glGenerateMipmap之前,我们首先需要创建一个纹理对象,并将纹理图像加载到该对象中。
然后,我们使用以下步骤来使用glGenerateMipmap生成多级渐远纹理映射:
1. 绑定纹理对象:
使用glBindTexture函数,将纹理对象绑定到OpenGL的纹理目标上。
2. 设置纹理参数:
使用glTexParameteri函数,设置纹理的放大和缩小过滤器,以及纹理的环绕模式。
这些参数将影响生成的多级渐远纹理映射的质量和性能。
3. 生成多级渐远纹理映射:
使用glGenerateMipmap函数生成多级渐远纹理映射。
这将自动生成一系列纹理的不同分辨率级别,并存储在纹理对象中。
生成的纹理级别将根据原始纹理的大小进行缩小和过滤。
4. 使用纹理:
现在,我们可以使用生成的多级渐远纹理映射来渲染场景。
通过在片段着色器中使用纹理坐标来采样纹理,我们可以获得更加平滑和细节丰富的渲染效果。
值得注意的是,glGenerateMipmap函数只能应用于完全被一个纹理图像填充的纹理对象。
如果纹理对象不完全填充,将会导致未定义行为。
通过使用glGenerateMipmap来生成多级渐远纹理映射,我们可以在不同分辨率级别上使用纹理,以匹配不同的渲染需求。
这样可以提高渲染效果和性能,并减少内存占用。
纹理映射方法
![纹理映射方法](https://img.taocdn.com/s3/m/04c43877b80d6c85ec3a87c24028915f814d844d.png)
纹理映射方法纹理映射是计算机图形学中一种重要的技术,它可以将纹理图像应用于三维对象表面,从而增强三维对象的视觉效果,提高视觉逼真度。
本文将介绍纹理映射的基本原理、方法、应用和实现技术。
一、纹理映射的基本原理纹理映射是一种将纹理图像应用于三维对象表面的技术,通过将纹理图像映射到三维对象表面,可以实现对三维对象的视觉效果进行增强。
纹理映射的基本原理是将纹理坐标系与三维对象表面坐标系进行对应,将纹理图像上的像素点映射到三维对象表面上的对应点,从而实现纹理的映射。
1. 简单纹理映射简单纹理映射是最基本的纹理映射方法,它只考虑了纹理坐标系和对象表面坐标系之间的简单对应关系,没有考虑纹理的缩放、扭曲和剪切等问题。
这种方法适用于简单的纹理应用场景。
2. 仿射变换纹理映射仿射变换纹理映射是在简单纹理映射的基础上,对纹理图像进行仿射变换,从而实现更复杂的纹理效果。
可以通过调整仿射变换矩阵来控制纹理的缩放、旋转、扭曲等效果,从而实现对纹理图像的灵活应用。
3. 贴花纹理映射贴花纹理映射是一种将多个纹理合并在一起的方法,可以通过在三维对象表面多次应用不同纹理来实现更加丰富的视觉效果。
可以通过调整贴花矩阵和控制参数来控制不同纹理之间的混合方式,从而实现更加自然的效果。
4. 多层纹理映射多层纹理映射是将多个纹理叠加在一起的方法,可以通过在不同的层上应用不同的纹理来实现更加丰富的视觉效果。
可以通过调整叠加顺序和参数来控制不同纹理之间的融合效果,从而实现更加自然的视觉效果。
三、纹理映射的应用1. 自然景物仿真纹理映射可以用于模拟自然景物的外观,通过将自然景物图像应用于三维模型表面,可以使其看起来更加逼真。
例如,可以将树叶、石头、水波等自然景物图像应用于三维模型表面,从而使其看起来更加自然。
2. 特效表现纹理映射可以用于表现各种特效,例如火焰、烟雾、水纹等。
可以通过将特效图像应用于三维模型表面,从而使其看起来更加真实。
3. 游戏开发纹理映射在游戏开发中有着广泛的应用,可以通过将游戏场景中的物体表面贴上纹理图像,来提高游戏的视觉效果和真实感。
纹理映射
![纹理映射](https://img.taocdn.com/s3/m/52dc0519b9d528ea80c77930.png)
• 使用指定的颜色,响应光照条件(纹理单元的颜色值与纹理环境颜色值混合) 20
➢ 设置纹理环境
• 设置纹理环境函数
void glTexEnv{if}(GLenum target, GLenum pname, TYPE param); void glTexEnv{if}v(GLenum target, GLenum pname, TYPE *param);
参数说明
target 必须设置为GL_TEXTURE_2D
width和 height 给定二维纹理的尺寸,必须为2m+2b( width和 height可分别对应不同的m值)
width和 height为0,纹理映射无效ຫໍສະໝຸດ 12➢ 定义三维纹理
– 使用glTexImage3D()函数定义三维纹理
void glTexImage3D(GLenum target, GLint internalFormat, GLsizei width, GLsizei height , GLsizei depth, GLint border, GLenum format ,GLenum type, const GLvoid *texels)
11
➢ 定义二维纹理
– 使用glTexImage2D()函数定义二维纹理
void glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixel)
18
➢ 纹理的创建
基于OpenGL三维图形的开发
![基于OpenGL三维图形的开发](https://img.taocdn.com/s3/m/aeb8506348d7c1c708a145e7.png)
纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分 逼真地表达物体表面细节。 位图显示和图象增强:图象功能除了基本的拷贝和像素读写外,还提 供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图 象效果处理。以上三条可是被仿真物更具真实感,增强图形显示的效 果。
用户必须从点、线、面等最基本的图形单 元开始构造自己的三维模型
OpenGL提供了以下的对三维物体的绘制 方式:
网格线绘图方式(wireframe):这种方式仅绘制三维物体的网格轮廓 线。 深度优先网格线绘图方式(depth_cued):用网格线方式绘图,增加 模拟人眼看物体一样,远处的物体比近处的物体要暗些。 反走样网格线绘图方式(antialiased):用网格线方式绘图,绘图时采 用反走样技术以减少图形线条的参差不齐。 平面消隐绘图方式(flat_shade):对模型的隐藏面进行消隐,对模型 的平面单元按光照程度进行着色但不进行光滑处理。
OpenGL具体功能
模型绘制:OpenGL能够绘制点、线和多边形。应用这些基 本的形体,我们可以构造出几乎所有的三维模型。 OpenGL通常用模型的多边形的顶点来描述三维模型。如 何通过多边形及其顶点来描述三维模型,在指南的在后续 章节会有详细的介绍。 模型观察:在建立了三维景物模型后,就需要用OpenGL描 述如何观察所建立的三维模型。观察三维模型是通过一系 列的坐标变换进行的。模型的坐标变换在使观察者能够在 视点位置观察与视点相适应的三维模型景观。在整个三维 模型的观察过程中,投影变换的类型决定观察三维模型的 观察方式,不同的投影变换得到的三维模型的景象也是不 同的。最后的视窗变换则对模型的景象进行裁剪缩放,即 决定整个三维模型在屏幕上的图象。
OpenGL功能简介
![OpenGL功能简介](https://img.taocdn.com/s3/m/8fd3f81614791711cc7917c4.png)
状态变量通过函数 glEnable() 和 glDisable() 进行激活或取消的设置
OpenGL状态机制(2/2)
每一个状态变量都有系统默认的缺省值 状态变量的当前值可以通过一系列函数查询
顶点数据 Vertex data
OpenGL渲染流水线(7/20)
求值器
参数化的曲面曲线(如贝塞尔,NURBS曲面曲线) 并不直接给出顶点,而是给出一系列控制点及其生成 曲面曲线的函数 求值器的功能就是,通过控制点和生成函数,得到实 际使用的顶点数据 对于非参数化曲面曲线,这一步是被忽略的
顶点数据 Vertex data 求值器 Evaluators
对每个顶点的操作和图元装配
对象坐标 Object 人眼坐标 Eye 裁剪 Clip 归一化 Normalize 窗口坐标 Window
顶点 Vertex
模型视图矩阵 Modelview matrix
投影矩阵 Project matrix
透视除法 Perspective division
视区变换 Viewport transform
OpenGL基本功能(5/11)
矩阵变换
无论多复杂的图形都是由基本图元组成并经 过一系列变换来实现的 OpenGL提供四种基本变换:平移、旋转、按 比例缩放、镜像 OpenGL提供两种投影变换:平行投影(正射 投影)、透视投影
OpenGL基本功能(6/11)
颜色管理
OpenGL提供了两种颜色模式:RGBA模式,颜色索 引模式(Color index) RGBA模式为每个像素点指定颜色,可提供丰富多彩 的色彩效果,其中A是混合因子,用于各种特效处理 对于显示能力不足的硬件,可采用颜色索引模式,系 统提供一个颜色表,通常有256或4096种颜色,各像 素点通过索引颜色表项得到颜色值
OpenGL简介资料
![OpenGL简介资料](https://img.taocdn.com/s3/m/3673c630ef06eff9aef8941ea76e58fafab045ed.png)
//主函数
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //设置显示模式(颜色、缓冲区等)
glutCreateWindow(“A Simple Example”); //创建窗口
OpenGL功能(五)
纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真地表 达物体表面细节。
OpenGL功能(六)
位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提 供融合(Blending)、反走样(Antialiasing) 和雾(fog)的特殊图象效果处理。以上三条 可使被仿真物更具真实感,增强图形显示的效 果。
用OpenGL编写程序的基本模板
模板演示
基本操作(视口变换)
Void glViewport(GLint x,GLint y,GLsizei width,GLsizei height); 在窗口中指定一个用于显示图像的像素矩形。 参数(x,y)是视口左下角的坐标,而参数 width和height为视口的大小。默认情况下, 视口的初始值为(0,0,winWidth,winHeight),其 中winWidth和winHeight是窗口的大小。
将影响投影矩阵而不是模型视点矩阵,同时消除以前 的投影变换。每个投影变换函数都完整的描述了一种特 定的变换,因此通常不混合使用两种投影变换
(一)透视投影
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble near,GLdouble far); 参数fovy是在yz平面内的视野角度,其取值范围为[0.0, 180.0];参数aspect是视景体顶面的宽高比(w/h);参数 near和far是视点和两个裁减面之间的距离,必须大于0。
OpenGL试题库
![OpenGL试题库](https://img.taocdn.com/s3/m/e910ce6fd0d233d4b04e696e.png)
O p e n G L试题库(总10页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--一、 选择题(每题1分,共10分)1、通过( A )技术,我们可以将2D 图像数据映射到3D 图元上,以增强场景的真实感。
A. 纹理映射B.模板C. 光照D. 混合2、要得到如右图示的效果,glBegin() 函数的类型参数可取为( C )。
A. GL_POLYGONB. GL_LINESC. GL_LINE_STRIPD. GL_LINE_LOOP3、要实现屏幕区域的多视口显示,应采用( C )函数。
A. glOrtho()B. gluPerspective()C. glViewport()D. gluLookAt()4、从下面四个侯选项中选择两个OpenGL 语句,可以使摄像机从源位置变换到目标位置。
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); _______B _________;_______D _________;A. glTranslatef,,-d)B. glTranslatef,,d)C. glRotatef,,,D. glRotatef,,,5、由 K 个控制顶点 Pi(i=1,… k) 所决定的 n 次 B 样条曲线,由 ( C ) 段n 次B 样条曲线段光滑连接而成。
A. k-n-2B. k-n-1C. k-nD. k-n+16、使用二维图形变换矩阵: T=如果图形的一个顶点坐标为A(6,8),则变换后A ’的坐标为( C )。
A .(2,-8) B. (-2,-8) C. (2,8) D. (-2,8)7、点P 的坐标为(8,6,4,2),对应的空间齐次坐标为 ( D )。
A. (8,6,4,2)B. (8,6,4)C. (4,3,2)D. (4,3,2,1)8、当观察光照下的光滑物体表面时,在某个方向上看到高光或强光,这个现象为 ( B )A. 漫反射B.镜面反射C. 环境光D. 折射9、双三次Bezier 曲面的4条边界都是三次Bezier 曲线, 其特征网络有 ( C ) 个顶点。
opengl用法
![opengl用法](https://img.taocdn.com/s3/m/26527a810d22590102020740be1e650e52eacfc4.png)
opengl用法OpenGL(Open Graphics Library)是一种用于图形渲染的跨平台编程接口,它提供了一组函数和命令,用于创建和操作2D、3D图形。
OpenGL被广泛应用于计算机图形学、游戏开发、虚拟现实和科学可视化等领域,具有强大的图形处理能力和灵活性。
一、OpenGL的基本概念OpenGL使用一种状态机的方式来管理和调用图形渲染的函数。
在开始使用OpenGL之前,我们需要了解一些基本概念和术语。
1. 坐标系:OpenGL使用右手坐标系,其中x轴向右延伸,y轴向上延伸,z轴指向观察者。
2. 顶点:顶点是构成图形的基本元素,它们包含位置、颜色和纹理坐标等信息。
3. 三角形:OpenGL最基本的图形是三角形。
通过连接三个顶点,可以构成一个平面上的三角形。
4. 缓冲区对象:OpenGL使用缓冲区来存储顶点数据、纹理数据等。
通过绑定缓冲区对象,我们可以将数据发送到显卡中进行处理。
5. 着色器(Shader):着色器是OpenGL中用于将顶点数据转换为屏幕上可见像素的程序。
二、OpenGL的基本用法下面我们将介绍一些常用的OpenGL函数,以帮助你了解如何使用OpenGL进行图形渲染。
1. 初始化OpenGL环境在开始渲染之前,我们首先需要初始化OpenGL环境。
通过调用glutInit函数和glutCreateWindow函数,可以创建一个OpenGL窗口。
2. 设置视口设置视口是指确定OpenGL窗口中要渲染的区域。
通过调用glViewport函数,我们可以指定视口的位置、宽度和高度。
3. 设置投影矩阵投影矩阵用于将三维坐标转换为二维坐标。
通过调用glMatrixMode和glOrtho函数,我们可以设置投影矩阵的类型和具体数值。
4. 绘制图形在设置好渲染环境后,我们可以开始绘制图形。
通过调用glBegin和glEnd函数,我们可以定义一个形状(如三角形或四边形)并填充颜色、添加纹理等。
texture() 函数
![texture() 函数](https://img.taocdn.com/s3/m/47f1dee385254b35eefdc8d376eeaeaad0f31660.png)
texture() 函数texture() 函数是OpenGL中用于进行纹理映射的函数。
它的作用是将纹理映射到几何图形上,从而使得几何图形具有更为丰富的外观和细节。
在OpenGL中,纹理是一种图像,可以被映射到几何图形的表面上。
纹理可以是任何图像,例如照片、绘画、文本等等。
texture() 函数的语法如下:vec4 texture(sampler2D sampler, vec2 coord)其中,sampler2D 表示纹理采样器,用于指定纹理的类型和纹理数据的来源;vec2 表示纹理坐标,用于指定纹理在几何图形上的映射位置。
texture() 函数返回一个vec4 类型的向量,表示纹理在指定位置的颜色值。
在使用texture() 函数时,需要先将纹理数据加载到OpenGL中。
这可以通过以下步骤完成:1. 创建纹理对象:使用glGenTextures() 函数创建一个纹理对象,并将其绑定到当前的纹理单元上。
2. 加载纹理数据:使用glTexImage2D() 函数将纹理数据加载到OpenGL中。
3. 设置纹理参数:使用glTexParameteri() 函数设置纹理的过滤方式、重复方式等参数。
4. 绑定纹理:使用glBindTexture() 函数将纹理绑定到当前的纹理单元上。
一旦纹理数据加载到OpenGL中,就可以使用texture() 函数将纹理映射到几何图形上。
在进行纹理映射时,需要注意纹理坐标的范围和方向。
纹理坐标的范围通常为[0,1],而纹理坐标的方向与屏幕坐标的方向相反。
总之,texture() 函数是OpenGL中用于进行纹理映射的重要函数,它可以使几何图形具有更为丰富的外观和细节,提高图形渲染的质量和效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
齐次坐标
齐次坐标(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为应用程序建立起了高性能的纹 理工作集,称为“驻留(resident)”
实际上就是:保持纹理对象及其数据在显存 中,而不是在内存中
驻留纹理
显存有限,因此并不是所有纹理都可以驻留
查询单个纹理的驻留情况
首先绑定该纹理(激活),然后以参数 GL_TEXTURE_RESIDENT调用函数glGetTexParameter*v()查 询
GL_LINEAR_MIPMAP_NEAREST
寻找最合适的一层mipmap,再应用GL_LINEAR规则进行加权 平均
GL_NEAREST_MIPMAP_LINEAR
寻找两层对应的mipmap,在每一层中应用GL_NEAREST规则寻 找合适的纹元,再对所得的两个值进行加权平均
GL_LINEAR_MIPMAP_LINEAR
对于非0的缩放因子k,齐次坐标表示同一点
(x,y,z,w)=k(x,y,z,w)
当w为0时,齐次坐标表示无穷远点
(x,y,z,w)→(x/w,y/w,z/w)
细节多层次(mipmap)
回顾纹理过滤
纹理图单元(纹元,texel)和屏幕像素单元 大小往往不是一对一的匹配
细节多层次(mipmap)
mipmap实际上就是预过滤,预先生成一批 由大到小的纹理图,根据物体所占像素的 大小,选择对应的纹理进行映射 又称为LoD(Level of Detail)技术
以GL_TEXTURE_PRIORITY为参数调用glTexParameter*()
OpenGL对相同优先级的纹理对象采用“最近最少使用 (LRU)”策略
驻留纹理
有效使用驻留纹理的一个方法
分析场景,估计场景要使用的纹理的大小; 使用glCopyTexImage2D函数创建若干“空”纹 理对象,直到显存全部被占满 ( glAreTexturesResident返回GL_FALSE) 往内存中调入纹理数据,同时,采用自己的 纹理调度策略,将硬盘中的纹理文件读入内 存。譬如,单独开启一条线程实时监测 采用glTexSubImage2D方法替换纹理内容
void glTexGen{ifd}(GLenum coord, GLenum pname, TYPE param)
coord -指定哪一个纹理坐标需要自动生成,GL_S, GL_T, GL_R, 或 GL_Q pname - 必须为GL_TEXTURE_GEN_MODE param - 为GL_OBJECT_LINEAR 或 GL_EYE_LINEAR,纹理坐标的生成方式
细节多层次(mipmap)
使用mipmap的几个要点
由大到小所有的纹理,其宽、高必须都满足2的幂次 从最大尺寸到最小尺寸(1×1)的所有纹理都必须给 出,不得遗漏,每一层次的宽高都相差2倍 各个尺寸的纹理都可以单独指定,相互之间可以完全 不相关 mipmap如何与物体关联,由OpenGL负责
细节多层次(mipmap)
三维投影空间中平面的坐标表示
π(a,b,c,d)
三维投影空间中点的坐标表示
X(x,y,z,w)
点到平面的距离
d=π•X=ax+by+cz+dw 当点X在平面π上时 ,d=0,即π•X=0
自动纹理坐标
物体上各点X到平面π的距离
如果平面π是相对于物体定义的,即π定义 在物体的坐标系中,那么,物体移动时,π 也移动,物体上各点相对于π的距离不变 如果平面π是相对于人眼定义的,即π定义 在人眼坐标系中,那么物体移动而人眼不动 时,π不动,物体上各点相对于π的距离发 生改变
纹理代理
程序示例
texprox\Debug\texprox.exe 查询内部格式是否为GL_RGBA8
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA8, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glGetTexLevelParameteriv(GL_PROXY_TEXTUR E_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);
自动纹理坐标
参考平面π的指定
void glTexGen{ifd}v(GLenum coord, GLenum pname, TYPE *param)
coord - 指定哪一个纹理坐标需要自动生成, GL_S, GL_T, GL_R, 或 GL_Q pname - 为GL_OBJECT_PLANE 或 GL_EYE_PLANE param - 定义π的四元数组(a,b,c,d)
坐标变换的常见方式:平移,旋转,缩放 每一种操作对应一个矩阵变换
纹理矩阵
空间坐标可以通过一系列操作来改变
glMatrixMode(GL_MODELVIEW); glRotated(...);
纹理坐标也可以通过相同的操作来改变
glMatrixMode(GL_TEXTURE); glRotated(...);
寻找两层对应的mipmap,在每一层中应用GL_LINEAR规则进 行加权平均,再对所得的两个值进行加权平均
mipmap下的过滤处理
GL_NEAREST,点采样 GL_LINEAR,双线性采样 GL_LINEAR_MIPMAP_LINEAR,三线性 采样
实际应用中的LoD
LoD最重要的是思想
实际应用时,常常采用自己实现的LoD技 术,而不使用OpenGL所缺省支持的
纹理代理
纹理的约束较多
宽高有限制、内部格式多变……
纹理代理
一种查询机制,精确的确定当前OpenGL是否 支持某种指定的纹理
纹理代理
复用glTexImage2D()函数
void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
驻留纹理
上述方法的效率体现在
将费时操作全部安排在初始化时进行,主要 是创建所有纹理对象 尽量使用高效的函数
glCopyTexImage2D比glTexImage2D效率高 glTexSubImage2D比重新创建纹理对象效率高
用户自定义的驻留机制一般要比OpenGL缺省 的有效
自动纹理坐标
预备知识
参数意义与glTexImage2D完全相同 如果width, height不是2的幂次,则 gluBuild2DMipmaps负责缩放
细节多层次(mipmap)
高级mipmap
OpenGL1.2及后续版本引进了若干其它 mipmap特性 课程内不予讨论,可参见相关文档,最权威 的是OpenGL specification
mipmap下的过滤处理
纹理放大(GL_TEXTURE_MAG_FILTER)
仅仅使用level为0的纹理
mipmap下的过滤处理
纹理缩小( GL_TEXTURE_MIN_FILTER )
指定过滤方式为GL_NEAREST或GL_LINEAR时,也 仅仅使用level为0的纹理 另有四种过滤方式,在mipmap层次中寻找合适的纹 元
实际应用中的LoD
一个自定义LoD的例子
定义各级纹理 管理内存,实施调度算法 各级不同层次的纹理之间的拼接
target - 设置为GL_PROXY_TEXTURE_2D pixels - 设置为NULL 其余参数设置为将要创建的纹理的相应值
纹理代理
查询纹理状态
void glGetTexLevelParameter{if}v(GLenum target, GLint level, GLenum pname, TYPE *params) 如果没有足够的资源创建所需纹理,则对应 状态变量的查询结果为0