第16讲Opengl真实感绘制编程实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子与信息工程学院 计算机科学与技术系
// 载入位图并转换成纹理 int LoadGLTextures() {
……………..
}
电子与信息工程学院 计算机科学与技术系
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置 { if (!LoadGLTextures()) // 跳转到纹理载入例程 { return FALSE; // 如果不能载入纹理返回 FALSE } glEnable(GL_TEXTURE_2D); // 启用纹理映射 glShadeModel(GL_SMOOTH); // 启用阴影平滑 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景 glClearDepth(1.0f); // 深度缓存设置 glEnable(GL_DEPTH_TEST); // 启用深度测试 glDepthFunc(GL_LEQUAL); // 所作的深度测试类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 高度 优化的透视投影计算 电子与信息工程学院 计算机科学与技术系
电子与信息工程学院 计算机科学与技术系
xrot+=xspeed; // xrot 增加 xspeed 单位 yrot+=yspeed; // yrot 增加 yspeed 单位 return TRUE; }
设置光源的位置
电子与信息工程学院 计算机科学与技术系
glEnable(GL_LIGHT1); // 启用一号光源
return TRUE; // 初始化 OK
} 注意启动光照系统glEnable(GL_LIGHTING); 在控制代码中,所以现在还没有启动光照
电子与信息工程学院 计算机科学与技术系
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 前侧面 glNormal3f( 0.0f, 0.0f, 1.0f); // 法线指向观察者 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
电子与信息工程学院 计算机科学与技术系
(-1,1,-1) 顶 面 (-1,1,1) (-1,-1,-1) (1,1,1)
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 顶面 glNormal3f( 0.0f, 1.0f, 0.0f); // 法线向上 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
电子与信息工程学院 计算机科学与技术系
(-1,1,-1) 后 面 (-1,1,1) (-1,-1,-1) (1,1,1)
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 后侧面 glNormal3f( 0.0f, 0.0f,-1.0f); // 法线背向观察者 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
GLfloat LightAmbient[]= { 0.2f, 0.2f, 0.2f, 1.0f };
设置环境光
电子与信息工程学院 计算机科学与技术系
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; 设置漫射光参数 漫射光由特定的光源产生,处于漫射光直接照射下的任何 对象表面都变得很亮,而几乎未被照射到的区域就显得要 暗一些。这样在所创建的木板箱的棱边上就会产生的很不 错的阴影效果。 生成最亮的漫射光。所有的参数值都取成最大值1.0f。它 将照在木板箱的前面。
电子与信息工程学院 计算机科学与技术系
glNormal3f( x, y, z);
glNormal函数设定当前顶点法向 法线是指经过面(多边形)上的一点且垂直于 这个面(多边形)的直线 使用光源的时候必须指定一条法线 法线应该指向多边形的外侧
电子与信息工程学院 计算机科学与技术系
(-1,1,-1) 前 面 (-1,1,1) (-1,-1,-1) (1,1,1)
第16讲 真实感绘制编程实例
实例一 光照 实例二 加载3D世界
电子与信息工程学院 计算机科学与技术系
实例一 光照编程实例
加入光照
电子与信息工程学院 计算机科学与技术系
光照编程实例
使用键盘移动场景中的对象
电子与信息工程学院 计算机科学与技术系
光照编程实例
#include <windows.h> // Windows的头文件 #include <stdio.h> // 标准输入/输出的头文件 #include <gl\gl.h> // OpenGL32库的头文件 #include <gl\glu.h> // GLu32库的头文件 #include <gl\glaux.h> // GLaux库的头文件 HDC hDC=NULL; // 私有GDI设备描述表 HGLRC hRC=NULL; // 永久着色描述表 HWND hWnd=NULL; // 保存我们的窗口句柄 HINSTANCE hInstance; // 保存程序的实例 bool keys[256]; // 用于键盘例程的数组 bool active=TRUE; // 窗口的活动标志,缺省为TRUE bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
绘制立方体
int DrawGLScene(GLvoid) {glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,z); // 移入/移出屏幕 z 个单位 glRotatef(xrot,1.0f,0.0f,0.0f); // 绕X轴旋转 glRotatef(yrot,0.0f,1.0f,0.0f); ); // 绕Y轴旋转 glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); // 开始绘制四边形
xrot; // X 旋转 yrot; // Y 旋转 xspeed; // X 旋转速度 yspeed; // Y 旋转速度 z=-5.0f; // 深入屏幕的距离
设置变量来控制绕x轴和y轴旋转角度的步 长,以及绕x轴和y轴的旋转速度。 创建一个z变量来控制进入屏幕深处的距离
电子与信息工程学院 计算机科学与技术系
电子与信息工程学院 计算机科学与技术系
(-1,1,-1) 右 侧 面 (-1,1,1) (-1,-1,-1) (1,1,1)
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 右侧面 glNormal3f( 1.0f, 0.0f, 0.0f); // 法线朝右 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
电子与信息工程学院 计算机科学与技术系
BOOL light; // 光源的开/关 BOOL lp; // L键按下了么?
light 变量跟踪光照是否打开 变量lp存储'L'键是否按下的状态
电子与信息工程学院 计算机科学与技术系
GLfloat GLfloat GLfloat GLfloat GLfloat
电子与信息工程学院 计算机科学与技术系
(-1,1,-1)
底 面 (-1,1,1) (1,1,1)
(1,1,-1)
(-1,-1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 底面 glNormal3f( 0.0f,-1.0f, 0.0f); // 法线朝下 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
电子与信息工程学院 计算机科学与技术系
(-1,1,-1) 左 侧 面 (-1,1,1) (-1,-1,-1) (1,1,1)
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 左侧面 glNormal3f(-1.0f, 0.0f, 0.0f); // 法线朝左 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); // 四边形绘制结束
电子与信息工程学院 计算机科学与技术系
GLfloat LightPosition[]= { 0.0f, 0.0f, 1.0f, 1.0f }; 设置光源位置,直接照射在木箱的正面 前三个参数分别是XYZ轴上的位移。
电子与信息工程学院 计算机科学与技术系
AUX_Rwenku.baidu.comBImageRec *LoadBMP(char *Filename) // 载入位图 { …………….. }
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
设置环境光的发光量
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
设置漫射光的发光量
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);