《OPENGL软件包应用》word版.docx_第1页
《OPENGL软件包应用》word版.docx_第2页
《OPENGL软件包应用》word版.docx_第3页
《OPENGL软件包应用》word版.docx_第4页
《OPENGL软件包应用》word版.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. /*/2. /*OPENGL软件包应用*/3. /*/4. #include/-Windows的头文件 5. #include/-OpenGL32库的头文件 6. #include/-GLu32库的头文件 7. #include/-GLaux库的头文件 8. /-下面设置的变量是RenderingContext(着色描述表)。 9. /-每一个OpenGL程序都被连接到一个着色描述表上。 10. /-着色描述表将所有的OpenGL调用命令连接到DeviceContext(设备描述表)上。 11. /-我将OpenGL的着色描述表定义为hRC。 12. /-要让您的程序能够绘制窗口的话,还需要创建一个设备描述表, 13. /-也就是第二行的内容。Windows的设备描述表被定义为hDC。 14. /-DC将窗口连接到GDI(GraphicsDeviceInterface图形设备接口)。 15. /-而RC将OpenGL连接到DC 16. HGLRChRC=NULL;/-永久着色描述表 17. HDChDC=NULL;/-私有GDI设备描述表 18. HWNDhWnd=NULL;/-保存我们的窗口句柄 19. HINSTANCEhInstance;/-保存程序的实例 20. GLfloatrtri;/用于三角形的角度(新增) 21. GLfloatrquad;/用于四边形的角度(新增) 22. /-下面设置一个用来监控键盘动作的数组。 23. /-有许多方法可以监控键盘的动作, 24. /-但这里的方法很可靠, 25. /-并且可以处理多个键同时按下的情况。 26. 27. boolkeys256;/-用于键盘例程的数组 28. /-active变量用来告知程序窗口是否处于最小化的状态。 29. /-如果窗口已经最小化的话,我们可以做从暂停代码执行到退出程序的任何事情。 30. /-暂停程序,这样可以使得程序不用在后台保持运行。 31. 32. boolactive=TRUE;/-窗口的活动标志,缺省为TRUE 33. /-程序在全屏状态下运行,fullscreen的值为TRUE,否则为FALSE。 34. /-这个全局变量的设置十分重要,它让每个过程都知道程序是否运行在全屏状态下。 35. 36. boolfullscreen=TRUE;/-全屏标志缺省设定成全屏模式 37. LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/WndProc的定义 38. GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight);/重置并初始化GL窗口大小 39. intInitGL(GLvoid);40. intDrawGLScene(GLvoid);/从这里开始进行所有的绘制 41. GLvoidKillGLWindow(GLvoid);42. BOOLCreateGLWindow(char*title,intwidth,intheight,intbits,boolfullscreenflag);43. LRESULTCALLBACKWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);44. 45. /下面是我们的Windows程序的入口。将会调用窗口创建例程,处理窗口消息,并监视人机交互。 46. intWINAPIWinMain(HINSTANCEhInstance,/实例 47. HINSTANCEhPrevInstance,/前一个实例 48. LPSTRlpCmdLine,/命令行参数 49. intnCmdShow)/窗口显示状态 50. 51. /我们设置两个变量。msg用来检查是否有消息等待处理。done的初始值设为FALSE。 52. /这意味着我们的程序仍未完成运行。只要程序done保持FALSE,程序继续运行。一旦done的值改变为TRUE,程序退出。 53. MSGmsg;54. booldone=FALSE;55. if(MessageBox(NULL,WouldYouLikeToRunInFullscreenMode?,StartFullScreen?,MB_YESNO|MB_ICONQUESTION)=IDNO)56. fullscreen=FALSE;/-提示用户是否全屏显示 57. 58. if(!CreateGLWindow(OpenGL软件包画图,640,480,16,fullscreen)59. return0;/-创建OpenGL窗口 60. while(!done)61. 62. /我们要做的第一件事是检查是否有消息在等待。 63. /使用PeekMessage()可以在不锁住我们的程序的前提下对消息进行检查。 64. /许多程序使用GetMessage(),也可以很好的工作。 65. /但使用GetMessage(),程序在收到paint消息或其他别的什么窗口消息之前不会做任何事。 66. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)67. 68. if(msg.message=WM_QUIT)/-收到退出消息? 69. done=TRUE;70. else71. 72. TranslateMessage(&msg);/-翻译消息 73. DispatchMessage(&msg);/-发送消息 74. 75. 76. else77. 78. if(active)79. 80. if(keysVK_ESCAPE)81. done=TRUE;82. else83. 84. /如果程序是激活的且ESC没有按下,我们绘制场景并交换缓存(使用双缓存可以实现无闪烁的动画)。 85. /我们实际上在另一个看不见的屏幕上绘图。当我们交换缓存后, 86. /我们当前的屏幕被隐藏,现在看到的是刚才看不到的屏幕。这也是我们看不到场景绘制过程的原因。 87. /场景只是即时显示。 88. 89. DrawGLScene();/绘制场景 90. SwapBuffers(hDC);/交换缓存(双缓存) 91. 92. 93. /允许用户按下F1键在全屏模式和窗口模式间切换。 94. if(keysVK_F1)95. 96. keysVK_F1=FALSE;97. KillGLWindow();/销毁当前的窗口 98. fullscreen=!fullscreen;/切换全屏/窗口模式 99. if(!CreateGLWindow(OpenGLFramework,640,480,16,fullscreen)100. return0;/如果窗口未能创建,程序退出 101. 102. 103. 104. 105. KillGLWindow();/-销毁窗口 106. return(msg.wParam);107. 108. /-下面函数作用重新设置OpenGL场景的大小,而不管窗口的大小是否已经改变(假定没有使用全屏模式)。 109. /-甚至无法改变窗口的大小时(例如在全屏模式下), 110. /-它至少仍将运行一次-在程序开始时设置我们的透视图。 111. /-OpenGL场景的尺寸将被设置成它显示时所在窗口的大小。 112. GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)113. 114. 115. if(height=0)/-防止被零除 116. 117. height=1;/-将Height设为1 118. 119. glViewport(0,0,width,height);/-重置当前的视口(Viewport) 120. /-下面几行为透视图设置屏幕。意味着越远的东西看起来越小。 121. /-这么做创建了一个现实外观的场景。此处透视按照基于窗口宽度和高度的45度视角来计算。 122. /-0.1f,100.0f是我们在场景中所能绘制深度的起点和终点。 123. glMatrixMode(GL_PROJECTION);/下面两行代码将影响projectionmatrix(投影矩阵)。 124. /投影矩阵负责为我们的场景增加透视。 125. 126. glLoadIdentity();/近似于重置。它将所选的矩阵状态恢复成其原始状态。 127. /调用glLoadIdentity()之后我们为场景设置透视图。 128. 129. gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);/计算窗口的外观比例 130. 131. glMatrixMode(GL_MODELVIEW);/指明任何新的变换将会影响modelviewmatrix(模型观察矩阵)。 132. /模型观察矩阵中存放了我们的物体讯息。 133. glLoadIdentity();/重置模型观察矩阵 134. 135. /-对OpenGL进行所有的设置。我们将设置清除屏幕所用的颜色, 136. /-打开深度缓存,启用smoothshading(阴影平滑),等等。 137. /-这个例程直到OpenGL窗口创建之后才会被调用。此过程将有返回值。 138. intInitGL(GLvoid)/-此处开始对OpenGL进行所有设置 139. 140. glShadeModel(GL_SMOOTH);/启用阴影平滑 141. /阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑 142. glClearColor(1.0f,1.0f,1.0f,1.0f);/黑色背景 143. /色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。 144. /glClearColor后的第一个参数是RedIntensity(红色分量),第二个是绿色, 145. /第三个是蓝色。最大值也是1.0f,代表特定颜色分量的最亮情况。 146. /最后一个参数是Alpha值。当它用来清除屏幕的时候,我们不用关心第四个数字。 147. /现在让它为0.0f。 148. /通过混合三种原色(红、绿、蓝),可以得到不同的色彩。 149. /使用glClearColor(0.0f,0.0f,1.0f,0.0f), 150. /您将用亮蓝色来清除屏幕。用glClearColor(0.5f,0.0f,0.0f,0.0f)的话, 151. /将使用中红色来清除屏幕。不是最亮(1.0f),也不是最暗(0.0f)。要得到白色背景, 152. /将所有的颜色设成最亮(1.0f)。要黑色背景,将所有的颜色设为最暗(0.0f)。 153. glClearDepth(1.0f);/设置深度缓存 154. /将深度缓存设想为屏幕后面的层。 155. /深度缓存不断的对物体进入屏幕内部有多深进行跟踪。 156. /但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。 157. /它的排序决定那个物体先画。这样您就不会将一个圆形后面的正方形画到圆形上来。 158. /深度缓存是OpenGL十分重要的部分。 159. glEnable(GL_DEPTH_TEST);/启用深度测试 160. glDepthFunc(GL_LEQUAL);/所作深度测试的类型 161. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);/真正精细的透视修正 162. /告诉OpenGL我们希望进行最好的透视修正。 163. /这会十分轻微的影响性能。但使得透视图看起来好一点 164. returnTRUE;/初始化OK 165. 166. /下面包括了所有的绘图代码。任何想在屏幕上显示的东西都将在此段代码中出现。 167. /以后的每个例程中都会在例程的此处增加新的代码。 168. /可以在glLoadIdentity()调用之后, 169. /返回TRUE值之前,试着添加一些OpenGL代码来创建基本的形。 170. /目前所作的全部就是将屏幕清除成前面所决定的颜色, 171. /清除深度缓存并且重置场景。我们仍没有绘制任何东西。 172. intDrawGLScene(GLvoid)/从这里开始进行所有的绘制 173. 174. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/清除屏幕和深度缓存 175. glLoadIdentity();/重置当前的模型观察矩阵 176. /当您调用glLoadIdentity()之后,您实际上讲当前点移到了屏幕中心, 177. /X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。 178. /OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值, 179. /右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。 180. 181. /glTranslatef(x,y,z)沿着X,Y和Z轴移动。根据前面的次序, 182. /下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。 183. /注意在glTranslatef(x,y,z)中当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。 184. glTranslatef(-1.5f,0.0f,-6.0f);185. /现在我们已经移到了屏幕的左半部分,并且将视图推入屏幕背后足够的距离以便我们可以看见全部的场景创建三角形。 186. /glBegin(GL_TRIANGLES)的意思是开始绘制三角形, 187. /glEnd()告诉OpenGL三角形已经创建好了。通常您会需要画3个顶点,可以使用GL_TRIANGLES。 188. /在绝大多数的显卡上,绘制三角形是相当快速的。如果要画四个顶点,使用GL_QUADS的话会更方便。 189. /但据我所知,绝大多数的显卡都使用三角形来为对象着色。最后,如果您想要画更多的顶点时,可以使用GL_POLYGON。 190. glRotatef(rtri,0.0f,1.0f,0.0f);/绕Y轴旋转三角形(新增) 191. glBegin(GL_TRIANGLES);/绘制三角形 192. glVertex3f(0.0f,1.0f,0.0f);/上顶点 193. glVertex3f(-1.0f,-1.0f,0.0f);/左下 194. glVertex3f(1.0f,-1.0f,0.0f);/右下 195. glColor3f(1.0f,0.0f,0.0f);/设置当前色为红色 196. glVertex3f(0.0f,1.0f,0.0f);/上顶点 197. glColor3f(0.0f,1.0f,0.0f);/设置当前色为绿色 198. glVertex3f(-1.0f,-1.0f,0.0f);/左下 199. glColor3f(0.0f,0.0f,1.0f);/设置当前色为蓝色 200. glVertex3f(1.0f,-1.0f,0.0f);/右下 201. glEnd();/三角形绘制结束 202. glRotatef(rquad,1.0f,0.0f,0.0f);/绕X轴旋转四边形(新增) 203. glTranslatef(3.0f,0.0f,0.0f);/右移3单位 204. glColor3f(0.5f,0.5f,1.0f);/一次性将当前色设置为蓝色 205. glBegin(GL_QUADS);/绘制正方形 206. glVertex3f(-1.0f,1.0f,0.0f);/左上 207. glVertex3f(1.0f,1.0f,0.0f);/右上 208. glVertex3f(1.0f,-1.0f,0.0f);/左下 209. glVertex3f(-1.0f,-1.0f,0.0f);/右下 210. glEnd();/正方形绘制结束*/ 211. rtri+=1.2f;/增加三角形的旋转变量(新增) 212. rquad-=1.15f;/减少四边形的旋转变量(新增) 213. /*glRotatef(rtri,0.0f,1.0f,0.0f);/绕Y轴旋转金字塔214. glBegin(GL_TRIANGLES);/开始绘制金字塔的各个面215. glColor3f(1.0f,0.0f,0.0f);/红色216. glVertex3f(0.0f,1.0f,0.0f);/三角形的上顶点(前侧面)217. glColor3f(0.0f,1.0f,0.0f);/绿色218. glVertex3f(-1.0f,-1.0f,1.0f);/三角形的左下顶点(前侧面)219. glColor3f(0.0f,0.0f,1.0f);/蓝色220. glVertex3f(1.0f,-1.0f,1.0f);/三角形的右下顶点(前侧面)221. glColor3f(1.0f,0.0f,0.0f);/红色222. glVertex3f(0.0f,1.0f,0.0f);/三角形的上顶点(后侧面)223. glColor3f(0.0f,1.0f,0.0f);/绿色224. glVertex3f(1.0f,-1.0f,-1.0f);/三角形的左下顶点(后侧面)225. glColor3f(0.0f,0.0f,1.0f);/蓝色226. glVertex3f(-1.0f,-1.0f,-1.0f);/三角形的右下顶点(后侧面)227. glColor3f(1.0f,0.0f,0.0f);/红色228. glVertex3f(0.0f,1.0f,0.0f);/三角形的上顶点(左侧面)229. glColor3f(0.0f,1.0f,0.0f);/绿色230. glVertex3f(-1.0f,-1.0f,1.0f);/三角形的右下顶点(左侧面)231. glColor3f(0.0f,0.0f,1.0f);/蓝色232. glVertex3f(-1.0f,-1.0f,-1.0f);/三角形的左下顶点(左侧面)233. glColor3f(1.0f,0.0f,0.0f);/红色234. glVertex3f(0.0f,1.0f,0.0f);/三角形的上顶点(右侧面)235. glColor3f(0.0f,1.0f,0.0f);/绿色236. glVertex3f(1.0f,-1.0f,-1.0f);/三角形的右下顶点(右侧面)237. glColor3f(0.0f,0.0f,1.0f);/蓝色238. glVertex3f(1.0f,-1.0f,1.0f);/三角形的左下顶点(右侧面)239. glEnd();/金字塔绘制结束240. glLoadIdentity();241. glTranslatef(1.5f,0.0f,-7.0f);/先右移再移入屏幕242. glRotatef(rquad,1.0f,1.0f,1.0f);/在XYZ轴上旋转立方体243. glBegin(GL_QUADS);/开始绘制立方体244. glColor3f(0.0f,1.0f,0.0f);/颜色改为蓝色245. glVertex3f(1.0f,1.0f,-1.0f);/四边形的右上顶点(顶面)246. glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左上顶点(顶面)247. glVertex3f(-1.0f,1.0f,1.0f);/四边形的左下顶点(顶面)248. glVertex3f(1.0f,1.0f,1.0f);/四边形的右下顶点(顶面)249. glColor3f(1.0f,0.5f,0.0f);/颜色改成橙色250. glVertex3f(1.0f,-1.0f,1.0f);/四边形的右上顶点(底面)251. glVertex3f(-1.0f,-1.0f,1.0f);/四边形的左上顶点(底面)252. glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左下顶点(底面)253. glVertex3f(1.0f,-1.0f,-1.0f);/四边形的右下顶点(底面)254. glColor3f(1.0f,0.0f,0.0f);/颜色改成红色255. glVertex3f(1.0f,1.0f,1.0f);/四边形的右上顶点(前面)256. glVertex3f(-1.0f,1.0f,1.0f);/四边形的左上顶点(前面)257. glVertex3f(-1.0f,-1.0f,1.0f);/四边形的左下顶点(前面)258. glVertex3f(1.0f,-1.0f,1.0f);/四边形的右下顶点(前面)259. glColor3f(1.0f,1.0f,0.0f);/颜色改成黄色260. glVertex3f(1.0f,-1.0f,-1.0f);/四边形的右上顶点(后面)261. glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左上顶点(后面)262. glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左下顶点(后面)263. glVertex3f(1.0f,1.0f,-1.0f);/四边形的右下顶点(后面)264. glColor3f(0.0f,0.0f,1.0f);/颜色改成蓝色265. glVertex3f(-1.0f,1.0f,1.0f);/四边形的右上顶点(左面)266. glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左上顶点(左面)267. glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左下顶点(左面)268. glVertex3f(-1.0f,-1.0f,1.0f);/四边形的右下顶点(左面)269. glColor3f(1.0f,0.0f,1.0f);/颜色改成紫罗兰色270. glVertex3f(1.0f,1.0f,-1.0f);/四边形的右上顶点(右面)271. glVertex3f(1.0f,1.0f,1.0f);/四边形的左上顶点(右面)272. glVertex3f(1.0f,-1.0f,1.0f);/四边形的左下顶点(右面)273. glVertex3f(1.0f,-1.0f,-1.0f);/四边形的右下顶点(右面)274. glEnd();/立方体绘制结束275. rtri+=1.2f;/增加三角形的旋转变量(新增)276. rquad-=1.15f;/减少四边形的旋转变量(新增)*/277. returnTRUE;278. 279. /下面代码只在程序退出之前调用。KillGLWindow()的作用是依次释放着色描述表,设备描述表和窗口句柄。 280. /已经加入了许多错误检查。如果程序无法销毁窗口的任意部分,都会弹出带相应错误消息的讯息窗口, 281. /告诉您什么出错了。使您在您的代码中查错变得更容易些。 282. GLvoidKillGLWindow(GLvoid)283. 284. /在KillGLWindow()中所作的第一件事是检查我们是否处于全屏模式。 285. /如果是,我们要切换回桌面。我们本应在禁用全屏模式前先销毁窗口, 286. /但在某些显卡上这么做可能会使得桌面崩溃。所以我们还是先禁用全屏模式。 287. /这将防止桌面出现崩溃,并在Nvidia和3dfx显卡上都工作的很好! 288. if(fullscreen)289. 290. /我们使用ChangeDisplaySettings(NULL,0)回到原始桌面。将NULL作为第一个参数, 291. /0作为第二个参数传递强制Windows使用当前存放在注册表中的值 292. /(缺省的分辨率、色彩深度、刷新频率,等等)来有效的恢复我们的原始桌面。 293. /切换回桌面后,我们还要使得鼠标指针重新可见 294. ChangeDisplaySettings(NULL,0);/是的话,切换回桌面 295. ShowCursor(TRUE);/显示鼠标指针 296. 297. /接下来的代码查看我们是否拥有着色描述表(hRC)。如果没有,程序将跳转至后面的代码查看是否拥有设备描述表。 298. if(hRC)299. 300. /如果存在着色描述表的话,下面的代码将查看我们能否释放它(将hRC从hDC分开)。 301. /这里请注意我使用的的查错方法。基本上我只是让程序尝试释放着色描述表(通过调用wglMakeCurrent(NULL,NULL), 302. /然后我再查看释放是否成功。巧妙的将数行代码结合到了一行。 303. if(!wglMakeCurrent(NULL,NULL)304. /如果不能释放DC和RC描述表的话,MessageBox()将弹出错误消息,告知我们DC和RC无法被释放。 305. /NULL意味着消息窗口没有父窗口。其右的文字将在消息窗

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论