5(3)_Texture Management and Rendering.ppt_第1页
5(3)_Texture Management and Rendering.ppt_第2页
5(3)_Texture Management and Rendering.ppt_第3页
5(3)_Texture Management and Rendering.ppt_第4页
5(3)_Texture Management and Rendering.ppt_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五讲(3),纹理管理与绘制,Introduction of Computer Graphics,肖双九 上海交通大学数字艺术实验室,本节内容,纹理管理 纹理合成与混合 多通路纹理绘制 多重纹理映射 纹理反走样技术 纹理动画,1 纹理管理,1.1 纹理内存 提供纹理数据快速调用 纹理加载 纹理绑定 纹理卸载,1 纹理管理,1.2 纹理控制 纹理缩放 纹理映射区域大于或小于原始纹理 点采样或箱式滤波 产生走样,1 纹理管理,1.2 纹理控制 重复纹理,1 纹理管理,1.2 纹理控制 箝位纹理,1 纹理管理,1.3 纹理缓冲 复杂系统需要使用的纹理数量巨大 纹理内存空间有限 纹理缓冲策略主要要考虑

2、速度与纹理内存空间的平衡问题 基本思路 使得加载的纹理尽量小 用小的纹理通过平铺Tiling或者镶嵌Mosaicing组合成大的纹理 将原始纹理进行分级细化,0层纹理是分辨率最高的原始纹理,逐级缩小后得到多个细节层次的纹理.距离视点很远的物体,只需要加载很小的细节层次的纹理就可以了. 适时卸载应用频率最低的纹理,1 纹理管理,1.3 纹理缓冲 最近最少使用策略LRU Least Recently Used 纹理内存中所有纹理都给一个时间戳,用以标志上次被用来进行图形绘制的时间 当需要进行新的纹理加载时,首先将具有最早时间戳的纹理卸载 DirectX和OpenGL都允许为纹理设置优先级.当两个纹

3、理时间戳相同时,卸载优先级较低的纹理.,1 纹理管理,1.3 纹理缓冲 最近最常使用策略MRU Most Recently Used 纹理交换 采用LRU时,当卸载了某个纹理,而该纹理仍然在被当前画面使用,就会产生抖动(Thrashing)现象 因为LRU会在每帧画面中对每个纹理图像进行交换 避免纹理交换 对交换出缓冲器的纹理进行核查,是否正被应用于当前画面 如果是,采用MRU原则,直到在画面中没有纹理交换为止,1 纹理管理,1.3 纹理缓冲 固定比率纹理压缩 Fixed-rate Texture Compression 利用空闲时间对压缩纹理进行解码 较少的内存占用 提供有效的缓冲器大小 D

4、XTC 是DirectX中的一个TC标准,原是S3公司开发的S3TC 独立的编码片段 容易解码 速度快 给定特定的图像类型和分辨率,可预先知道压缩时所需要的空间大小,1 纹理管理,1.3 纹理缓冲 DXTC算法思想 将图像分为44大小的像素块,称为瓦片 对于没有alpha通道的图像,16个像素的瓦片将会被存储为两个颜色和16个两位二进制位 两个颜色是16位的-5位R,6位G,5位B 用以限制瓦片的颜色范围 再在这两个颜色之间求均匀分布的两个中间色 16个像素的颜色将在这四种颜色中选择,用2位二进制编码 因此,一个瓦片可以用64位来表示 假设原始图像是每像素24位,该方法可以实现6:1的压缩比,

5、1 纹理管理,1.3 纹理缓冲 DXTC算法缺陷 有损压缩 从压缩图像中无法恢复原始图像 一个瓦片中16个像素的颜色往往超过四种,此编码方式会导致信息丢失 颜色分布 用于一个瓦片中的颜色分布在RGB颜色空间的同一直线上,DXTC不能在同一瓦片中同时表示红色、绿色和蓝色 Ivanov等人提出Color Distrubution方法处理该问题,2 纹理合成与混合,随机纹理合成,2 纹理合成与混合,带约束的纹理合成,2 纹理合成与混合,Alpha贴图 利用纹理图像的Alpha通道将纹理与背景颜色混合贴花Decaling 将一个纹素的Alpha值设为0,就可将其变为透明 C=CB+(1- ) CT 可

