立方体纹理映射

立方体纹理映射
立方体纹理映射

立方体纹理映射

1问题描述与算法思想

1.1纹理映射简介

纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。

立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。

1.2实验目的

1) 掌握位图纹理读入方法;

2)掌握立方体纹理映射算法。

1.3功能要求

1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。

2)设置屏幕背景色为黑色。

3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。

4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。

5)使用键盘方向旋转纹理立方体。

6)使用动画按钮播放或停止立方体动画。

1.4算法原理(算法思想)

立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一

个纹理单元,纹理单元的索引将会传递给做涩琪。要绑定到一个纹理单元,先要将其激活,可以使用glActive Texture()函数。可以使用多个纹理单元,每个纹理单元可以绑定到相同的或者不同的纹理对象。只要纹理对象的类型不同,一个纹理单元可以绑定多个纹理对象。通过采样器变量来使用多个纹理。在片元着色器中,采样函数需要通过采样器变量访问变量来访问多个纹理单元。采样器对象与纹理对象不同。纹理对象中包含了纹理数据以及配置采样操作的参数,这些参数是采样状态额一部分。另外也可以创建一个采样对象,用采样状态参数配置它,并把它绑定到纹理单元中。这样,采样器对象会覆盖纹理对象中定义的采样状态。

2总体设计:功能类的结构设计

1)定义CFace类,将面片定点索引号和位图定点索引号绑定在一起,Normal为面片的法失量;

2)定义COLORREF类型的Image二维数组,用void CTestView::ReadImage(int nface)函数读入纹理图片;

3)void CTestView::ReadFace()定义面表,将四边形面片三维顶点的索引号和位图二维顶点的索引号对应起来;

4)void CTestView::DrawObject(CDC*pDC)绘制立方体,在绘制立方体之前先对立方体进行背面剔除以提高效率,绘制时先调用ReadImage()函数读入纹理,再调用ZBuffer类的SetPoint()函数绑定纹理,最后根据TextureMap()函数根据位图颜色绘制立方体的可见面;

5)在CZBuffer类中添加纹理映射函数TextureMap(),填充立方体每个可见面内部时,使用COLORREF类型的clr变量读出Image纹理数组对应点的颜色值进行绘制;

6)void CTestView::InitParameter(),透视变换参数初始化,设定用户坐标系的视点球坐标;

7)void CTestView::PerProject(CP3 P),进行透视变换。实现世界坐标系到观察坐标系的转换及屏幕坐标系到二维坐标系的转换;

8)void CTestView::OnLButtonDown(UINT nFlags, CPoint point),鼠标左键函数;void CTestView::OnRButtonDblClk(UINT nFlags, CPoint point),鼠标右键函数。点击鼠标左键使立方体缩小,点击右键使立方体增大;

9)void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags),键盘控制函数,点击键盘不同按键控制立方体的旋转;

10)void CTestView::ClearImaMem(),最终删除纹理对象。

3详细设计(流程图)

4源程序(核心功能程序)

4.1 绘制立方体

void CTestView::DrawObject(CDC* pDC)//绘制立方体

