[关闭]
@Pigmon 2016-11-28T06:56:19.000000Z 字数 10884 阅读 176

在 Cg-CourseExamples 中攒大作业的方法 + 参考大作业1指南

上课


文档和程序中如果有什么错误或说不清楚的,请大家及时指出我来修改,多谢 Orz

如何在 Cg-CourseExamples 解决方案中新建工程

如果还没能让 Cg-CourseExamples 工程正常工作,参考之前这篇(以下简称配置文档1):
老师的Cgcourse-examples环境的配置方法 (pdf)
链接:http://pan.baidu.com/s/1jI2ToUE 密码:yxea

最简单的办法

直接用现有工程,只替换程序。这样项目名字没法改,不过反正交作业的时候也只是提供一个源程序,一个exe,一个文档。所以其实完全是可以的。如果你能接受,可以直接跳到后面的“参考大作业1指南”。
需要注意的是,有的大作业需要MITK,而有的工程没有,所以要选好工程。比如,参考大作业1可以在texture2d工程直接修改;而参考大作业2可以在dyncubemap工程里直接修改。
增加库的方法,可以参考下面的“正常的方法”

正常的方法

注意,如果要自己建项目,那么之前的包含Cg-CourseExamples源程序的目录必须改成全英文的(否则引用目录会出问题)。原来是“图形学技术实践”之类的名字,改成C:\CG-Course,这样后面的目录什么的就可以复制粘贴了。

一句话形容:
在解决方案里新建一个项目然后删掉,把新建的项目文件拷贝回cgcourse-examples目录,再添加回解决方案。然后配置新项目的include目录和附加的lib。
以下是今天的详细内容:

  1. 在Visual Studio里打开了 Cg-CourseExamples 解决方案;在“解决方案资源管理器”中右键点击最上面的解决方案名,在弹出菜单中选择“添加-新建项目”
    23.png-74.3kB
    图1 在解决方案管理器中增加新项目

  2. 项目类型就是控制台空项目,目录随意
    24.PNG-9.2kB
    图2 新建控制台项目
    记住选“空项目”,建立好应该是这样:
    25.PNG-3.2kB
    图3 在解决方案管理器中的新建项目

  3. 在刚刚的解决方案资源管理器中,右键点击刚刚建好的项目,选择“移除”,没错就是删了。为了后面配置目录比较方便不容易出错。

  4. 找到刚刚建立新项目的目录,将刚刚建立好的两个项目文件拷贝到cgcourse-examples目录下,即在配置文档1中生成的项目目录。
    26.PNG-1.9kB

  5. 在刚刚的Visual Studio解决方案管理器中右键点击解决方案名,在弹出菜单中选择“添加”->"现有项目",注意,是“现有项目”! 然后选择刚刚拷贝过来的新建的项目,如本例子中的TestTutor.
    现在又跟图3看起来一样了。
    25.PNG-3.2kB

  6. 展开新建的项目,右键点击“源文件”,在弹出菜单中选择“添加”->“新建项”->“C++文件(.cpp)”,选好名字,比如main.cpp,点确定(这样项目属性中的C/C++部分才能出来)。
    从下一步开始,Debug和Release都要分别配置。

  7. 右键点击新建的项目,在弹出菜单中选择“属性”,然后按这个顺序点击:
    27.PNG-16kB

  8. 把这3条依次加进去,注意第3条,要按自己的路径配置;前2条如果是按照配置文档1的方法配置,应该是一样的:

  1. C:\Program Files (x86)\Windows Kits\8.1\Include\um
  2. C:\Program Files (x86)\Windows Kits\8.1\Include\shared
  3. C:\CG-Course\examples\cgcourse-examples\include

然后点“确定”关闭此对话框。
28.PNG-18.5kB
然后在属性对话框点“应用”。

9.在项目属性中选择“链接器”->“输入”,按以下顺序点击:
29.png-18.3kB

  1. 在弹出的“附加依赖项”对话框中将以下内容复制粘贴进去:
  1. glu32.lib
  2. opengl32.lib
  3. C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\freeglut.lib
  4. C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\FreeImage.lib
  5. C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\Mitk_dll.lib

注意最后一个是MITK库的lib,不是每个项目都需要。
然后点击“确定”关闭该对话框,在属性对话框中点“应用”
30.PNG-19.6kB