6、将纹理的局部贴到图形表面,2 纹理合成与混合,Alpha贴图,3 多通道纹理映射,Multipass Texture Rendering 硬件在单通道中纹理数量有上限 单通道纹理中不能实现任意复杂度的光照模型 多通道同时计算光照纹理 例如:光照模型中的漫反射颜色通过纹理调制,而镜面高光进行不变操作,可以得到更加逼真的图像 利用通道一计算漫反射光照的贡献并进行插值,然后利用纹理进行调制 利用通道二计算高光并进行插值,再次绘制整个场景,将该结果添加到已经有漫反射的纹理图像中,3 多通道纹理映射,用以实现 运动模糊 景深 反走样 软阴影 平面反射 ,3 多通道纹理映射,多通道纹理映射方式 替代(Re

7、place) 贴花(Decal) 调制(Modulate) 纹理添加 将先前的像素颜色与片段颜色相加,或者相减 纹理混合 利用Alpha值将两个纹理的颜色进行混合,3 多通道纹理映射,Multipass Texture Rendering 例如一个多通道纹理映射的设计思路 (通道14: 累积凹凸纹理图) 通道5: 漫反射光照 通道6:基纹理(具有镜面反射分量) (通道7: 镜面反射) (通道8: 放射光照) (通道9: 大气效果) (通道10: 屏幕Flash),4 多重纹理映射,多重纹理映射 Multitexturing 在单通道中允许多个纹理混合 纹理混合层叠Texture Blendin

8、g Cascade 是一个纹理混合管线 由一系列纹理阶段构成 支持复杂的着色模型,4 多重纹理映射,多重纹理映射,插值之后的顶点值,多边形,4 多重纹理映射,多重纹理映射 将纹理A与纹理B依次应用到模型表面 结合多通道纹理,可以获得更复杂的纹理映射 例如 有ABCD四个纹理 完成一个AB+CD的着色模型 在第一个通道中将AB结合 在第二个通道中将CD结合,并将该结果增加到颜色缓存AB上,5 纹理反走样技术,5.1 走样 aliasing 由于低频采样(采样不充分)而造成的信息失真称为走样,5.1 走样,采样Sampling 用数字形式描述信息 对连续信号离散化 采样定理,5.1 走样,图形绘制

9、的走样 用离散量表示连续量,引起失真 只要有像素存在,必然存在走样,5.2 反走样,用于减少或消除走样效果的技术,称为反走样Anti-aliasing (AA) 反走样技术思路 把像素作为一个区域,对区域采样 增加采样密度,例如Supersampling 提高分辨率,5.2 反走样,图形绘制的反走样,5.2 反走样,纹理反走样,AA,no AA,2 直线反走样技术,2.1 简单的区域采样 基本思想 直线为宽度至少为1个像素 的长方形 像素的亮度与其落在直线 条内的面积成正比 面积为介于0和1之间的正数 面积乘以最大亮度值 即为该像素的显示亮度,2.1 简单的区域采样,几何意义 箱式滤波器 存在

10、问题 无论像素距离图形有多远,相同的 相交面积产生相同 的亮度,仍然会产生锯齿效应 直线上相邻像素有时会有较大的灰度差,2.2 加权区域采样,几何意义 圆锥滤波器 修改扫描转换算法进行反走样,3 FSAA,全屏反走样技术 Full-Scene Anti-Aliasing,FSAA 主要针对3D场景绘制 通过密集采样和滤波减少锯齿效应 与绘制对象无关 基本都是硬件实现,3 FSAA,全屏反走样技术 基本思想 对一个像素进行n次采样 像素颜色值p(x,y)是所有样本颜色值c(i,x,y)的加权平均。wi为权值。,3 FSAA,3.1 超采样 Supersampling 子像素Subpixel 场景