{

CPi3 Point[4];//面的顶点坐标

CP2 Texture[4];//面的纹理坐标

CZBuffer *zbuf=new CZBuffer;

zbuf->InitDeepBuffer(800,800,-1000);

for(int nFace=0;nFace<6;nFace++)

{

CVector VS(P[F[nFace].p[1]],ViewPoint);//面的视矢量

CVector

V01(P[F[nFace].p[0]],P[F[nFace].p[1]]);//面的一条边矢量

CVector

V12(P[F[nFace].p[1]],P[F[nFace].p[2]]);//面的另一条边矢量

CVector VN=V01*V12;//面的法矢量

if(Dot(VS,VN)>=0)//背面剔除

{

for(int

nEdge=0;nEdge

{

PerProject(P[F[nFace].p[nEdge]]);

Point[nEdge]=ScreenP;

Texture[nEdge]=F[nFace].t[nEdge];

}

ReadImage(nFace);

zbuf->SetPoint(Point,Texture,4);//初始化(绑定顶点和各个顶点的纹理坐标点)

zbuf->CreateBucket();//创建桶表

zbuf->CreateEdge();//创建边表

zbuf->TextureMap(pDC,Image);//纹理映射

zbuf->ClearMemory();

ClearImaMem();

}

}

delete zbuf;

}

4.2 读入图片

void CTestView::ReadImage(int nface)//读入图片

{

BYTE

Texture[]={IDB_FRONT,IDB_BACK,IDB_LEF

T,IDB_RIGHT,IDB_TOP,IDB_BOTTOM}; CBitmap NewBitmap;

NewBitmap.LoadBitmap(Texture[nface]);//调入位图资源

NewBitmap.GetBitmap(&bmp);//获得CBitmap的信息到Bitmap结构体中

int

nbytesize=(bmp.bmWidth*bmp.bmHeight*bmp .bmBitsPixel+7)/8;//获得位图的总字节数

im=new BYTE[nbytesize];//开辟装载位图的缓冲区

NewBitmap.GetBitmapBits(nbytesize,(LPVOI D)im);//将位图拷贝到缓冲区

Image=new COLORREF*[bmp.bmHeight];//建立二维颜色数组

for(int n1=0;n1

{

Image[n1]=new

COLORREF[bmp.bmWidth];

}

for(int n1=bmp.bmHeight-1;n1>=0;n1--)//位图高度

{

for(int n2=0;n2<=bmp.bmWidth-1;n2++)//位图宽度

{

int pos=n1*bmp.bmWidthBytes+4*n2;//位置

Image[n1][n2]=RGB(im[pos+2],im[pos+1],im[ pos]);

}

}

delete []im;

}

4.3 鼠标键盘操作函数

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)//鼠标左键函数

{

// TODO: Add your message handler code here and/or call default

R+=100;

Invalidate(FALSE);

CView::OnLButtonDown(nFlags, point);

}

void CTestView::OnRButtonDblClk(UINT nFlags, CPoint point)//鼠标右键函数

{

// TODO: Add your message handler code here and/or call default

R-=100;

Invalidate(FALSE);

CView::OnRButtonDblClk(nFlags, point);

}

void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

if(!Play)

{

switch(nChar)

{

case VK_UP:

afa=-5;

tran.RotateX(afa);

break;

case VK_DOWN:

afa=5;

tran.RotateX(afa);

break;

case VK_LEFT:

beta=-5;

tran.RotateY(beta);

break;

case VK_RIGHT:

beta=5;

tran.RotateY(beta);

break;

default:

break;

}

Invalidate(FALSE);

}

CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

5运行效果图

6结论与总结

这一次的课程设计我选的是立方体纹理映射,与以前上课时要求完成的作业有很大的区别,难度上提升了不少。上课时图形学实验作业的代码都是有实验参考书,但这次课程设计却是没有代码提示的,需要自己查询资料并结合自己的理解来一行行的敲代码。在敲代码的过程中自然是错误百出,无论是变量定义错误还是输入大小写错误或是标点符号输入错误都会导致最后的图形出不来。

此次写代码用的语言是C++,与此代码类似,编过相关类型的代码,也思考了实现相关功能的对应函数,并完整的实现过程序。在这个过程中,需要不

断地改进,不断地完善,调试,分析,和尝试,才能最终得出结果。而且复合基本要求,就要在设计过程中勇于探讨,勇于实践。当时是刚开始写这门科目的代码,一开始无从下手,直到查阅了很多资料,了解了一些相关知识,然后慢慢尝试。这次在以前的基础上增加了一些难度,虽然程序总体来说较复杂,因为要区分字母的大小写,还要区分标点符号,写的过程中容易出错,并充分使用所给的已知信息。如何通过空间模型来实现,如何使用函数来绘制模型的各个部分,并进行异常处理整个过程要足够的细心和耐心,但我相信,只要不断尝试,不断分析、改正,最终会的出结果。我认为,对于类似的实践性较强的科目,我们从书本上学到的东西是远远不够的,课本上只是讲了个大概思路,让我们对这门课有个基本的了解,而更多的是需要我们自己课外查资料来完善课本上不能学到的,具体操作需要我们课余时间抽空练习操作过程,从网上查阅相关资料。同时也培养了自己的自学能力和探索精神,学这门课,不仅需要足够的信心,还要有耐心,我相信,只要用心学,一定会不断地取得进步的。

实验五 纹理映射实验

实验五纹理映射实验 实验项目性质:设计性实验 所属课程名称: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,分别与一

计算机图形学课程设计--圆柱面图像纹理映射算法

计算机图形学课程设计--圆柱面图像纹理映射算法

《计算机图形学》 课程学习报告 项目题目:圆柱面图像纹理映射算法

目录 一、项目描述............................................................................... .. (1) 1.1圆柱面的建立和二维图像纹理的绑定 (1) 1.2坐标系的建立............................................................................... (1) 二、项目需求............................................................................... .. (1) 2.1 几何构造的原理............................................................................... . (1) 2.2、动画的设计 (2) 2.3 纹理的设计 (2) 2.3.1 纹理映射的原理 (2) 2.3.2 纹理定义 (2) 三、项目设计...............................................................................

(3) 3.1、窗口设计以及各项功能的实现 (3) 3.1.1 窗口设计函数 (3) 3.1.2 点表函数 (4) 3.1.3 面表函数 (4) 3.1.4 绘制圆柱函数 (6) 3.1.5 透视变换函数 (8) 3.1.6 读入纹理函数 (8) 3.1.7 背景函数 (9) 3.1.8 时间函数............................................................................... . (9) 3.1.9 动画控制函数............................................................................... .. (10) 四、项目效果............................................................................... (10) 4.1构造图形分析以及坐标系变换的效果.....................................错误!未定义书签。 五、项目总

实验六凹凸纹理映射技术样本

实验六: 凹凸纹理映射技术 一、实验目的 掌握凹凸纹理映射的原理, 熟悉Ogre中纹理映射的使用方法。 二、实验仪器 pc、 vs 三、实验原理及过程 1、网上检索凹凸纹理映射相关技术 凹凸纹理映射是一种纹理混合方法, 它能够创立三维物体复杂的纹理外观表面。普通的纹理映射只能模拟比较平滑的三维物体表面, 难以显示表面高低起伏、凹凸不平的效果。凹凸纹理映射能够经过一张表示物体表面凹凸程度的高度图( 称为凹凸纹理) , 对另一张表示物体表面环境映射的纹理图的纹理坐标进行相应的干扰, 经过干扰的纹理坐标将应用于环境映射,从而产生凹凸不平的显示效果。凹凸纹理映射一般由三张纹理映射图组成, 第一张纹理图表示物体表面原始纹理颜色, 第二张凹凸纹理图表示物体表面凹凸的高度起伏值, 用来对下一张环境纹理图坐标进行干扰, 第三张纹理图表示周围镜面反射或漫反射光照的环境光照映射图。让我们来看看一个粗糙的表面。 从远处看, 你判断这个物体是粗糙的的唯一证据是在它表面上下的亮度有改变。你的大脑能够获得这些亮暗不一的图案信息, 然后判断出它们是表面中有凹凸的部位。左边的一幅图就说明了这一点。你能够发现它是一个浮雕式的表面。一些矩型和字母被印入表面, 可是它们摸上去就像是一个隐藏的监控器的玻璃。如果这个图像是在适当的位置上, 那么它除了改变亮度, 不需要再做任何其它的工作。那么你可能会问: 我是怎么知道哪些点要亮, 哪些点要暗呢? 这不难。绝大多数人生活在这样一种环境下——这个环境的大多数光源来自上方( 译者注: 比如白天主要的光来自太阳, 夜晚主要的光来自天花板上的日光灯) 。因此向上倾的

地方就会更亮, 而向下倾的地方就会更暗。因此这种现象使你的眼睛看到一个物体上亮暗区域时, 能够判断出它的凹凸情况。相对亮的块被判断是面向上的, 相对暗的块被判断是面向下的。因此我只需要给物体上的线条简单得上色。如果你想要更多的证据, 这里还有一幅几乎相同的图, 不同于前的是它旋转了180度。因此它是前一幅图倒转的图像。那些先前看起来是凹进去的区域, 现在看起来是凸出来的了。 凹凸映射(凹凸纹理)Bump Mapping 这个时候你的大脑并没有被完全欺骗, 你脑中存留的视觉印象使你依然有能力判断出这是前一幅图, 只是它的光源变了, 是从小往上照的你的大脑可能强迫性地判断出它是第一幅图。事实上, 你只要始终盯着它, 而且努力地想像着光是从右下方向照射的, 你就会理解它是凹的( 译者注: 因为日常生活的习惯, 你会很容易把这些图形判断成凸出的图形, 可是因为有了上一幅对照图的印象, 你可能才会特别注意到这些图块其实还是凹入的, 只是判断方法不符合我们日常生活习惯, 因为这时大多数光不是从上方照射, 而是从下往上照射) 。凹凸纹理映射技术能够用来模拟粗糙物体表面凹凸不平的细节, 如: 橘子、草莓、树皮等。凹凸纹理映射最早只能用于离线绘制系统, 随着图形硬件的发展, 她已经成为游戏引擎中不可缺少的部分。最早的凹凸纹理映射使用一个高度图和曲面参数( 一般是纹理坐标) 的偏导数计算扰动后的法向。这个偏导数表明了物体表面改变的尺度。理论上, 凹凸映射中涉及的法向操作实在像素层次上的。 凹凸纹理映射的步骤如下: ( 1) 计算每个顶点处的T、 B、 N, 并计算切平面坐标的矩阵。 ( 2) 根据该矩阵将光源变换到切平面空间, 变换后光源的x、 y即顶点的相邻点。

计算机图形学大作业报告记录(灯光纹理映射)

计算机图形学大作业报告记录(灯光纹理映射)

————————————————————————————————作者:————————————————————————————————日期:

大作业报告 实验课程名称:计算机图形学 学生姓名: 班级: 学院(系):学生学号: 指导教师:成绩:

一、目的 这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。 二、主要功能模块设计 1 矩阵运算模块的设计: 功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。 代码设计: float vv(float * v1, float * v2){ return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; } void vxv(float * n, float * v1, float * v2){ n[0] = v1[1] * v2[2] - v1[2] * v2[1]; n[1] = v1[2] * v2[0] - v1[0] * v2[2]; n[2] = v1[0] * v2[1] - v1[1] * v2[0]; } void loadIdentity(Matrix m){ Matrix identity = {{1.0,0.0,0.0,0.0}, {0.0,1.0,0.0,0.0}, {0.0,0.0,1.0,0.0}, {0.0,0.0,0.0,1.0}}; for(int i = 0;i < 4; i++) for(int j = 0;j < 4; j++) m[i][j] = identity[i][j]; } void preMultiply(Matrix p, Matrix m){

简单二维纹理映射

#include #include #define imageWidth 64 #define imageHeight 64 GLubyte image[imageWidth][imageHeight][3]; /*绘制一个简单的二维纹理图*/ void makeImage(void) { int i,j,r,g,b; /*根据点的位置设置不同的颜色*/ for(i = 0;i < imageWidth;i++) { for(j = 0;j

立方体纹理映射

1问题描述与算法思想 1.1纹理映射简介 纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。 立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。 1.2实验目的 1) 掌握位图纹理读入方法; 2)掌握立方体纹理映射算法。 1.3功能要求 1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。 2)设置屏幕背景色为黑色。 3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。 4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。 5)使用键盘方向旋转纹理立方体。 6)使用动画按钮播放或停止立方体动画。 1.4算法原理(算法思想) 立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一个

