opengl新手实验指导3

上传人:luoxia****01819 文档编号:47840854 上传时间:2018-07-05 格式:PDF 页数:36 大小:507.12KB
返回 下载 相关 举报
opengl新手实验指导3_第1页
第1页 / 共36页
opengl新手实验指导3_第2页
第2页 / 共36页
opengl新手实验指导3_第3页
第3页 / 共36页
opengl新手实验指导3_第4页
第4页 / 共36页
opengl新手实验指导3_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《opengl新手实验指导3》由会员分享,可在线阅读,更多相关《opengl新手实验指导3(36页珍藏版)》请在金锄头文库上搜索。

1、计算机科学与技术学院 static float x=0.0f, y=1.75f ,z=5.0f; static float lx=0.0f, ly=0.0f, lz=1.0f; static GLint snowman_display_list; 注意我们包含了 math.h 头文件。我们需要计算旋转角。上面变量的含义到后面你就会计算机科学与技术学院 ratio = 1.0f * w / h; / Reset the coordinate system before modifying glMatrixMode(GL_PROJECTION); glLoadIdentity(); /设置视口为整

2、个窗口大小 glViewport(0, 0, w, h); /设置可视空间 gluPerspective(45, ratio, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0f, 1.0f, 0.0f); 下面我们定义显示列表,绘制雪人,初始化场景,渲染场景。 void drawSnowMan() glColor3f(1.0f, 1.0f, 1.0f); / 画身体 计算机科学与技术学院 glutSolidSphere(0.75f, 20

3、, 20); / 画头 glTranslatef(0.0f, 1.0f, 0.0f); glutSolidSphere(0.25f, 20, 20); / 画眼睛 glPushMatrix(); glColor3f(0.0f, 0.0f, 0.0f); glTranslatef(0.05f, 0.10f, 0.18f); glutSolidSphere(0.05f, 10, 10); glTranslatef(0.1f, 0.0f, 0.0f); glutSolidSphere(0.05f, 10, 10); glPopMatrix(); / 画鼻子 glColor3f(1.0f, 0.5f

4、, 0.5f); glRotatef(0.0f,1.0f, 0.0f, 0.0f); glutSolidCone(0.08f, 0.5f, 10, 2); GLuint createDL() GLuint snowManDL; / 生成一个显示列表号 snowManDL = glGenLists(1); / 开始显示列表 glNewList(snowManDL, GL_COMPILE); / call the function that contains / the rendering commands drawSnowMan(); / endList glEndList(); return(

5、snowManDL); void initScene() glEnable(GL_DEPTH_TEST); snowman_display_list = createDL(); void renderScene(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 画了一个地面 glColor3f(0.9f, 0.9f, 0.9f); glBegin(GL_QUADS); glVertex3f(100.0f, 0.0f, 100.0f); glVertex3f(100.0f, 0.0f, 100.0f); glVertex3f(

6、100.0f, 0.0f, 100.0f); glVertex3f(100.0f, 0.0f, 100.0f); 计算机科学与技术学院 / 画了 36 个雪人 for(int i = 3; i biSizeImage); 计算机科学与技术学院 /确认读入成功 if(bitmapImage=NULL) /由于 bitmap 中保存的格式是 BGR,下面交换 R 和 B 的值,得到 RGB 格式 for(imageIdx=0; imageldxbiSizeImage; imageIdx += 3) temp=bitmapImageimageIdx; bitmapImageimageIdx=bitm

7、apImageimageIdx+2; bitmapImageimageIdx+2=tempRGB; /关闭 bitmap 图像文件 fclose(filePtr); return bitmapImage; (2)产生一个纹理标识符)产生一个纹理标识符 有了图像数据, 就可以开始创建纹理了。 首先, 需要通知 OpenGL, 为该纹理创建一个唯一的标识符(ID)。 /纹理标识符数组,保存两个纹理的标识符 unsigned int texture2; 函数 glGenTextures()可以一次生成多个纹理标识符。 /第一参数是需要生成标识符的个数 /第二参数是返回标识符的数组 glGenText