11、放大渲染 低分辨率显示 以处理速度为代价换取 图像质量的提升,3 FSAA,3.1 超采样,3 FSAA,3.1 超采样 OGSS RGSS,3 FSAA,3.5.1 OGSS Ordered Grid Super-Sampling 顺序栅格超采样,3 FSAA,3.5.1 OGSS,绘制结果,不同位置采样及滤波,3 FSAA,3.5.2 RGSS,近水平线的超采样及绘制结果,3 FSAA,3.5.2 RGSS Rotated Grid Super-Sampling 旋转栅格超采样,3 FSAA,OGSS,RGSS,3 FSAA,单点采样,12采样,21采样,22采样,RGSS,3 FSAA,

12、3.2 多级采样技术MSAA Multisampling 超采样的优化 与相邻像素关联,选择边缘像素进行处理,3 FSAA,3.2 多级采样技术 Quincunx采样 五点梅花形采样,3 FSAA,3.2 多级采样技术 Quincunx采样,3 FSAA,3.2 多级采样技术 质心反走样Centroid Anti-Aliasing,3 FSAA,3.2 多级采样技术 质心反走样Centroid Anti-Aliasing,3 FSAA,3.3 随机采样反走样 Jitter方法 随机分配采样点 用噪声代替重复的走样效果,3.3 随机采样反走样 Temporal Anti-Aliasing ATI

13、的 TAA,3 FSAA,3 FSAA,3 FSAA,3 FSAA,现有问题 性能影响 渲染速度问题 空间占用 时间占用 即使ATI的TAA在屏幕刷新频率低于60fps时会出现频闪,3 FSAA,现有问题 对象大小,3 FSAA,现有问题 角度的影响 近45度和135度的边界走样,3 FSAA,解决近45度问题 FLIPQUAD超采样,3 FSAA,解决近45度问题,近水平边,近45度角出现的“jerk”现象,No AA,3 FSAA,NVIDIA QUINCUNX,4级颜色梯度,但只有2级有效,“jerk”现象仍然存在,3 FSAA,FLIPQUAD,3级颜色梯度,都均匀起效,“jerk”现

14、象被消除,3 FSAA,FLIPQUAD超采样派生 FLIPTRI,5.25spp,1.5spp,1.5spp,*spp: samples per pixel,1.75spp,1.75spp,3 FSAA,其他反走样方法 Accumulation Buffer累积缓冲器反走样 对场景在不同位置进行多次采样(在x或y方向移动半个像素) 将不同采样图像送至累积缓冲器进行加合 在绘制时对图像进行平均 A缓冲器反走样 带有深度信息,允许多个片元贯通的情况 参考实时计算机图形学4.4节pp.49-59,4 纹理反走样技术,纹理缩放 纹理映射区域大于或小于原始纹理 产生走样 通过采样和滤波进行反走样,纹理

15、走样,SuperSampling反走样,4 纹理反走样技术,4.1 纹理放大滤波 4.5.1 点采样法 Nearest Neighbor 最邻近方法 滤波产生像素块 每个像素只需要提取一个纹素信息 放大和 缩小时出现严重走样,4 纹理反走样技术,4.1 纹理放大滤波 4.5.2双线性插值法 根据 4个相邻纹素 双线性插值 在对应纹理坐标(pu,pv)处的像素的颜色值为,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.1 基本思想 提高像素采样频率 但只能有限的增加采样频率 降低纹理采样频率,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.2 MipMapping 分级细分方法-原始纹理(0

16、层)的缩减采样Downsampling,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.2 MipMapping 根据三元组(u,v,d)访问分级细化金字塔 d值不是整数 可由d值所在位置的上下两层纹理对样本进行双线性插值,这个过程被称为三线性插值,d轴,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.2 MipMapping d值的计算 方法一:由像素区域对应的纹理单元的四边形长边近似 方法二:取四个微分值u/x, v/x, u/y, v/y中最大绝对值,像素空间,纹理空间,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.2 MipMapping 缺点 过模糊现象Overblurrin