二维纹理映射

二维纹理映射 一、实验目的和要求 掌握纹理映射的基本原理,利用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,分别与一维、二维和三维的纹理相对应。参数Level表示纹理多分辨率层数,通常取值为0,表示只有一种分辨率。参数components的可能取值为1~4的整数以及多种符号常量(如GL_RGBA),表示纹理元素中存储的哪些分量(RGBA颜色、深度等)在纹理映射中被使用,1表示使用R颜色分量,2表示使用R和A颜色分量,3表示使用RGB颜色分量,4表示使用RGBA颜色分量。参数width,height,depth分别指定纹理的宽度、高度、深度。参数format和type表示给出的图像数据的数据格式和数据类型,这两个参数的取值都是符号常量(比如format指定为GL_RGBA,type指定为GL_UNSIGNED_BYTE,参数texels指向内存中指定的纹理图像数据。 在定义了纹理之后,需要启用纹理的函数: glEnable(GL_TEXTURE_1D);

立方体纹理映射

立方体纹理映射

1问题描述与算法思想 1.1纹理映射简介 纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。 立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。 1.2实验目的 1) 掌握位图纹理读入方法; 2)掌握立方体纹理映射算法。 1.3功能要求 1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。 2)设置屏幕背景色为黑色。 3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。 4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。 5)使用键盘方向旋转纹理立方体。 6)使用动画按钮播放或停止立方体动画。 1.4算法原理(算法思想) 立方体进行纹理映射是纹理对象并不是直接绑定到着色器,而是绑定到一