8、ures(2, texture); (3)选择当前的纹理)选择当前的纹理 由于可以同时使用多个纹理,需要使用函数 gl_BindTexture()指定当前使用的纹理,余下的操作将只应用于该纹理。 glBindTexture(GL_TEXTURE_2D, texture0); (4)指定纹理过滤方式)指定纹理过滤方式 在OpenGL使用当前纹理绘制时将使用指定的纹理过滤方式。 有两类过滤方式需要指定: 1)放大:当像素比对应纹理上的像素(texel)小时。 GL_NEAREST(没有过滤、点采样、取最近 texel 值); 计算机科学与技术学院 glTexParameteri(GL_TEXTUR

9、E_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); (5)从图像数据生成纹理)从图像数据生成纹理 下面将从 bitmap 文件中读出的图像文件交给 OpenGL 纹理,纹理数据在 OpenGL 内部保存(也可能保存在显卡上)。 GlTexImage2D(GL_TEXTURE_2D, 0, /mipmap 层次(通常为 0,表示最上层) GL_RGB, /希望该纹理有红、绿、蓝数据 bitmapInfoHeader.biWidth, /纹理宽带,必须是 2n,若有边框+2 bitmapInfoHeader.biHeight, /纹理高度,必须是 2n,若有边框+2

10、 0, /边框(0=无边框,1=有边框) 纹理 纹理放大 多边形 纹理缩小 纹理 多边形 计算机科学与技术学院 /bitmap 数据指针 如果使用了 mipmap,则需要对每个 mipmap 都调用一次上面的函数,并相应地改变mipmap 的层次数。 (6)打开纹理映射)打开纹理映射 在进行绘制前,需要打开纹理映射。 glEnable(GL_TEXTURE_2D); /打开 2D 纹理映射 (7)绘制场景)绘制场景 下面的代码创建一个四边形,并将该四边形的顶点与纹理的角点建立关联。 /从已转载纹理中选择当前纹理 glBindTexture(GL_TEXTURE_2D, texture1); /

11、将当前颜色设置为白色(重要),也可以试试设为红色效果 glColor3f(1.0f,1.0f,1.0f); /绘制四边形,并为每个顶点设定纹理坐标 glBegin(GL_QUADS) glTexCoord2i(1,1); glVertex3i(1,1,0); glTexCoord2i(1,0); glVertex3i(1,1,0); glTexCoord2i(0,0); glVertex3i(1,1,0); glTexCoord2i(0,1); glVertex3i(1,1,0); glEnd(); 2. 自动生成纹理坐标自动生成纹理坐标 在上面的实现中,可以注意到,为了实现纹理映射,需要为模

12、型的每个顶点都设置一个纹理坐标。而对于一个复杂的模型,这个过程可能非常困难,下面将讲解如何自动为顶点生成纹理坐标。 首先看下面的例子,它调用了函数 glTexGen(),并使用函数 glEnable()打开了模式GL_TEXTURE_GEN_S 和 GL_TEXTURE_GEN_T。 planeCoefficients=1, 0, 0, 0; glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); 计算机科学与技术学院 glEnable(GL_TEXTURE_GEN_S); glBegin(GL_QUADS); glVertex3f(3.

13、25, l, 0); glVertex3f(1.25, l, 0); glVertex3f(l.25, 1, 0); glVertex3f(3.25, 1, 0); glEnd(); 函数 glTexGen()的定义如下: void glTexGend(GLenum coord, GLenum pname, GLdouble param); void glTexGenf(GLenum coord, GLenum pname, GLfloat param); void glTexGeni(GLenum coord, GLenum pname, GLint param); /用于控制纹理坐标生成的

14、方式 /参数: /coord:指定一类纹理坐标,必须为 GL_S,GL_T,GL_R,GL_Q 之一 /pname:必须是 GL_TEXTURE_GEN_MODE /param:纹理生成参数,下面的值之一:GL_OBJECT_LINEAR,GL_EYE_LINEAR,GL_SPHERE_MAP 在模式 GL_OBJECT_LINEAR 和 GL_EYE_LINEAR 下,都是按照顶点到一个平面的距离产生纹理坐标。 (1)平面定义 在三维空间中的一个平面可以如下定义: A * x + B * y + C * z + D = 0。 这是一个隐式方程它用满足该方程的点集来定义一个平面, 也就是说,

15、它可用于测试一个特定点x,y,z是否落在平面上。对于值 A * x + B * y + C * z + D 的另一个理解是它和点x,y,z到该平面的距离成比例。 对于系数 A,B,C 可以如下理解,向量A,B,C是该平面的法向量,即它们决定了平面的朝向。而系数 D 控制该平面到原点的距离。如果向量A,B,C是一个单位向量,则 D 等于该平面到原点的距离。 注意:如果对于给定点x,y,z,有 A * x + B * y + C * z + D = 0,则有: 2 * A * x + 2 * B * y + 2 * C * z + 2 * D = 0 和 N * A * x + N * B * y + N * C * z + N * D = 0 计算机科学与技术学院 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJEC_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, SplaneCoefficients); glTexGenfv(GL_S, GL_OBJECT_PLANE, SplaneCoefficients); TplaneCoefficients=0, 1, 0, 0; 计算机科学与技术学院 glTexGenfv(GL_T, GL_EYE_PLANE,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 物流与供应链

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号