17、g 当像素单元在u方向上覆盖了很多纹素,而在v方向上覆盖得很少,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.3 RipMapping 对MipMapping进行二维 扩展 RipMap纹理矩阵 用4个坐标(l,r,u,v)来访问 (l,r)是RipMap纹理矩阵中的 位置 (u,v)是子纹理的纹素位置 部分或全部结局过模糊问题,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.3 SAT Summed Area Table总面积表 创建一个与纹理等大的数组 计算纹理矩形区域的颜色平均值 作为像素的颜色值,像素空间,纹理空间,A,B,C,w,h,S,4 纹理反走样技术,4.2 纹理缩小滤波

18、 4.2.3 SAT 缺点 沿对角线产生模糊(RipMapping也有同样的问题) 颜色精度高,纹理内存占用大,4 纹理反走样技术,4 纹理反走样技术,4.2 纹理缩小滤波 4.2.4 Anisotropic Filtering 非限制性各向异性滤波 使用MipMapping金字塔 用纹理覆盖区域的短边确定d值 平行于长边生成一条各向异性直线Line of Anisotropy 在LA上多次采样,像素空间,纹理空间,5 OpenGL中的反走样,5.1 反走样步骤 激活反走样 glEnable(GL_POINT_SMOOTH); glEnable(GL_LINE_SMOOTH); glEnabl

19、e(GL_POLYGON_SMOOTH); 激活融合操作 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 选择反走样控制方式,5 OpenGL中的反走样,5.1 反走样控制方式 调用glHint()函数指定反走样执行方式 void glHint (GLenum target, GLenum hint);,5 OpenGL中的反走样,5.2 反走样控制方式 glHint()函数hint参数的可选值 GL_FASTEST 使用最快的计算方法,得到最高的执行效率 GL_NICEST 使用最精确的计算方法,得到

20、最佳的图象质量 GL_DONT_CARE 在图象质量和执行速度之间不进行选择,5 OpenGL中的反走样,5.3 反走样实例,/* antialiasing.cpp */ #include #include #include #include void myinit(void) GLfloat values2; glClearColor(0.0,0.0,0.0,0.0); glEnable(GL_LINE_SMOOTH); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_C

21、ARE); glLineWidth(2.5); glShadeModel(GL_SMOOTH); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); ,void display(void) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor4f(1.0,1.0,1.0,1.0); glutWireSphere(0.5,10.0,10.0); glFlush(); void myReshape(GLsizei w,GLsizei h) glViewport(0,0,w,h); glMat

