OpenGL参数曲面纹理映射的实现

OpenGL参数曲面纹理映射的实现
OpenGL参数曲面纹理映射的实现

的1.0。8坐标的范围为从+Y轴的0.0处开始,到+X轴的0.25,再到一y轴的0.5,再到一X轴的0.75,最后返回到+Y轴的1.0处。如图2,就是利用Opengl中由二次工具生成的纹理坐标的圆柱面的纹理映射。

图2圆柱面纹理映射

3.NURBS曲面纹理映射

(1)NURBS曲线的定义

NURBS曲线为一分段的有理多项式函数,其表达式5为:…

∑B“(u)EK

P(1‘)=上0_——一

∑B“(u)E

i=0

(5)

式中K为控制点,职为权因子,B“(u)为||}次日样条基函数,由递推公式定义为式6:

蹦Ⅱ):f㈠t辄引M

L0others

删加掣+虹掣(6)

(t。.I≤址≤t。+I,k>O)

式(6)中k为幂次,‰(i=0,1,…,m)为节点,形成节点矢量U=[U0,“l’.”,u。]。当节点数为m+1,控制点数为n+l,幂次为k时,有关系式ltn=Ⅱ+1。

(2)NURBS曲面的定义

NUP,BS曲面定义如下:

∑∑Bi.。(“)B(”)』.1职JKJ

P(u,∥)=上¥专—————一u,”∈[o,1](7)∑∑Bi.。(“)曰(叱吒

式(7)中KJ为控制点,职J为权因子,Bu(H),易.。(u)分别为沿“向的k次和沿”向的t次B样条基函数。

(3)OPENGL中曲面纹理映射的实现

在OpenGL中,为了绘制一条样条曲线或曲面必须先定义求值器,才能计算曲线上点的坐标并完成绘制。对于样条曲线,OpenGL使用一维基函数,并且只使用如下形式的多项式:【40

研(n)=f?k1一“)州,f=0,…?,n(8)多项式(8)称为n次或/7,+1阶Bezier多项式。

设Pj表示控制点,则

c(u)=∑87(u)P,(9)这样,C(u)就是样条曲线的求值器。u的取值范围为[0,1]。如果u的取值范围为[u。%],则求值器为?36?

c伫二丝1(10)

、%一Ul/

对于曲面,求值器除了使用两个参数u和”外,其余与一维求值器基本相同。二维求值器的数学表达是:

s(u,”)=∑∑研(u)掣(。)岛(11)

12UJ2U

其中P。是m×n个控制点,基函数研和砑与一维求值器的基函数相同。

定义二维求值器的函数是:voidglMap2{fd}(GLenumtarget,TYPEul,TYPEu2,Glintustride,GIintuorder,TYPEvl,TYPEv2,Glintvxtride,Glintvorder,constTYPE●points);

参数target指定控制点的类型。控制点可以是物体的顶点,也可以是RGBA颜色、法线矢量或纹理坐标。

参数ul、u2和v1、v2指定U和v的取值范围。ustride和vstride分别表示跨度,即每个控制点数组中顶点之间单精度或双精度浮点数的个数。uorder和vorder分别是基函数的阶。points为指向控制点数组的指针。

利用void0EvalCoord2{fd}[v](TYPEU,姗v)函数计算曲面上一个顶点的坐标,并将此坐标设置为该顶点的当前坐标。参数u、v分别为各自定义域中的一个值。这里的坐标可以是顶点坐标,也可以是颜色、法线或是纹理坐标。对于二维情况,可以利用函数glMapGrid2幸()定义一个二维网格,自动生成等间隔的坐标值。而函数glEvalMesh?2()函数将二维网格映射到所有求值器。

如图3所示,就是利用以上函数给定一定的控制点绘制NURBS曲面的纹理映射。

图3NURBS曲面纹理映射

4.总结

本文基于VC++编程环境,利用OpenGL函数库实现对常用简单曲面和NURBS曲面的纹理映射。文章对曲面纹理映射的实现做的研究,为实现更为复杂的曲面纹理映射工作具有一定参考价值。

