main.cpp
上传用户:gzqinmao
上传日期:2022-07-13
资源大小:472k
文件大小:4k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include "Gut.h"
  4. #include "GutInput.h"
  5. #include "GutTimer.h"
  6. #include "render_dx9.h"
  7. #include "render_dx10.h"
  8. #include "render_opengl.h"
  9. #include "render_data.h"
  10. GutTimer g_Timer;
  11. void GetUserInput(void)
  12. {
  13. // 读取鼠标
  14. GutMouseInfo mouse;
  15. GutReadMouse(&mouse);
  16. // 读取键盘
  17. char keyboard_state[256];
  18. GutReadKeyboard(keyboard_state);
  19. // 获得画完前一个画面到现在所经历的时间
  20. float time_diff = g_Timer.Stop();
  21. g_Timer.Restart();
  22. float moving_speed = 2.0f * time_diff;
  23. float rotation_speed = 1.0 * time_diff;
  24. // 要累积下对X和Y轴的旋转角度
  25. static float ry = 0.0f;
  26. static float rx = 0.0f;
  27. // 如果左击,就旋转镜头
  28. if ( mouse.button[0] ) 
  29. {
  30. ry -= mouse.x * rotation_speed;
  31. rx -= mouse.y * rotation_speed;
  32. }
  33. Matrix4x4 rotate_matrix;
  34. rotate_matrix.RotateY_Replace(ry);
  35. rotate_matrix.RotateX(rx);
  36. // 在右手坐标系里, 镜面的法线是转换矩阵的-Z轴
  37. Vector4 camera_facing = -rotate_matrix[2];
  38. // 获得镜面右边的方向
  39. Vector4 camera_right = rotate_matrix[0];
  40. // 按下W或方向键向上
  41. if ( keyboard_state[GUTKEY_W] || keyboard_state[GUTKEY_UP] )
  42. {
  43. g_eye += camera_facing * moving_speed;
  44. }
  45. // 按下S或方向键向下
  46. if ( keyboard_state[GUTKEY_S] || keyboard_state[GUTKEY_DOWN] )
  47. {
  48. g_eye -= camera_facing * moving_speed;
  49. }
  50. // 按下A或方向键向左
  51. if ( keyboard_state[GUTKEY_A] || keyboard_state[GUTKEY_LEFT] )
  52. {
  53. g_eye -= camera_right * moving_speed;
  54. }
  55. // 按下D或方向键向右
  56. if ( keyboard_state[GUTKEY_D] || keyboard_state[GUTKEY_RIGHT] )
  57. {
  58. g_eye += camera_right * moving_speed;
  59. }
  60. // 计算出镜头对准的点, 生成镜头转换矩阵时会用到.
  61. g_lookat = g_eye + camera_facing;
  62. // 因为是对2个轴转动, 需要更新镜头朝上的轴
  63. g_up = Vector3CrossProduct(camera_right, camera_facing);
  64. }
  65. void main(int argc, char *argv[])
  66. {
  67. // 默认使用DirectX 9来绘图
  68. char *device = "dx9";
  69. void (*render)(void) = RenderFrameDX9;
  70. bool (*init_resource)(void) = InitResourceDX9;
  71. bool (*release_resource)(void) = ReleaseResourceDX9;
  72. void (*resize_func)(int width, int height) = ResizeWindowDX9;
  73. #ifdef _ENABLE_DX10_
  74. printf("Pressn(1) for Direct3D9n(2) for OpenGLn(3) for Direc3D10n");
  75. #else
  76. printf("Pressn(1) for Direct3D9n(2) for OpenGLn");
  77. #endif
  78. int c = getche();
  79. switch(c)
  80. {
  81. default:
  82. case '1':
  83. render = RenderFrameDX9;
  84. init_resource = InitResourceDX9;
  85. release_resource = ReleaseResourceDX9;
  86. resize_func = ResizeWindowDX9;
  87. break;
  88. case '2':
  89. device = "opengl";
  90. init_resource = InitResourceOpenGL;
  91. release_resource = ReleaseResourceOpenGL;
  92. render = RenderFrameOpenGL;
  93. resize_func = ResizeWindowOpenGL;
  94. break;
  95. #ifdef _ENABLE_DX10_
  96. case '3':
  97. device = "dx10";
  98. init_resource = InitResourceDX10;
  99. release_resource = ReleaseResourceDX10;
  100. render = RenderFrameDX10;
  101. resize_func = ResizeWindowDX10;
  102. break;
  103. #endif
  104. }
  105. GutResizeFunc( resize_func );
  106. // 在(100,100)的位置打开一个大小为(512x512)的窗口
  107. GutCreateWindow(100, 100, 512, 512, device);
  108. // 做OpenGL或DirectX初始化
  109. if ( !GutInitGraphicsDevice(device) )
  110. {
  111. printf("Failed to initialize %s devicen", device);
  112. exit(0);
  113. }
  114. g_view_matrix.Identity();
  115. GutInputInit();
  116. float color[]={1.0f, 0.0f, 0.0f, 1.0f};
  117. CreateSphere(3.0f, &g_pSphereVertices, &g_pSphereIndices, color);
  118. // 载入shader
  119. if ( !init_resource() )
  120. {
  121. release_resource();
  122. printf("Failed to load resourcesn");
  123. exit(0);
  124. }
  125. // 主循环
  126. while( GutProcessMessage() )
  127. {
  128. GetUserInput();
  129. render();
  130. }
  131. // 释放shader
  132. release_resource();
  133. //
  134. delete [] g_pSphereVertices;
  135. delete [] g_pSphereIndices;
  136. // 关闭OpenGL/DirectX绘图设备
  137. GutReleaseGraphicsDevice();
  138. }