纹理映射论文

对于纹理映射的学习报告 摘要: 本文主要对于2d纹理图的纹理映射方法展开描述。其中颜色纹理、几何纹理为两大讨论方向,对于颜色纹理的构造,我们通过函数纹理或图像纹理;对于几何纹理,我们可以通过凹凸映射法或位移映射法来实现。 正文: 在计算机图形学中,纹理映射技术的意义是非常重大的,对于纹理映射的定义,我在不同书本上看到了不同的描述,大致表述的内容却是大同小异的,比较容易理解的一种定义是“纹理映射是为三维物体表面添加纹理的技术”,纹理映射的过程可以表述为“将纹理空间的二维坐标(u,v)映射为物体空间的三维坐标(x,y,z),再进一步映射为图像空间的二维坐标(x,y)的过程”。通过纹理映射技术,我们可以改变物体表面的颜色、图案,增强立体感、真实感。原本死气沉沉的图形通过纹理映射处理瞬间像是一个真实的物体展现在你眼前。当然,其中过程处理的技术也是复杂多样的,大致来说,对于2d纹理图(纹理空间坐标是二维的)的纹理映射,主要有颜色纹理、几何纹理等。颜色纹理是通过颜色色彩或明暗度的变化体现出来的物体表面细节,取决于物体表面的光学属性;而几何纹理则是由不规则的细小凹凸构成的,取决于物体表面的微观几何形态。接下来我就对颜色纹理以及几何纹理做以展开。 首先,颜色纹理的出现是在1974年,由Catmull采用二维图像来定义物体表面材质的漫反射率而产生。实现颜色纹理主要有两种方法,一种是直接用纹理的颜色替代物体表面的颜色,另一种是将纹理数据经过光照计算,物体表面的纹理会显示出光照效果。颜色纹理并不 是简单的把图片覆盖住物体表面,这样会导致物体移动的时候,纹理图片没有移动而漂浮在原地,为了避免这种情况,我们还需要将颜色纹理绑定到物体表面,即建立物体空间坐标(x,y,z)与纹理空间坐标(u,v)之间的对应关系。颜色纹理本身难以构造,于是我们又采用函数纹理(连续纹理)或图像纹理(离散纹理)来进行描述。 通过函数纹理映射技术,我们先要计算出物体空间坐标与纹理空间坐标之间的关系函数表达式,例:P(x,y,z)=Au+Bv+C,这样就可以在纹理坐标上的每一点找