22、rixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0,(GLfloat)w/(GLfloat)h,3.0,5.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0,0.0,-4.0); ,int main(int argc,char* argv) glutInit( ,6 纹理动画,纹理混合实现动画 从纹理A出发,逐渐衰减变换为纹理B 纹理图像不一定是静态的 纹理图像随时间变化 例如以视频源作为纹理,6 纹理动画,纹理坐标不一定是静态的 在画面间

23、改变纹理坐标 可对纹理坐标进行平移、缩放、旋转和剪切变换 变形变换和图像弯曲,附录 OpenGL中的纹理映射,1 OpenGL的纹理映射过程,定义纹理 指定纹理的应用方式 激活纹理映射 指定纹理坐标和几何坐标,绘制场景,2 定义纹理,纹理可以是一维、二维或三维的; 每个纹素的数据格式(由1至4个数值组成) 颜色索引值 GL_COLOR_INDEX RGB值 GL_RGB RGBA值 GL_RGBA R值 GL_RED G值 GL_GREEN B值 GL_BLUE Alpha值 GL_ALPHA 光照强度值 GL_LUMINANCE 光强Alpha值 GL_LUMINANCE_ALPHA,2 定

24、义纹理,多重纹理映射 为纹理定义多种分辨率; 在距离观察位置远时,映射低分辨率的纹理图像; 距离近时,映射高分辨率的纹理图像; 为纹理设置边界 实际应用中需要多种纹理拼接; 为纹理设置边界超出0.0,1.0 纹理参数范围的边界border, 通常为1个像素宽; 通过线性平均,实现纹理图像 间的光滑过渡。,2 定义纹理,定义一维纹理 纹理只在某一方向上变化,而在另一个方向上没有变化,相当于高度为1的二维纹理 使用glTexImage1D()函数定义一维纹理 函数原型 void glTexImage1D( GLenum target, GLint internalFormat, GLsizei w

25、idth, GLint border, GLenum format, GLenum type, const GLvoid *pixel),glTexImage1D()函数参数说明 target 必须设置为GL_TEXTURE_1D level 是使用多重纹理映射时的分辨率级数,若只有一个分辨率,该值为0 internalFormat 表明纹理映射方式,取值为14之间的整数值,或者是38个符号常量之一。 width 给定纹理尺寸,必须是2的幂次方2m(m为非负整数,如果有边界width 为2m+b ) border指定边界宽度b(为0或1) format 指定纹理的数据格式(如前,纹素的数据格式

26、) type 指定纹理的数据类型(见本页备注) pixel为纹理图像数组的指针,指定纹理图像及其边界,2 定义纹理,定义二维纹理 使用glTexImage2D()函数定义二维纹理 函数原型 void glTexImage2D( GLenum target, GLint internalFormat, GLsizei width, GLsizei heigth, GLint border, GLenum format, GLenum type, const GLvoid *pixel) 参数说明 target 必须设置为GL_TEXTURE_2D width和 heigth 给定二维纹理的尺寸,

27、必须为2m+2b( width和 heigth 可分别对应不同的m值) width和 heigth为0,纹理映射无效,2 定义纹理,定义三维纹理 使用glTexImage3D()函数定义三维纹理 函数原型 void glTexImage3D(GLenum target, GLint internalFormat, GLsizei width, GLsizei heigth , GLsizei depth, GLint border, GLenum format ,GLenum type, const GLvoid *texels) 参数说明 target 必须设置为GL_TEXTURE_3D

28、width 、 heigth 、depth给定三维纹理的尺寸,必须为2m+2b(三个参数可分别对应不同的m值) texels为三维纹理图像数组的指针,2 定义纹理,定义MIPMAP纹理映射 事先指定一系列分辨率逐渐减小的纹理图像; OpenGL会根据所映射的物体尺寸自动选择使用哪个分辨率的纹理图; 需要额外的计算,增加计算时间; 但可避免场景中小物体移动时纹理的闪烁,2 定义纹理,定义MIPMAP纹理映射 设置方法 在最大纹理尺寸和11纹理图之间提供所有尺寸的纹理图像; 纹理尺寸必须是2的幂次方; 例如 一个全分辨率的纹理为32 16,那么必须定义一组16 8、 84、 42、2 1、1 1分

29、辨率的纹理图,用glTexImage*()函数设置各级纹理的level、width、heigth、image参数,2 定义纹理,定义MIPMAP纹理映射 实例,glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,32,32,0,GL_RGBA,GL_UNSIGNED_BYTE,image0);,glTexImage2D(GL_TEXTURE_2D,1,GL_RGBA,16,16,0,GL_RGBA,GL_UNSIGNED_BYTE,image1);,glTexImage2D(GL_TEXTURE_2D,2,GL_RGBA,8,8,0,GL_RGBA,GL_UNSIGNED

30、_BYTE,image2);,glTexImage2D(GL_TEXTURE_2D,3,GL_RGBA,4,4,0,GL_RGBA,GL_UNSIGNED_BYTE,image3);,glTexImage2D(GL_TEXTURE_2D,4,GL_RGBA,2,2,0,GL_RGBA,GL_UNSIGNED_BYTE,image4);,glTexImage2D(GL_TEXTURE_2D,5,GL_RGBA,1,1,0,GL_RGBA,GL_UNSIGNED_BYTE,image5);,2 定义纹理,定义多重纹理映射 自动生成多重纹理图像 调用gluBuild*DMipmaps()函数 函数原

