CH07_纹理映射
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1CH07 纹理映射Texture Mapping
蔡兴泉
xingquancai@
Department of Digital Media, NCUT
Fall 2012
2
3Overview
☐7.1 引言☐7.2 位图操作☐7.3 像素图操作☐7.4 纹理映射☐7.5 纹理对象
☐7.6 纹理坐标自动生成☐
7.7 多重纹理
4
7.1 引言Introduction
5
引言
☐
现实世界中的物体,其表面通常有它的表面细节,即各种纹理。它可以是光滑表面的花纹、图案,也可以是粗糙的表面。
☐
表面纹理通常分成颜色纹理和几何纹理
–颜色纹理:
☐光滑表面的花纹、图案
☐如刨光的木材木纹表面、大理石表面、墙上的贴画等☐
通过颜色色彩或明暗度变化体现出来的表面细节–几何纹理:
☐是粗糙的表面
☐如桔子表面的褶皱表皮、高尔夫球面、混凝土墙面等☐由不规则的细小凹凸造成的
☐
基于物体表面的微观几何形状的表面纹理
6
引言
☐
纹理:
–物体表面的细小结构–用纹理映射方法解决
☐在纹理空间中uv 平面上,预先定义二维纹理☐映射到景物空间的三维物体表面
☐再进一步映射到图像空间的二维图像平面上☐
一般将两个映射合并为一个映射
78
纹理映射本质
☐
从一个坐标系到另一个坐标系的变换
9
几个定义
☐
纹理空间:
–纹理通常定义在二维空间(u,v)中的一个矩形区域–u ∈[0,1],v ∈[0,1]
☐
景物空间:
–在三维空间( x,y,z )中的曲面
–x ∈[Xmin,Xmax], y ∈[Ymin,Ymax], z ∈[Zmin,Zmax]–或二维参数空间中的一个矩形区域–
s ∈[0,1],t ∈[0,1]
☐
图像空间:
–依赖于显示器的分辨率
–例如,Nx ∈[0,1024],Ny ∈[0,768]–也是二维空间的一个矩形区域
10
纹理的定义
☐离散法☐连续函数法☐
参数法
11离散法
☐较为常用
☐
将纹理图像数据定义在一个二维数组中
–可以是各种图形或图像
☐方法灵活,修改也方便
☐
比较适合于交互式系统的纹理映射显示
12
连续函数法
☐定义在二维空间(u ∈[0,1],v ∈[0,1])的函数☐
实际应用中常采用一些特殊函数
–例如,下面的纹理函数可以模拟粗布纹理:–f(u,v)=A(cos(pu)+cos(qv))
–A 为[0,1]区域上的随机变量;p,q 为频率系数。
13参数法
☐用一些参数定义纹理模型☐可用文本性文件描述
☐
尤其适于构成一个场景的各景物定义各自的纹理模型
–例如室内布置中对沙发定义的纹理–对家具定义木纹纹理–对地面定义大理石纹理–
等
☐纹理使用时,由一个通用的解释程序对纹理先解释再映射☐
因此也可以称为过程式纹理定义
14
纹理的定义
☐离散法☐连续函数法☐
参数法☐
离散法最常用
15纹理映射过程
☐从纹理空间映射至物体表面☐
再按光照模型和插值算法绘制
☐或者先确定屏幕上某一像素点在物体表面☐
上的区域,映射回纹理空间再求取纹理值
16
纹理映射过程
☐把二维的纹理映射到三维的物体表面
☐
必须建立物体空间坐标(x,y,z)与纹理空间坐标(u,v)之间的对应
☐
这相当于物体表面进行参数化
17纹理与模型尺寸不等
☐
纹理值加权平均
–最近点采样:
☐只以区域中心点位置的纹理值作为平均值☐
这是最简单的处理方法
–双线性采样:
☐将区域四点顶点的纹理值作加权平均☐
速度较快且可以获得比较平滑的过渡–其它特定滤波器:
☐用专门设计的加权平均算法应用到整个区域☐
权值比重可以是钟形、金字塔形等
18
MipMap 图映射方法
☐存储不同分辨率的纹理在同一个文件中
☐
预先将纹理函数值按照不同的分辨率记录在纹理数组中,作为纹理查找表
☐
其中低分辨率的函数值由比它高一级分辨率的函数值取平均得到
19MipMap 图映射方法20
几何纹理
☐
几何纹理:
–为了给物体表面图象加上一个粗糙的外观,可以对物体的表面几何性质作微小的扰动来产生凹凸不平的细节效果,就是几何纹理的方法
21几何纹理分类:
☐
凹凸纹理:
–以纹理值作用到物体表面的法向量上影响纹理图案,产生凹凸纹理
☐
分形纹理:
–算法模型
–引入随机变量,通过递归模式对不规则景物几何纹理进行模拟
22
法向扰动法
☐
采用一个扰动函数对物体表面作微观形状扰动,由于扰动函数的幅度较小,因此不影响物体表面的整体形状
2324
7.2 位图操作
☐
void glRasterPos2i (int x, int y);
–在光栅(x,y)位置处设置属性
☐
void glBitmap(
–int width, int height, –float xorig, float yorig, –float xmove, float ymove,–
ubyte *bitmap
☐
);
–把位图拷贝到颜色缓冲区对应的光栅位置