《opengl计算机三维图形程序设计》纹理.pptx
纹理映射纹理映射纹理映射纹理映射纹理纹理(texturetexture)通常指物体的表面细节通常指物体的表面细节2 纹理映射纹理映射纹理映射技术给出了定义表面上任意点属性的纹理映射技术给出了定义表面上任意点属性的一种方式一种方式漫反射率漫反射率镜面反射率镜面反射率透明度透明度折射率折射率 3 纹理映射纹理映射两类最常使用的纹理两类最常使用的纹理颜色纹理颜色纹理几何纹理几何纹理4 颜色纹理颜色纹理确定表面上颜色纹理的两种方法确定表面上颜色纹理的两种方法预先建立表面的纹理模型预先建立表面的纹理模型纹理映射:建立表面上的每一点和一已知图像上的纹理映射:建立表面上的每一点和一已知图像上的点的对应关系,取图像上相应点的颜色值作为表面点的对应关系,取图像上相应点的颜色值作为表面上各点的颜色值上各点的颜色值5纹理映射纹理映射采用景物表面的参数化表采用景物表面的参数化表示来确立表面的纹理映射示来确立表面的纹理映射坐标,即可实现纹理图像坐标,即可实现纹理图像在景物表面的映射在景物表面的映射景物表面的参数化表示为景物表面的参数化表示为f f(u u,v v)纹理图像表示为纹理图像表示为T T(s s,t t)建立景物表面参数空间建立景物表面参数空间(u u,v v)和纹理图像参数空间(和纹理图像参数空间(s s,t t)之之间的一一对应关系间的一一对应关系6纹理映射纹理映射示例示例7几何纹理几何纹理凹凸映射(凹凸映射(bump mappingbump mapping)在不改变物体宏观几何的前提下,模拟物体表面粗糙的、在不改变物体宏观几何的前提下,模拟物体表面粗糙的、褶皱的、凹凸不平的光照效果褶皱的、凹凸不平的光照效果法向映射(法向映射(normal mappingnormal mapping)利用法向纹理保证高质量的表面细节复现利用法向纹理保证高质量的表面细节复现位移映射(位移映射(displacement mappingdisplacement mapping)利用纹理改变物体表面上点的几何位置,获得很强的深利用纹理改变物体表面上点的几何位置,获得很强的深度感和细节度感和细节 8几何纹理几何纹理法向映射(法向映射(Normal mappingNormal mapping)借助低精度模型和一个法向纹理,获得高精度模型借助低精度模型和一个法向纹理,获得高精度模型的绘制效果的绘制效果先计算高精度模型的法向,将其保存在法向纹理中,先计算高精度模型的法向,将其保存在法向纹理中,再将法向纹理映射到低精度模型上进行光照计算再将法向纹理映射到低精度模型上进行光照计算9几何纹理几何纹理位移映射(位移映射(displacement mappingdisplacement mapping)依据与表面上点所对应的纹理值,沿表面法向偏移依据与表面上点所对应的纹理值,沿表面法向偏移该点的几何位置该点的几何位置能产生很强的深度感能产生很强的深度感自遮挡自遮挡自阴影自阴影轮廓轮廓计算代价大计算代价大与凹凸映射、法向映射相比与凹凸映射、法向映射相比10凹凸映射凹凸映射思想思想在应用光照明模型计算景物表面光亮度时,对景物表面在应用光照明模型计算景物表面光亮度时,对景物表面法向进行微小的扰动法向进行微小的扰动方法方法物体表面物体表面S由参数方程由参数方程S=S(u,v)表示表示S上的任意一点上的任意一点(u,v)的法向的法向n=SuSv沿着表面沿着表面S的法线方向叠加一个微小的扰动量的法线方向叠加一个微小的扰动量P(u,v)定定义了一张新的表面义了一张新的表面S11凹凸映射凹凸映射方法方法(cont.)(cont.)新表面的法向可用新表面的法向可用 n=SuSv 计算计算在计算表面在计算表面S的光亮度时,取新表面的法向量的光亮度时,取新表面的法向量n取代取代原光滑表面法向量原光滑表面法向量n,生成物体表面的凹凸效果,生成物体表面的凹凸效果扰动函数扰动函数P(u,v)既可解析定义,也可通过二维图像既可解析定义,也可通过二维图像定义定义12凹凸映射凹凸映射示例示例13凹凸映射凹凸映射示例示例14纹理反走样纹理反走样纹理纹理走样示例走样示例15纹理反走样纹理反走样纹理纹理走样原因走样原因16纹理反走样纹理反走样常用纹理反走样方法常用纹理反走样方法前置滤波方法前置滤波方法超采样方法超采样方法MipmapMipmap方法方法17纹理反走样纹理反走样前置滤波方法前置滤波方法确定屏幕像素确定屏幕像素P P上可见的景物表面区域上可见的景物表面区域A A将区域将区域A A直接映射到纹理空间区域直接映射到纹理空间区域T T取区域取区域T T内的所有纹理像素颜色值的平均作为景物表内的所有纹理像素颜色值的平均作为景物表面区域面区域A A的平均纹理颜色的平均纹理颜色代入光照明模型,计算出代入光照明模型,计算出 像素像素P P应显示的光亮度值应显示的光亮度值18前置滤波纹理反走样纹理反走样前置滤波效果前置滤波效果19前置滤波走样纹理反走样纹理反走样超采样方法超采样方法将屏幕像素将屏幕像素P P的四个角点分别映射到纹理空间,得到的四个角点分别映射到纹理空间,得到四个纹理像素值四个纹理像素值将将上述上述四个纹理颜色值取平均作为像素四个纹理颜色值取平均作为像素P P所对应的可所对应的可见表面区域的纹理颜色见表面区域的纹理颜色20超采样纹理反走样纹理反走样超采样方法效果超采样方法效果21超采样走样纹理反走样纹理反走样MipmapMipmap方法方法MIPMIP来源于来源于 拉丁语拉丁语“multum in parvomultum in parvo”,意为,意为“many many things in a small placethings in a small place”目前应用最广的纹理反走样算法之一目前应用最广的纹理反走样算法之一通过预先计算并存贮原始通过预先计算并存贮原始 纹理图像的一组多分辨率纹理图像的一组多分辨率 版本,能显著地节省纹理版本,能显著地节省纹理 反走样的计算量反走样的计算量22Mipmap方法方法预处理:生成一个由不同分辨率图像构成的纹预处理:生成一个由不同分辨率图像构成的纹理图像序列理图像序列从原始纹理图像出发,生成一个其分辨率为原始图从原始纹理图像出发,生成一个其分辨率为原始图像像1/41/4的新的纹理图像版本的新的纹理图像版本新版本中的每一个像素值取为原始图像中相对应的四个像新版本中的每一个像素值取为原始图像中相对应的四个像素颜色值的平均素颜色值的平均类似地基于所得到的新纹理图像版本生成一个更低类似地基于所得到的新纹理图像版本生成一个更低分辨率的、尺寸更小的纹理图像版本分辨率的、尺寸更小的纹理图像版本这一过程一直持续到最后生成的纹理图像仅包含一这一过程一直持续到最后生成的纹理图像仅包含一个像素为止个像素为止23Mipmap方法方法预处理预处理24Mipmap方法方法映射阶段映射阶段屏幕上的每一像素内的可见表面区域被映射到原始屏幕上的每一像素内的可见表面区域被映射到原始纹理图像上的一块区域纹理图像上的一块区域估计该区域所覆盖的原始纹理图像中像素的个数并估计该区域所覆盖的原始纹理图像中像素的个数并以此作为选取适当分辨度的纹理图像版本的一种测以此作为选取适当分辨度的纹理图像版本的一种测度度25Mipmap方法方法映射阶段(映射阶段(cont.)cont.)从预先构造的纹理图像序列中找出其压缩率最接近从预先构造的纹理图像序列中找出其压缩率最接近当前纹理像素与屏幕像素比率的两个纹理图像当前纹理像素与屏幕像素比率的两个纹理图像在相邻分辨率的两纹理图像上计算当前屏幕像素映在相邻分辨率的两纹理图像上计算当前屏幕像素映射点的纹理颜色值射点的纹理颜色值根据两纹理图像对原始图像的压缩率在所得到的两根据两纹理图像对原始图像的压缩率在所得到的两个纹理颜色值间取加权平均,作为当前屏幕像素可个纹理颜色值间取加权平均,作为当前屏幕像素可见表面区域的颜色值见表面区域的颜色值26Mipmap方法方法映射阶段(映射阶段(cont.)cont.)27Mipmap效果效果28无Mipmap 有Mipmap纹理反走样效果对比纹理反走样效果对比29纹理映射实例程序纹理映射实例程序利用利用OpenGL实现纹理映射的三个主要步骤实现纹理映射的三个主要步骤生成纹理数据生成纹理数据将纹理数据载入纹理内存将纹理数据载入纹理内存将纹理数据映射到物体表面将纹理数据映射到物体表面30纹理映射实例程序纹理映射实例程序讲解光盘中所附的程序讲解光盘中所附的程序31DEMO纹理映射实例程序纹理映射实例程序Step1Step1:生成纹理数据:生成纹理数据32void glInit(void)if(!loadTGA(texture.tga,13)printf(texture.tga not found!n);int loadTGA(char*name,int id)unsigned char*imageData=NULL;.imageData=(unsigned char*)getData(s,size,imageBits);/*no image data*/if(imageData=NULL)returnError(s,TGA_BAD_DATA);.纹理映射实例程序纹理映射实例程序Step2Step2:将纹理数据载入纹理内存将纹理数据载入纹理内存33int loadTGA(char*name,int id)glBindTexture(GL_TEXTURE_2D,id);glPixelStorei(GL_UNPACK_ALIGNMENT,1);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);glTexImage2D(GL_TEXTURE_2D,0,texFormat,imageWidth,imageHeight,0,texFormat,GL_UNSIGNED_BYTE,imageData);.纹理映射实例程序纹理映射实例程序Step3Step3:将纹理数据映射到物体表面将纹理数据映射到物体表面34void drawFace(void)glEnable(GL_TEXTURE_2D);/*enable texture mapping*/glBindTexture(GL_TEXTURE_2D,13);/*bind to our texture,has id of 13*/glBegin(GL_QUADS);glTexCoord2f(0.2f,0.2f);/*lower left corner of image*/glVertex3f(-10.0f,-10.0f,0.0f);glTexCoord2f(0.6f,0.2f);/*lower right corner of image*/glVertex3f(10.0f,-10.0f,0.0f);glTexCoord2f(0.6f,0.6f);/*upper right corner of image*/glVertex3f(10.0f,10.0f,0.0f);glTexCoord2f(0.2f,0.6f);/*upper left corner of image*/glVertex3f(-10.0f,10.0f,0.0f);glEnd();glDisable(GL_TEXTURE_2D);/*disable texture mapping*/纹理映射实例程序纹理映射实例程序结果结果35纹理初步纹理初步Checker.c