立方体纹理映射

立方体纹理映射. 1问题描述与算法思想 1.1纹理映射简介 纹理映射(Texture Mapping)是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。在三维图形中,纹理映射(Texture Mapping)的方法运用得 最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点

近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多边形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。还好,相关软件提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。 立方体映射(cube-map)纹理是一种特殊类型的纹理,用于环境映射,使用一组图像并把他们作为立方体的面。立方体映射的6个面用正方形并且大小相同的6个子纹理表示。要从立方体纹理中采样的时候,使用的纹理坐标是3维,并且 被看做来自原点的方向。方向指向用来读取纹理的立方体映射表面的位置。立方体纹理映射主要思想是通过观察向量和表面的法向量反射来确定采样的纹理坐标。 1.2实验目的 1) 掌握位图纹理读入方法; 2)掌握立方体纹理映射算法。 1.3功能要求 1)建立三维坐标系Oxyz,远点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。 2)设置屏幕背景色为黑色。 3)读入六张构成天空盒的位图作为纹理映射到立方体的可见表面上。 4)按下鼠标左键缩小立方体,按下鼠标右键增大立方体。 5)使用键盘方向旋转纹理立方体。 6)使用动画按钮播放或停止立方体动画。 1.4算法原理(算法思想)

计算机图形学实验三(纹理映射)