参考文献:

[1]彭群生.计算机真实感图形学算法基础[M].机械工业出版社。1999.

[2]RichardS.Wright,Jr.MichaelSweet.OpenGL超级宝典[M].潇湘工作室译.人民邮电出版社.2001.

[3]孙家广等.计算机图形学(第三版)[M].清华大学出版社.1998.

[4]费广正,乔林.VisualC++6.0高级编程技术一OpenGL篇[M].中国铁道出版社.2000.

【责任编辑马太来】

opengl机器人纹理

opengl 机器人纹理 #include <glut.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; //是否停止转动 bool IsStop=false; //光照使用光源 GLfloat lightPos[] = { 1.0f, 0.0f, -1.0f, 0.0f }; GLfloat specular[] = { 1.0f, 1.0f, 1.0f, -1.0f};//反射光 GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };//a GLfloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f};//环绕光GLfloat spotDir[] = { 0.0f, 0.0f, -1.0f }; GLboolean bEdgeFlag = TRUE; void showText(void); void resetPerspectiveProjection() ; void setOrthographicProjection() ; void Something(); void renderBitmapString(float x, float y, void *font,char *string); //设置背景 void SetupRC(void) { glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,lightPos); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,30.0f); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0f);

二维纹理映射

二维纹理映射 一、实验目的和要求 掌握纹理映射的基本原理,利用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);

纹理映射论文

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

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

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

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

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