这样就可以按照Cg-CourseExamples其他项目那样编译程序了。

参考大作业1 指南

将以下程序复制粘贴到刚刚建好项目的.cpp中覆盖,注意注释中,标注了“鼠标转动”,“显示列表”,“双缓存”和“题目要求”的地方是相对于texture2d项目进行修改的,也是题目要求的部分;而“字符”“菜单”“字符”部分留给大家自己完成。其中“菜单”按照老师讲义完全copy就行,字符部分我会在之后的文档中放出。

注意1:我并不会OpenGL,所以以下程序肯定不是最简方案,我只是简单的把2个例子凑在了一起,如果有修改意见及时通知我。
注意2:最上面的注释是版权声明,是老师自己写的,留不留你自己看着办 :P

  1. /*
  2. -----------------------------------------------------------------------
  3. This source file is part of "cgcourse-examples"
  4. (Examples for Computer Graphics Course of CCCE GUCAS.)
  5. Copyright (C) 2011 Xue Jian (jian.xue.cn@gmail.com)
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. -----------------------------------------------------------------------
  17. */
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <vector>
  21. #include "glinc.h"
  22. #include "matrix.h"
  23. #include "geotypes.h"
  24. #include "trackball.h"
  25. #include "camera.h"
  26. #include "FreeImage.h"
  27. using std::vector;
  28. GLuint g_tex_id;
  29. int g_window_width = 512;
  30. int g_window_height = 512;
  31. // light
  32. GLfloat g_light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  33. GLfloat g_light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  34. GLfloat g_light_position[] = { -3.5f, 1.5f, 2.5f, 1.0f };
  35. GLfloat g_light_direction[] = { 3.5f, -1.5f, -2.5f, 0.0f };
  36. GLfloat g_light_rot = 0.0f;
  37. GLfloat g_light_rot_speed = 0.2f;
  38. // material
  39. GLfloat g_material_ambient[] = { 1.0f, 0.57f, 0.04f, 1.0f };
  40. GLfloat g_material_diffuse[] = { 1.0f, 0.57f, 0.04f, 1.0f };
  41. GLfloat g_material_specular[] = { 0.33f, 0.33f, 0.52f, 0.0f };
  42. GLfloat g_material_emission[] = { 0.0f, 0.0f, 0.0f, 0.0f };
  43. GLfloat g_material_specular_power = 80.0f;
  44. // bg color
  45. GLfloat g_color_background[] = { 0.0f, 0.0f, 0.0f, 0.0f };
  46. GLfloat g_color_foreground[] = { 1.0f - g_color_background[0], 1.0f - g_color_background[1], 1.0f - g_color_background[2], 1.0f };
  47. // 是否打开光照,你可以做个菜单项控制它(菜单是题目要求)
  48. bool g_light = false;
  49. // cam
  50. Cameraf g_cam;
  51. float g_z = 5.0f;
  52. float const Z_STEP = 0.1f;
  53. // --------------------------------------------------------
  54. // 鼠标转动 -->
  55. // --------------------------------------------------------
  56. bool g_left_button_down = false;
  57. bool g_middle_button_down = false;
  58. bool g_right_button_down = false;
  59. int g_last_x = 0;
  60. int g_last_y = 0;
  61. GLint g_viewport[4];
  62. TrackBallf g_trackball(1.5f);
  63. Matrixf g_rotm;
  64. // --------------------------------------------------------
  65. // 鼠标转动 <--
  66. // --------------------------------------------------------
  67. // 盒子顶点
  68. float g_cube_v[][3] = {
  69. { -1.0f, -1.0f, 1.0f },
  70. { 1.0f, -1.0f, 1.0f },
  71. { 1.0f, 1.0f, 1.0f },
  72. { -1.0f, 1.0f, 1.0f },
  73. { -1.0f, -1.0f, -1.0f },
  74. { -1.0f, 1.0f, -1.0f },
  75. { 1.0f, 1.0f, -1.0f },
  76. { 1.0f, -1.0f, -1.0f }
  77. };
  78. // 建立盒子的显示列表,题目要求
  79. void init_cube_list();
  80. void set_material()
  81. {
  82. GLenum face = GL_FRONT_AND_BACK;
  83. glMaterialfv(face, GL_AMBIENT, g_material_diffuse);
  84. glMaterialfv(face, GL_DIFFUSE, g_material_diffuse);
  85. glMaterialfv(face, GL_SPECULAR, g_material_specular);
  86. glMaterialfv(face, GL_EMISSION, g_material_emission);
  87. glMaterialf(face, GL_SHININESS, g_material_specular_power);
  88. }
  89. FIBITMAP* load_image(char const *filename, int flag = 0)
  90. {
  91. FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename, 0);
  92. if (fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(filename);
  93. if (fif == FIF_UNKNOWN) return false;
  94. return FreeImage_Load(fif, filename, flag);
  95. }
  96. bool load_textures()
  97. {
  98. /// 这个目录是题目要求的木箱子贴图
  99. FIBITMAP *tdib = load_image("data/texture2d/Crate.png");
  100. if (!tdib) return false;
  101. bool status(false);
  102. unsigned int bpp = FreeImage_GetBPP(tdib);
  103. FIBITMAP *dib = tdib;
  104. if (bpp != 24) dib = FreeImage_ConvertTo24Bits(tdib);
  105. BYTE *bits = FreeImage_GetBits(dib);
  106. unsigned int width = FreeImage_GetWidth(dib);
  107. unsigned int height = FreeImage_GetHeight(dib);
  108. GLenum format = FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR ? GL_BGR : GL_RGB;
  109. RGBQUAD *pal = FreeImage_GetPalette(dib);
  110. if (bits != 0 && width>0 && height>0) {
  111. status = true; // Set The Status To TRUE
  112. glGenTextures(1, &g_tex_id); // Create Three Textures
  113. // Create Linear Filtered Texture
  114. glBindTexture(GL_TEXTURE_2D, g_tex_id);
  115. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  116. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  117. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, format, GL_UNSIGNED_BYTE, bits);
  118. }
  119. if (bpp != 24) FreeImage_Unload(dib);
  120. FreeImage_Unload(tdib);
  121. return status; // Return The Status
  122. }
  123. bool init()
  124. {
  125. if (!load_textures()) {
  126. return false;
  127. }
  128. g_rotm.IdentityMatrix();
  129. if (g_light) glEnable(GL_LIGHTING);
  130. else glDisable(GL_LIGHTING);
  131. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  132. glShadeModel(GL_SMOOTH); // Enable Smooth Shading
  133. glClearColor(g_color_background[0], g_color_background[1], g_color_background[2], g_color_background[3]); // Black Background
  134. glClearDepth(1.0f); // Depth Buffer Setup
  135. glEnable(GL_DEPTH_TEST); // Enables Depth Testing
  136. glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
  137. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  138. glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0f);
  139. glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
  140. glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
  141. //glLightfv(GL_LIGHT1, GL_AMBIENT, g_light_ambient); // Setup The Ambient Light
  142. glLightfv(GL_LIGHT1, GL_DIFFUSE, g_light_diffuse); // Setup The Diffuse Light
  143. glLightfv(GL_LIGHT1, GL_SPECULAR, g_light_diffuse);
  144. glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 1.0f);
  145. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 30.0f);
  146. glLightfv(GL_LIGHT1, GL_POSITION, g_light_position); // Position The Light
  147. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, g_light_direction);
  148. glEnable(GL_LIGHT1); // Enable Light One
  149. set_material();
  150. return true; // Initialization Went OK
  151. }
  152. // --------------------------------------------------------
  153. // 鼠标转动 -->
  154. // --------------------------------------------------------
  155. void motion(int x, int y)
  156. {
  157. if (g_left_button_down)
  158. {
  159. g_last_x = x;
  160. g_last_y = y;
  161. g_trackball.Update((float)(2.0*(x - g_viewport[0]) / g_viewport[2] - 1), (float)(2.0*(g_viewport[3] - y - 1 - g_viewport[1]) / g_viewport[3] - 1));
  162. g_trackball.BuildRotMatrix(g_rotm);
  163. glutPostRedisplay();
  164. }
  165. }
  166. void mouse(int button, int state, int x, int y)
  167. {
  168. bool down = (state == GLUT_DOWN);
  169. switch (button)
  170. {
  171. case GLUT_LEFT_BUTTON: g_left_button_down = down; break;
  172. case GLUT_MIDDLE_BUTTON: g_middle_button_down = down; break;
  173. case GLUT_RIGHT_BUTTON: g_right_button_down = down; break;
  174. }
  175. if (g_left_button_down)
  176. {
  177. g_trackball.Start((float)(2.0*(x - g_viewport[0]) / g_viewport[2] - 1), (float)(2.0*(g_viewport[3] - y - 1 - g_viewport[1]) / g_viewport[3] - 1));
  178. }
  179. g_last_x = x;
  180. g_last_y = y;
  181. }
  182. // --------------------------------------------------------
  183. // 鼠标转动 <--
  184. // --------------------------------------------------------
  185. // --------------------------------------------------------
  186. // 显示列表,题目要求
  187. // --------------------------------------------------------
  188. void init_cube_list()
  189. {
  190. glNewList(1, GL_COMPILE);
  191. glColor3f(1.0f, 1.0f, 1.0f);
  192. glBindTexture(GL_TEXTURE_2D, g_tex_id);
  193. glEnable(GL_TEXTURE_2D);
  194. glBegin(GL_QUADS); // Draw A Quad
  195. // Front Face
  196. glNormal3f(0.0f, 0.0f, 1.0f);
  197. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[0]);
  198. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[1]);
  199. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[2]);
  200. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[3]);
  201. // Back Face
  202. glNormal3f(0.0f, 0.0f, -1.0f);
  203. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[4]);
  204. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[5]);
  205. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[6]);
  206. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[7]);
  207. // Top Face
  208. glNormal3f(0.0f, 1.0f, 0.0f);
  209. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[5]);
  210. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[3]);
  211. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[2]);
  212. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[6]);
  213. // Bottom Face
  214. glNormal3f(0.0f, -1.0f, 0.0f);
  215. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[4]);
  216. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[7]);
  217. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[1]);
  218. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[0]);
  219. // Right face
  220. glNormal3f(1.0f, 0.0f, 0.0f);
  221. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[7]);
  222. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[6]);
  223. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[2]);
  224. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[1]);
  225. // Left Face
  226. glNormal3f(-1.0f, 0.0f, 0.0f);
  227. glTexCoord2f(0.0f, 0.0f); glVertex3fv(g_cube_v[4]);
  228. glTexCoord2f(1.0f, 0.0f); glVertex3fv(g_cube_v[0]);
  229. glTexCoord2f(1.0f, 1.0f); glVertex3fv(g_cube_v[3]);
  230. glTexCoord2f(0.0f, 1.0f); glVertex3fv(g_cube_v[5]);
  231. glEnd(); // Done Draw
  232. glEndList();
  233. }
  234. void keyboard(unsigned char key, int x, int y)
  235. {
  236. switch (key)
  237. {
  238. case 27:
  239. exit(0);
  240. break;
  241. }
  242. }
  243. void display()
  244. {
  245. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  246. glMatrixMode(GL_MODELVIEW);
  247. glLoadIdentity();
  248. g_cam.LookAt(0.0f, 0.0f, g_z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
  249. g_material_diffuse[0] = 1.0f;
  250. g_material_diffuse[1] = 0.57f;
  251. g_material_diffuse[2] = 0.04f;
  252. set_material();
  253. // 鼠标转动
  254. glMultMatrixf(g_rotm);
  255. glCallList(1);
  256. glutSwapBuffers();
  257. }
  258. void reshape(int width, int height)
  259. {
  260. if (height == 0)
  261. {
  262. height = 1;
  263. }
  264. glViewport(0, 0, width, height);
  265. glGetIntegerv(GL_VIEWPORT, g_viewport);
  266. g_cam.Perspective(45.0f, (float)(width) / (float)(height), 1.1f, 100.0f);
  267. }
  268. int main(int argc, char *argv[])
  269. {
  270. glutInit(&argc, argv);
  271. /// 双缓存,题目要求
  272. glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  273. glutInitWindowPosition(100, 100);
  274. glutInitWindowSize(g_window_width, g_window_height);
  275. glutCreateWindow("参考大作业1");
  276. if (!init()) return -1;
  277. init_cube_list();
  278. glutDisplayFunc(display);
  279. glutReshapeFunc(reshape);
  280. glutKeyboardFunc(keyboard);
  281. glutMouseFunc(mouse);
  282. glutMotionFunc(motion);
  283. glutIdleFunc(display);
  284. glutMainLoop();
  285. return 0;
  286. }

参考大作业2和3的入门指南这两天会陆续放出,敬请关注!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注