实验三纹理映射 一、实验目的 (1)掌握OpenGl的三维图形制作方法 (2)掌握Visual C++环境下的OpenGL图形开发 二、实验内容 在三维图像上添加纹理映射 三、实验结果 实验代码如下: /*********************************************** * glut_applicationwriten by yyb * ***********************************************/ #include #include #include #include #pragma comment(lib,"glaux.lib") #define MAX_TEXTURES 6 // max textures displayed /* creates a enum type for mouse buttons */ enum { BUTTON_LEFT = 0, BUTTON_RIGHT, BUTTON_LEFT_TRANSLATE, }; intmButton = -1; intmOldY, mOldX; boolfullscreen; //////////////////////////////////// float eye[3] = {0.0f, 0.0f, 7.0f}; float rot[3] = {45.0f, 45.0f, 0.0f}; constint ESC = 27; int wireframe = 0; constint GL_WIN_WIDTH = 640; constint GL_WIN_HEIGHT = 480; constint GL_WIN_INITIAL_X = 0; constint GL_WIN_INITIAL_Y = 0; /* array to hold texture handles */ GLuintg_TexturesArray[MAX_TEXTURES];

凹凸纹理映射

凹凸纹理映射 关于凹凸映射的原理请参阅凹凸映射(Bump Map)实现原理。 凹凸纹理映射是一种纹理混合方法,它可以创建三维物体复杂的纹理外观表面。普通的纹理映射只能模拟比较平滑的三维物体表面,难以显示表面高低起伏、凹凸不平的效果。凹凸纹理映射能够通过一张表示物体表面凹凸程度的高度图(称为凹凸纹理),对另一张表示物体表面环境映射的纹理图的纹理坐标进行相应的干扰,经过干扰的纹理坐标将应用于环境映射,从而产生凹凸不平的显示效果。凹凸纹理映射通常由三张纹理映射图组成,第一张纹理图表示物体表面原始纹理颜色,第二张凹凸纹理图表示物体表面凹凸的高度起伏值,用来对下一张环境纹理图坐标进行干扰,第三张纹理图表示周围镜面反射或漫反射光照的环境光照映射图。凹凸纹理映射的纹理映射流程如下图所示: 检查硬件设备 在使用凹凸纹理映射之前,应查询当前的Direct3D设备是否支持D3DTEXOPCAPS_BUMPEN VMAP或D3DTEXOPCAPS_BUMPENVMAPLUMINANCE多层纹理混合,以及当前设备是否支持3层纹理映射。 BOOL SupportsBumpMapping() {

通常情况下,可以载入一张表示物体表面图像高度的纹理图,通过计算高度图水平相邻和垂直相邻元素的高度差来生成凹凸纹理,也可以通过程序生成凹凸纹理,这里根据纹理图来生成凹凸纹理,代码如下: //-------------------------------------------------------------------------------------- // Create bump texture from height map texture. //-------------------------------------------------------------------------------------- HRESULT CreateBumpTexture(IDirect3DDevice9* device) { HRESULT hr; D3DSURFACE_DESC surface_desc; g_height_map_texture->GetLevelDesc(0, &surface_desc); V_RETURN(device->CreateTexture(surface_desc.Width, surface_desc.Height, 1, 0, D3DFMT_X8L8V8U8, D3DPOOL_MANAGED, &g_bum p_map_texture, NULL)); D3DLOCKED_RECT locked_rect; g_height_map_texture->LockRect(0, &locked_rect, NULL, 0);

球面纹理映射

The basis of this mapping technique is to treat the object as if it were a sphere, and mapping coordinates based by determining the position on a sphere by angular displacement. In this article we'll take a look at two forms of spherical mapping, one based on normals and another based on vertex position. Spherical Mapping with Normals The simplest method is to use the normal of each vertex, which is usually already pre-calculated for the purpose of lighting. Texture coordinates are generated based on the angle of the surface at each point. Values for the texture coordinates are calculated as follows: Written by Robert Dunlop Microsoft DirectX MVP When loading a mesh from a modeling package, texture mapping coordinates are usually included to indicate how a texture is applied to the mesh. However, when generating our own meshes, it will often be necessary to create texture coordinates based on the shape of the object. One such method for generating texture coordinates from geometry is known as The U coordinate is calculated from the X coordinate of the normal, which will vary from -1.0 to 1.0, representing the longitude of a corresponding point on a sphere. The value is calculated as follows:

相关文档
最新文档