一、目的 这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。 二、主要功能模块设计 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){

opengl纹理

OpenGL可以把纹理映射到指定的图形的表面上。简单一点的,就是给平面映射纹理,比如一个四边形,一个长方体的6个面,都 关于将一个位图作为纹理映射到某个或者多个面上,可以学习Jeff Molofee的OpenGL系列 对于指定的多个纹理,要根据自己的需要映射到不同的面上,需要对位图创建一个数组,用来存储位图的名称,然后在初始化Op 成多个纹理存储到一个纹理数组中,接着就可以指定绘制的某个面,对该指定的面进行纹理 下面,在的Jeff Molofee教程的第六课的基础上,实现对6个面分别进行不同的纹理映射 准备工作就是制作6幅不同的位图,如图所示: 关键代码及其说明如下。 创建全局纹理数组 GLuint texture[6]; // 创建一个全局的纹理数组,用来存储将位图转换之后得到的纹理,对应于立方 加载位图文件 加载位图,也就是把位图读取到内存空间,实现纹理的创建,加载位图的函数说明一下 AUX_RGBImageRec *LoadBMP(char *Filename) // 根据位图文件的名称进行加载 {

FILE *File=NULL; // 文件指针 if (!Filename) // 如果没有指定位图文件名称就返回NULL { return NULL; } File=fopen(Filename,"r"); // 根据指定的位图文件名称,打开该位图文件 if (File) // 如果位图文件存在 { fclose(File); // 因为只是需要判断问题是否存在,而不需要对位图文件进行写操作,所以关闭位return auxDIBImageLoad(Filename); // 其实,只需要一个真正存在的位图文件的名称,实现加载位图文 } return NULL; // 位图文件加载失败就返回NULL } 上面实现加载位图的函数中,AUX_RGBImageRec是glaux.h中定义的类型,该类型的定义如下 /* ** RGB Image Structure */ typedef struct _AUX_RGBImageRec { GLint sizeX, sizeY; unsigned char *data; } AUX_RGBImageRec; 首先,AUX_RGBImageRec类型是一个RGB图像结构类型。该结构定义了三个成员: sizeX ——图像的宽度; sizeY ——图像的高度; data; ——图形所包含的数据,其实也就是该图形在内存中的像素数据的一个指针。 AUX_RGBImageRec类型的变量描述了一幅图像的特征。 上述函数中,调用了glaux.h库文件中的auxDIBImageLoad函数,其实它是一个宏,函数原型为auxRGBImageLoadW(LPCWSTR 在该库文件中找到它的定义,如下所示: /* AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR); */ #ifdef UNICODE #define auxRGBImageLoad auxRGBImageLoadW #else #define auxRGBImageLoad auxRGBImageLoadA

实验三基于OpenGL的圆柱绘制OpenGL纹理光照课件资料

实验三基于OpenGL的圆柱绘制 1. 实验目的 通过圆柱的绘制,掌握OpenGL编程环境的设置,基本图元的使用,光照的设置以及纹理的设置,理解曲面绘制的基本原理。 2. 实验内容 (1)设置OpenGL编程环境; (2)利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱; (3)设置光照 (4)设置纹理:在圆柱的侧面上显示一张图片 3.主要问题&结果截图 ①如何绘制圆柱? 一种方法是调用gluc中的函数gluCylinder 但本实验要求利用三角形和四边形等基本图元绘制 所以这里主要采用类似微积分的方式绘制,就是将椭圆的侧面用多个四边形,底面用多个三角形来表示 关键代码 void Circle()底面的圆形void Cylinder()圆柱的侧面 glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串 glVertex3f(0.0f, 0.0f, 0.0f);//圆心:这是三角形作为圆心的顶点 int i = 0; for (i = 0; i <= 360; i += 15) glBegin(GL_QUAD_STRIP);//连续填充四边形串int i = 0; for (i = 0; i <= 360; i += 15) { float p = i * 3.14 / 180; glTexCoord2f(p/10,0.1f);

{ float p = i * 3.14 / 180; glVertex3f(sin(p), cos(p), 0.0f);//圆周:这是三角形作为扇形弧端点的顶点(p的值取0-2PI)就能画出一个类似圆形 } glEnd(); glVertex3f(sin(p), cos(p), 1.0f);//这个1.0f 指定的是高度 glTexCoord2f(p/10,0.0f); glVertex3f(sin(p), cos(p), 0.0f); } glEnd(); 效果: 再调用画圆形的函数画上两个底面 Circle(); glTranslatef(0, 0, 1);//设定高度为1,画 上底面 Circle(); 效果: ②如何纹理贴图? 关键代码:

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

实验三纹理映射 一、实验目的 (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];

OpenGL完全教程 第六章 纹理贴图

OpenGL完全教程 第六章 纹理贴图 作者:何咏 日期:2006-2-3 20:56:39 点击:4719 如需转载本文,请声明作者及出处。 第六章 纹理贴图 截至目前为止,我们已经能够绘制各种3D物体,并为它们增加光照效果,使它们更具有立体感。但是,在实际运用中,我们不仅仅需要简单地绘制一个物体的轮廓,我们需要绘制蓝天白云、真实的墙壁和物体、人物和树木。要达到这一目的,简单的将模型的轮廓绘制出来时远远不够的。我们需要使用纹理贴图来再现真实的细节。 在计算机硬件高速发展的今天,即使是最低端的显卡也能很快地处理大量的纹理,满足我们的需求。这些条件可以让我们毫无顾虑的使用OpenGL的纹理贴图功能,绘制出形形色色的物体。 本章将是学习OpenGL的最后一个基础章节。本章之后,我们将开始接触一些OpenGL的高级专题 学习本章内容,你将了解: ?什么是纹理贴图 ?如何创建纹理图像 ?OpenGL中贴图的方式 ?使用纹理对象来管理的纹理 ?将纹理运用到图元上 ?自动生成纹理坐标 ?多贴图纹理 6.0 准备工作 由于Delphi为我们所提供的OpenGL头文件是OpenGL1.0版本的,因此里面缺少一些函数的声明,这导致我们不能使用直接调用这些函数。因此我们要手动为OpenGL库添加下面的代码一进行补完: procedure glBindTexture(target: GLEnum; texture: GLuint); stdcall; external opengl32; procedure glDeleteTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32; procedure glGenTextures(n: GLsizei; textures: PGLuint); stdcall; external opengl32; function glIsTexture(texture: GLuint): GLboolean; stdcall; external opengl32; procedure glPolygonOffset(factor, units: GLfloat); stdcall; external opengl32; function gluBuild2DMipmaps(target: GLEnum; components, width, height: GLint; format, atype: GLEnum;

相关文档
最新文档