二维纹理映射

二维纹理映射
二维纹理映射

二维纹理映射

一、实验目的和要求

掌握纹理映射的基本原理,利用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);

glEnable(GL_TEXTURE_2D);

glEnable(GL_TEXTURE_3D);

在启用纹理之后,需要建立物体表面上点与纹理空间的对应关系,即在绘制基本图元时,在glVertex 函数调用之前调用glTexCoord函数,明确指定当前顶点所对应的纹理坐标,例如:glBegin(GL_TRIANGLES);

glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);

glTexCoord2f(1.0, 1.0); glVertex2f(15.0, 15.0);

glTexCoord2f(1.0, 0.0); glVertex2f(30.0, 0.0);

glEnd();

其图元内部点的纹理坐标利用顶点处的纹理坐标采用线性插值的方法计算出来。

在OpenGL中,纹理坐标的范围被指定在[0,1]之间,而在使用映射函数进行纹理坐标计算时,有可能得到不在[0,1]之间的坐标。此时OpenGL有两种处理方式,一种是截断,另一种是重复,它们被称为环绕模式。在截断模式(GL_CLAMP)中,将大于1.0的纹理坐标设置为1.0,将小于0.0的纹理坐标设置为0.0。在重复模式(GL_REPEAT)中,如果纹理坐标不在[0,1]之间,则将纹理坐标值的整数部分舍弃,只使用小数部分,这样使纹理图像在物体表面重复出现。例如,使用下面的函数:glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

分别指定二维纹理中s坐标采用截断或重复处理方式。

另外,在变换和纹理映射后,屏幕上的一个像素可能对应纹理元素的一小部分(放大),也可能对应大量的处理元素(缩小)。在OpenGL中,允许指定多种方式来决定如何完成像素与纹理元素对应的计算方法(滤波)。比如,下面的函数可以指定放大和缩小的滤波方法:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

其中,glTexParameteri函数的第一个参数指定使用的是一维、二维或三维纹理;第二个参数为

GL_TEXTURE_MAG_FILTER或GL_TEXTURE_MIN_FILTER,指出要指定缩小还是放大滤波算法;最后一个参数指定滤波的方法。

补充:透视投影函数

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); 它也创建一个对称透视视景体,但它的参数定义于前面的不同。其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面的角度,范围是[0.0,180.0];参数aspect 是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。

三、实验内容

在OpenGL中纹理映射所使用的纹理数据,既可以是程序生成的一组数据,也可以从外部文件中直接读取,参考示范代码完成以下两项内容:

源码

(// cgtest.cpp : Defines the entry point for the console application.

//

// test.cpp : 定义控制台应用程序的入口点。

//

#include

#include "glut.h"

#include

#include

//这是一个点的类,用于存储其中点的坐标

class Point

{

public:

int x, y;

void setxy(int _x, int _y) {

x = _x;

y = _y;

}

};

//点的数量

static int POINTSNUM = 0;

//用于存储点的集合,因为绘制的都是4个点的贝塞尔曲线,所以数组大小为4 static Point points[4];

//初始化函数

void init(void)

{

glClearColor(1.0, 1.0, 1.0, 0); //设定背景为黑色

glColor3f(0.0, 0.0, 0.0); //绘图颜色为白色

glPointSize(2.0); //设定点的大小为2*2像素的

glMatrixMode(GL_PROJECTION); // 设定合适的矩阵

glLoadIdentity(); // 是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态

gluOrtho2D(0.0, 600.0, 0.0, 480.0); //平行投影,四个参数分别是x,y范围}

//绘制点

void setPoint(Point p) {

glBegin(GL_POINTS);

glVertex2f(p.x, p.y);

glEnd();

glFlush();

}

// 绘制直线

void setline(Point p1, Point p2) {

glBegin(GL_LINES);

glVertex2f(p1.x, p1.y);

glVertex2f(p2.x, p2.y);

glEnd();

glFlush();

}

// 绘制贝塞尔曲线

Point setBezier(Point p1, Point p2, Point p3, Point p4, double t) {

Point p;

double a1 = pow((1 - t), 3);

double a2 = pow((1 - t), 2) * 3 * t;

double a3 = 3 * t*t*(1 - t);

double a4 = t*t*t;

p.x = a1*p1.x + a2*p2.x + a3*p3.x + a4*p4.x;

p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;

return p;

}

//display函数

void display()

{

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

// 鼠标事件

void mymouseFunction(int button, int state, int x, int y) {

if (state == GLUT_DOWN) // 如果鼠标按下,不区分左右键的

{

points[POINTSNUM].setxy(x, 480 - y); // 这里求鼠标点的坐标的时候

// 设置点的颜色,绘制点

glColor3f(1.0, 0.0, 0.0);

setPoint(points[POINTSNUM]);

// 设置线的颜色,绘制线

glColor3f(1.0, 0.0, 0.0);

if (POINTSNUM > 0) setline(points[POINTSNUM - 1], points[POINTSNUM]);

//如果达到了4个绘制贝塞尔曲线,并在之后给计数器清零

if (POINTSNUM == 3) {

//绘制贝塞尔曲线

glColor3f(0.0, 0.0, 1.0); // 设定贝塞尔曲线的颜色

Point p_current = points[0]; //设为起点

for (double t = 0.0; t <= 1.0; t += 0.05)

{

Point P = setBezier(points[0], points[1], points[2], points[3], t);

setline(p_current, P);

p_current = P;

}

POINTSNUM = 0;

}

else {

POINTSNUM++;

}

}

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv); //固定格式

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //缓存模式

glutInitWindowSize(600, 480); //显示框的大小

glutInitWindowPosition(100, 100); //确定显示框左上角的位置

glutCreateWindow("");

init(); // 初始化

glutMouseFunc(mymouseFunction); // 添加鼠标事件

glutDisplayFunc(display); // 执行显示

glutMainLoop(); //进人GLUT事件处理循环

return 0;

}

五、运行截图

实验五 纹理映射实验

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

相关文档
最新文档