31、型 int gluBuild1DMipmaps(GLenum target, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixel); int gluBuild2DMipmaps( GLenum target, GLint internalFormat, GLsizei width, GLsizei heigth, GLint border, GLenum format, GLenum type, const GLvoid *pixel); 参数说明

32、参数与glTexImage1D()和glTexImage2D()的参数相同,2 定义纹理,纹理的创建 直接创建法 利用函数直接设置各像素点的RGB值 只能生成简单的有一定规律的纹理图像, 从帧缓存中读取 将纹理从当前GL_READ_BUFFER中读出来,并将像素放入纹理内存 调用函数glCopyTexImage1D()、 glCopyTexImage2D(),2 定义纹理,纹理的创建 调用库函数读取外部文件 OpenGL提供函数auxDIBImageLoad()函数读取纹理图像 函数原型 AUX_RGBImageRec auxDIBImageLoad (LPCTSTR filename); 参

33、数说明 filename是纹理图像文件的名称。 该函数可以读取bmp和rgb两种格式的文件。 AUX_RGBImageRec是一个定义纹理数据的结构,其中最主要的三个域是SizeX、SizeY和Data, SizeX和SizeY是纹理的宽和高,Data存储具体的纹理数据。,2 定义纹理,纹理的创建 读取外部文件 根据外部图像文件的具体格式,编写函数将纹理图像读入内存; 非bmp和rgb格式的图像文件,必须采用这种方式读入; 要求对图像文件的格式非常了解。,3 指定纹理映射方式,纹理映射方式 替换GL_REPLACE 将纹理作为不透明图像覆盖到片段 贴花 GL_DECAL 仅用于RGB和RGBA

34、两种内部格式,片段和纹理颜色混合的比例由纹理的Alpha值确定 调整GL_MODULATE 用纹理图像的颜色调整片段的颜色和或颜色比例,综合光照和纹理的效果 融合GL_BLEND 使用指定的颜色,响应光照条件,3 指定纹理映射方式,设置纹理映射方式 使用glTexEnv*()函数中的变量设置映射方式 函数原型 void glTexEnvif(GLenum target, GLenum pname, TYPE param); void glTexEnvifv(GLenum target, GLenum pname, TYPE *param); 参数说明 target变量必须为GL_TEXTURE

35、_ENV; pname和 param的对应取值,3 指定纹理映射方式,设置纹理映射方式 贴花、调整和融合函数,说明:下标t表示纹理值。下标f表示片段值,下标c表示GL_TEXTURE_ENV_ COLOR指定的值,无下标表示最终的计算值;C表示RGB颜色值,L表示 光照值;分量数是纹理定义函数glTexImage*D()函数中component参数设置的值,4 激活纹理映射,使用glEnable()和glDisable()函数打开和关闭纹理 glEnable(GL_TEXTURE_1D ); /打开一维纹理 glEnable(GL_TEXTURE_2D); /打开二维纹理 glEnable(G

36、L_TEXTURE_3D); /打开三维纹理 glDisable(GL_TEXTURE_1D); /关闭一维纹理 glDisable(GL_TEXTURE_2D); /关闭二维纹理 glDisable(GL_TEXTURE_3D ); /关闭三维纹理,5 计算纹理坐标,为顶点指定相应的纹理坐标,确定将纹理图像中的哪个纹素映射到该顶点; 与几何坐标的计算一样,纹理坐标也是在两顶点之间进行线性插值; 片元尺寸超过纹理尺寸范围时,可以设置纹理重复和箝位方式,用多个纹理光滑拼接映射到物体表面; 正方形片元的纹理坐标及映射,(0,0),(1,0),(1,1),(0,1),5 计算纹理坐标,调用glTex

