实验1 基于 OpenGL 的动画编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实验1 基于 OpenGL 的动画编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15412字,纯文字阅读大概需要23分钟。
内容图文
![实验1 基于 OpenGL 的动画编程](/upload/InfoBanner/zyjiaocheng/595/ee4daf622e8046c69684181a7317f6f4.jpg)
实验目的:
1. 掌握 Visual Studio 2010(以下简称 VS2010)编程环境。
2. 熟悉 MFC 框架下应用 OpenGL 的绘制编程。
3. 重点熟练掌握基于 MFC 与 OpenGL 的动画编程框架设计。
实验内容:
1. 实验 VS2010 下 MFC 与 OpenGL 的动画编程方法,主要包括:
(1) 熟悉 VS2010 界面,创建 MFC 框架方法。
(2) 熟悉 OpenGL 环境配置方法。
(3) 重点熟练掌握 OpenGL 的动画编程方法。
2. 依照“实验方法”中步骤依次进行实验操作,并给所添加/修改的每一句代码添加 注释。
OnDraw1 绘制茶壶
// //
// 添加新的代码开始:
wglMakeCurrent(pDC->m_hDC, m_hRC);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 设置模型变换矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
auxWireTeapot(2.0);
SwapBuffers(pDC->m_hDC);
wglMakeCurrent(NULL, NULL);
// 添加新的代码结束。
// //
glColor3f(1.0f, 0.0f, 0.0f);//设定颜色
auxWireTeapot(2.0);//参数是茶壶的大小
wglMakeCurrent 设定OpenGL当前线程的渲染环境。
glClearColor 清除颜色缓冲区
glClear 用当前缓冲区清除值
glMatrixMode 指定哪一个矩阵是当前矩阵
glLoadIdentity 重置当前指定的矩阵为单位矩阵
SwapBuffers 把前台和后台的缓冲区指针交换一下
颜色设定:
glColor3f(0.0, 0.0, 0.0); --> 黑色
glColor3f(1.0, 0.0, 0.0); --> 红色
glColor3f(0.0, 1.0, 0.0); --> 绿色
glColor3f(0.0, 0.0, 1.0); --> 蓝色
glColor3f(1.0, 1.0, 0.0); --> 黄色
glColor3f(1.0, 0.0, 1.0); --> 品红色
glColor3f(0.0, 1.0, 1.0); --> 青色
glColor3f(1.0, 1.0, 1.0); --> 白色
OnDraw2 模型变换
// //
// 修改后新的代码开始:
wglMakeCurrent(pDC->m_hDC, m_hRC);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
glLineWidth(5.0f);
glBegin(GL_LINES);
glVertex3d(0.0, 0.0, 0.0); // 绘制X轴
glVertex3d(2.5, 0.0, 0.0);
glVertex3d(0.0, 0.0, 0.0); // 绘制Y轴
glVertex3d(0.0, 3.0, 0.0);
glEnd( );
glLoadIdentity( );
glRotated(45.0, 0.0, 0.0, 1.0); // 绕Z轴旋转45度
glTranslated(1.0, 0.0, 0.0); // 平移
glBegin(GL_LINE_LOOP);
glColor3f(0.0f, 0.0f, 1.0f); //蓝色
glVertex3d(1.0, 0.0, 0.0); // 变换前点P的坐标为(1, 0, 0)
glVertex3d(2.0, 0.0, 0.0);
glVertex3d(2.0, 1.0, 0.0);
glVertex3d(1.5, 1.5, 0.0);
glVertex3d(1.0, 1.0, 0.0);
glEnd( );
glLoadIdentity();
glTranslated(1.0, 0.0, 0.0); // 平移
glRotated(45.0, 0.0, 0.0, 1.0); // 绕Z轴旋转45度
glLineWidth(2.0f);
glBegin(GL_LINE_LOOP);
glColor3f(0.0f, 0.0f, 0.0f); //黑色
glVertex3d(1.0, 0.0, 0.0); // 变换前点P的坐标为(1, 0, 0)
glVertex3d(2.0, 0.0, 0.0);
glVertex3d(2.0, 1.0, 0.0);
glVertex3d(1.5, 1.5, 0.0);
glVertex3d(1.0, 1.0, 0.0);
glEnd( );
SwapBuffers(pDC->m_hDC);
wglMakeCurrent(NULL, NULL);
// 添加新的代码结束。
绘制两条线段作为坐标轴
glBegin(GL_LINES);
glVertex3d(0.0, 0.0, 0.0); // 绘制X轴
glVertex3d(2.5, 0.0, 0.0);
glVertex3d(0.0, 0.0, 0.0); // 绘制Y轴
glVertex3d(0.0, 3.0, 0.0);
glEnd( );
glLineWidth(5.0f); 指定线段的宽度
绘制一个多边形
glBegin(GL_LINE_LOOP);
glColor3f(0.0f, 0.0f, 1.0f); //蓝色
glVertex3d(1.0, 0.0, 0.0); // 变换前点P的坐标为(1, 0, 0)
glVertex3d(2.0, 0.0, 0.0);
glVertex3d(2.0, 1.0, 0.0);
glVertex3d(1.5, 1.5, 0.0);
glVertex3d(1.0, 1.0, 0.0);
glRotated(angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度
glRotated(45.0, 0.0, 0.0, 1.0); // 绕Z轴旋转45度
glTranslated(1.0, 0.0, 0.0); // 平移
再绘制一个多边形,这次先平移后旋转
glTranslated(1.0, 0.0, 0.0); // 平移
glRotated(45.0, 0.0, 0.0, 1.0); // 绕Z轴旋转45度
注:
几何图元 类型说明
GL_POINTS 单个顶点集
GL_LINES 多组双顶点线段
GL_POLYGON 单个简单填充凸多边形
GL_TRAINGLES 多组独立填充三角形
GL_QUADS 多组独立填充四边形
GL_LINE_STRIP 不闭合折线
GL_LINE_LOOP 闭合折线
GL_TRAINGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN 扇形连续填充三角形串
GL_QUAD_STRIP 连续填充四边形串
OnDraw3 真实感绘制效果
// //
// 修改后新的代码开始:
wglMakeCurrent(pDC->m_hDC, m_hRC);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
// 设置模型变换矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 设置光源参数
GLfloat light_position [ ] = { 1.0f, 1.0f, 1.0f, 0.0f };
GLfloat light_ambient [ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat light_diffuse [ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
GLfloat light_specular [ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
// 设置物体的材料参数
GLfloat material_ambient [ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat material_diffuse [ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
GLfloat material_specular [ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
GLfloat material_emission [ ] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat material_shininess[ ] = { 10.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, material_emission);
glMaterialfv(GL_FRONT, GL_SHININESS,material_shininess);
glRotated(45, 1.0, 1.0, 1.0);
//pDoc->m_star.mb_draw( );
auxSolidTeapot(5.0);
SwapBuffers(pDC->m_hDC);
wglMakeCurrent(NULL, NULL);
// 添加新的代码结束。
// //
OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。
光源就是光的来源,是“光”这种物质的提供者; 材质是指被光源照射的物体的表面的反射、漫反射(OpenGL不考虑折射)特性;
材质反映的是光照射到物体上后物体表现出来的对光的吸收、漫反射、反射等性能;
光照环境反应环境中所有光源发出的光经过无数次反射、漫反射之后整体环境所表现出来的光照效果。指定合适的光照环境参数可以使得最后形成的画面更接近于真实场景。
激活
glEnable(GL_COLOR_MATERIAL);// 使用颜色材质
glEnable(GL_LIGHTING);// 使用灯光
glEnable(GL_LIGHT0);// 使用默认的0号灯
glEnable(GL_AUTO_NORMAL);//自动生成法向
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);//开启更新深度缓冲区
glDepthFunc(GL_LESS);
光源
OpenGL中的光照模型中的反射光分为三个分量,分别是环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light)。
环境光 Ambient:是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。其特征是入射方向和出射方向均为任意方向。
漫射光 Diffuse:来自特定方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮,其特征是入射方向唯一、出射方向为任意方向。
镜面光 Specular:来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射,其特征是入射方向和出射方向均唯一。
OpenGL中用函数glLightfv来创建光源,函数原型是:
void glLightfv (GLenum light, GLenum pname, const GLfloat *params)
第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。
第二个参数pname指定光源特性,这个参数的具体信息见下表所示。
第三个参数设置相应的光源特性值。
材质
OpenGL用材质对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。
物体的材质跟光源一样,也分为环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。其中对环境光和漫反射光的反射程度决定了物体的颜色。材质定义了物体对环境光、漫反射光、镜面光的反射(吸收)能力。我们看到的物体的颜色(或亮度)是光源的颜色(或亮度)经过物体的材质反射(吸收)之后发散出来的颜色(或亮度)。
定义材质的函数使用glMaterialfv,函数原型是:
void glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
第一个参数face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;
第二个参数pname指定正在设定的材质特性,这个参数的辅助信息下表所示:
第三个params参数设置相应的材质的特性值。
最终效果
OnDraw4 纹理贴图
// //
// 添加新的代码开始:
wglMakeCurrent(pDC->m_hDC, m_hRC);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
// 设置模型变换矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 设置光源参数
GLfloat light_position [ ] = { 1.0f, 1.0f, 1.0f, 0.0f };
GLfloat light_ambient [ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat light_diffuse [ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
GLfloat light_specular [ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
// 设置物体的材料参数
GLfloat material_ambient [ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat material_diffuse [ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
GLfloat material_specular [ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
GLfloat material_emission [ ] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat material_shininess[ ] = { 10.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, material_emission);
glMaterialfv(GL_FRONT, GL_SHININESS,material_shininess);
glRotated(60.0, 1.0, 1.0, 1.0);
// 设置纹理
AUX_RGBImageRec * picture=auxDIBImageLoad(_T("tsIcon.bmp"));
if (picture!=NULL)
{
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 设置图像对齐模式
glTexImage2D(GL_TEXTURE_2D, // 指定目标纹理是二维纹理
0, // 纹理层次(level)
3, // 纹理颜色分量的个数(1, 2, 3, 或4)
picture->sizeX, // 纹理宽度
picture->sizeY, // 纹理高度
0, // 纹理边框的宽度(0或1)
GL_RGB, // 像素数据的格式
GL_UNSIGNED_BYTE,// 像素数据的数据类型
picture->data); // 存贮图像数据的内存指针
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_NEAREST);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvi(GL_TEXTURE_ENV,
GL_TEXTURE_ENV_MODE, GL_MODULATE);
} // if结构结束
glBegin(GL_QUADS);
glColor3f(0.0, 1.0, 0.0);
glTexCoord2d(-2.0,-2.0); glVertex3d(-2.5, -2.5, 3);
glTexCoord2d(-2.0, 2.0); glVertex3d(+2.5, -2.5, 3);
glTexCoord2d( 2.0, 2.0); glVertex3d(+2.5, +2.5, 3);
glTexCoord2d( 2.0,-2.0); glVertex3d(-2.5, +2.5, 3);
glColor3f(1.0, 1.0, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(-2.5, +2.5, 0);
glTexCoord2d(0.0, 1.0); glVertex3d(+2.5, +2.5, 0);
glTexCoord2d(1.0, 1.0); glVertex3d(+2.5, +2.5, 3);
glTexCoord2d(1.0, 0.0); glVertex3d(-2.5, +2.5, 3);
glColor3f(1.0, 0.0, 1.0);
glTexCoord2d(0.4,0.4); glVertex3d(-2.5, -2.5, 0);
glTexCoord2d(0.4,0.6); glVertex3d(-2.5, -2.5, 3);
glTexCoord2d(0.6,0.6); glVertex3d(-2.5, +2.5, 3);
glTexCoord2d(0.6,0.4); glVertex3d(-2.5, +2.5, 0);
glEnd();
SwapBuffers(pDC->m_hDC);
wglMakeCurrent(NULL, NULL);
if (picture!=NULL)
{
delete picture->data;
delete picture;
} // if结构结束
// 添加新的代码结束。
// //
glBegin(GL_QUADS);//GL_QUADS 多组独立填充四边形
glteximage2d是一个OpenGL函数,功能是根据指定的参数,生成一个2D纹理(Texture)
glTexParameteri 纹理过滤函数
第一个参数制定纹理类型,一般设置为GL_TEXTURE_2D
第二个参数指定响应的模式
GL_TEXTURE_WRAP_S S方向上的贴图模式
GL_TEXTURE_WRAP_T T方向上的贴图模式
GL_TEXTURE_MAG_FILTER 放大过滤
GL_TEXTURE_MIN_FILTER 缩小过滤
第三个参数指对应模式的方法
GL_CLAMP 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充
GL_CLAMP_TO_EDGE 在这种模式下,边框始终被忽略。位于纹理边缘或者靠近纹理边缘的纹理单元将用于纹理计算,但不使用纹理边框上的纹理单元,由于硬件支持原因,多数情况下GL_CLAMP与GL_CLAMP_TO_EDGE效果相同
GL_CLAMP_TO_BORDER 如果纹理坐标位于范围[0,1]之外,那么只用边框纹理单元(如果没有边框,则使用常量边框颜色,我想常量边框颜色就是黑色)
GL_LINEAR 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值,速度较慢无锯齿
GL_NEAREST 使用纹理中坐标最接近的一个像素的颜色作为需要绘制的像素颜色,速度较快会出现锯齿
GL_LINEAR_MIPMAP_NEAREST 使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值
glTexEnvi 设置当前的纹理映射方式
参数target必须为GL_TEXTURE_FILTER_CONTROL或GL_TEXTURE_ENV。
glTexCoord2f()作用是给当前的顶点赋予一个贴图坐标。
glTexCoord*() 设置纹理坐标
glVertex*() 设置顶点坐标
效果
OnDraw5 动画编程
?? ? // //
? ? // 添加新的代码开始:
? ? wglMakeCurrent(pDC->m_hDC, m_hRC);
? ? glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
? ? glClearDepth(1.0);
? ? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
? ? glEnable(GL_COLOR_MATERIAL);
? ? glEnable(GL_LIGHTING);
? ? glEnable(GL_LIGHT0);
? ? glEnable(GL_AUTO_NORMAL);
? ? glEnable(GL_NORMALIZE);
? ? glEnable(GL_DEPTH_TEST);
? ? glDepthFunc(GL_LESS);
? ? // 设置模型变换矩阵
? ? glMatrixMode(GL_MODELVIEW);
? ? glLoadIdentity();
? ? // 设置光源参数
? ? GLfloat light_position [ ] = { 1.0f, 1.0f, 1.0f, 0.0f };
? ? GLfloat light_ambient ?[ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
? ? GLfloat light_diffuse ?[ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
? ? GLfloat light_specular [ ] = { 0.5f, 0.5f, 0.5f, 0.2f };
? ? glLightfv(GL_LIGHT0, GL_POSITION, ?light_position);
? ? glLightfv(GL_LIGHT0, GL_AMBIENT, ? light_ambient);
? ? glLightfv(GL_LIGHT0, GL_DIFFUSE, ? light_diffuse);
? ? glLightfv(GL_LIGHT0, GL_SPECULAR, ?light_specular);
? ? // 设置物体的材料参数
? ? GLfloat material_ambient ?[ ] = { 0.2f, 0.2f, 0.2f, 0.2f };
? ? GLfloat material_diffuse ?[ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
? ? GLfloat material_specular [ ] = { 0.2f, 0.8f, 0.4f, 0.8f };
? ? GLfloat material_emission [ ] = { 0.2f, 0.2f, 0.2f, 1.0f };
? ? GLfloat material_shininess[ ] = { 10.0f };
? ? glMaterialfv(GL_FRONT, GL_AMBIENT, ?material_ambient);
? ? glMaterialfv(GL_FRONT, GL_DIFFUSE, ?material_diffuse);
? ? glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
? ? glMaterialfv(GL_FRONT, GL_EMISSION, material_emission);
? ? glMaterialfv(GL_FRONT, GL_SHININESS,material_shininess);
? ? glRotated(60.0, 1.0, 1.0, 1.0);
? ? // 设置纹理
? ? AUX_RGBImageRec * picture=auxDIBImageLoad(_T("tsIcon.bmp"));
? ? if (picture!=NULL)
? ? {
? ? ? ? glEnable(GL_TEXTURE_2D);
? ? ? ? glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 设置图像对齐模式
? ? ? ? glTexImage2D(GL_TEXTURE_2D, ? // 指定目标纹理是二维纹理
? ? ? ? ? ? ? ? ? ? ?0, ? ? ? ? ? ? ? // 纹理层次(level)
? ? ? ? ? ? ? ? ? ? ?3, ? ? ? ? ? ? ? // 纹理颜色分量的个数(1, 2, 3, 或4)
? ? ? ? ? ? ? ? ? ? ?picture->sizeX, ?// 纹理宽度
? ? ? ? ? ? ? ? ? ? ?picture->sizeY, ?// 纹理高度
? ? ? ? ? ? ? ? ? ? ?0, ? ? ? ? ? ? ? // 纹理边框的宽度(0或1)
? ? ? ? ? ? ? ? ? ? ?GL_RGB, ? ? ? ? ?// 像素数据的格式
? ? ? ? ? ? ? ? ? ? ?GL_UNSIGNED_BYTE,// 像素数据的数据类型
? ? ? ? ? ? ? ? ? ? ?picture->data); ?// 存贮图像数据的内存指针
? ? ? ? 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_NEAREST);
? ? ? ? glTexParameteri(GL_TEXTURE_2D,
? ? ? ? ? ? ? ? ? ? ? ? ? ?GL_TEXTURE_MIN_FILTER, GL_NEAREST);
? ? ? ? glTexEnvi(GL_TEXTURE_ENV,
? ? ? ? ? ? ? ? ? ? GL_TEXTURE_ENV_MODE, GL_MODULATE);
? ? } // if结构结束
?? ? ? // //
? ? // 添加新的代码开始:
? ??
? ? glRotated(pDoc->m_star.m_angle, 1.0, 1.0, 1.0);
? ? pDoc->m_star.mb_draw( );
? ? // 添加新的代码结束。
? ? // //
? ? SwapBuffers(pDC->m_hDC);
? ? wglMakeCurrent(NULL, NULL);
? ? if (picture!=NULL)
? ? {
? ? ? ? delete picture->data;
? ? ? ? delete picture;
? ? } // if结构结束
? ? // 添加新的代码结束。
? ? // //
glClearDepth(1.0); 给深度缓冲指定了一个初始值
效果
内容总结
以上是互联网集市为您收集整理的实验1 基于 OpenGL 的动画编程全部内容,希望文章能够帮你解决实验1 基于 OpenGL 的动画编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。