37、Coord*()函数指定纹理坐标 函数原型 void glTexCoord1234sifd(TYPE coords); void glTexCoord1234vsifd(TYPE *coords); 参数说明 纹理坐标可由s,t,r,q表示,对应几何坐标x,y,z,w。一维纹理只使用s坐标,二维纹理使用s,t坐标。纹理坐标的 范围通常在0,1,也可以使用该范围以外的值; 参数coords即为纹理坐标数组; glTexCoord*()函数指定的纹理坐标对应其后glVertex*()函数指定的顶点,5 计算纹理坐标,glTexCoord*()函数应用实例 glBegin(); glNormal3d

38、(-5.0,0.0,0.0); glTexCoord2d(0.0, 0.0); glVertex3d(-5.0, -5.0, 0.0); glTexCoord2d(1.0, 0.0); glVertex3d(5.0, -5.0, 0.0); glTexCoord2d(1.0, 1.0); glVertex3d(5.0, 5.0, 0.0); glTexCoord2d(0.0, 1.0); glVertex3d(-5.0, 5.0, 0.0); glEnd();,5 计算纹理坐标,片元为任意形状时的纹理坐标,(0,0),(1,0),(1,1),(0,1),X,Y,自动计算纹理坐标 调用glTex

39、Gen*()函数 函数原型 void glTexGenifd(GLenum coord, GLenum pname, TYPE param); void glTexGenifdv(GLenum coord, GLenum pname, TYPE *param); 参数说明 coord必须为GL_S,GL_T,GL_R,GL_Q分别表示生成的是s,t,r,q坐标; pname可设置为GL_TEXTURE_GEN_MODE、GL_OBJECT_PLANE 或GL_EYE_PLANE param相对于 pname为GL_TEXTURE_GEN_MODE时,可以取GL_OBJECT_LINEAR、GL

40、_EYE_LINEAR、GL_SPHERE_MAP; 相对于 pname为GL_OBJECT_PLANE 或GL_EYE_PLANE时, param为一个参数数组,用以指定纹理生成。,5 计算纹理坐标,5 计算纹理坐标,使用纹理映射生成模型轮廓图,5 计算纹理坐标,环境映射 OpenGL环境映射算法是基于球面环境纹理; 根据在场景中拍摄的环境图片,生成环境纹理图; 指定GL_SPHERE_MAP常数为环境映射创建纹理坐标,并且要在s和t方向上都要指定此常数; OpenGL环境映射算法会通过计算将环境纹理中对应点的颜色绘制到物体上; 设置方法 glTexGeni(GL_S,GL_TEXTURE_

41、GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T);,5 计算纹理坐标,glPushMatrix(); /打开二维纹理 glEnable(GL_TEXTURE_2D); /启动环境纹理贴图: glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); /读取和定义球的纹理 SphereTexture(); /绘制球 glutSolidS

42、phere(1.9,50.0,50.0); glPopMatrix();,球面的纹理映射,纹理对象 创建纹理对象存储纹理数据,对纹理资源进行管理 支持纹理的快速重用 纹理对象的管理 生成纹理名称 将纹理对象绑定到纹理数据(包括图像数组和纹理属性) 在渲染纹理化模型时,重新绑定纹理对象 删除纹理对象,6 管理纹理,生成纹理名称 void glGenTextures(GLsizei n, Gluint *textureNames); 提供n个当前未被使用的纹理名称 纹理名称可以是任何非0的无符号整数 返回在由textureNames所指定的数组中 GLboolean glIsTexture(Glu

43、int textureName); 确定纹理名称textureName是否已被使用 若纹理名称textureName已经被glGenTextures()返回,但是还没有被绑定,会返回GL_FALSE 如果纹理名称textureName已经被绑定,还未被删除,则返回GL_TRUE,6 管理纹理,绑定纹理 void glBindTexture(GLenum target, Gluint textureName); 创建纹理对象,并使用纹理对象 当绑定了一个纹理对象textureName时,该纹理对象被创建,并且接下来的所有的纹理设置和操作函数调用都是针对该纹理对象的 当重新绑定纹理对象textureName时,其数据成为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论