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

3D图形编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include "Gut.h"
  3. #include "Vector4.h"
  4. void RenderFrameDX9(void);
  5. void RenderFrameOpenGL(void);
  6. void main(int argc, char *argv[])
  7. {
  8. // 默认使用DirectX 9来绘图
  9. char *device = "dx9";
  10. if ( argc > 1 )
  11. {
  12. // 如果命令行参数指定用OpenGL, 就改用OpenGL.
  13. if ( stricmp(argv[1], "opengl")==0 )
  14. {
  15. device = "opengl";
  16. }
  17. }
  18. // 在(100,100)的位置打开一个大小为(512x512)的窗口
  19. GutCreateWindow(100, 100, 512, 512, device);
  20. // 做OpenGL或DirectX初始化
  21. if ( !GutInitGraphicsDevice(device) )
  22. {
  23. printf("Failed to initialize %s devicen", device);
  24. exit(0);
  25. }
  26. // 主循环
  27. while( GutProcessMessage() )
  28. {
  29. if ( !strcmp(device, "dx9") )
  30. {
  31. RenderFrameDX9();
  32. }
  33. else
  34. {
  35. RenderFrameOpenGL();
  36. }
  37. }
  38. // 关闭OpenGL/DirectX绘图设备
  39. GutReleaseGraphicsDevice();
  40. }
  41. // 金字塔形的8条边线
  42. Vector4 g_vertices[] = 
  43. {
  44. Vector4(-1.0f, 1.0f,-1.0f),
  45. Vector4(-1.0f,-1.0f,-1.0f),
  46. Vector4(-1.0f,-1.0f,-1.0f),
  47. Vector4( 1.0f,-1.0f,-1.0f),
  48. Vector4( 1.0f,-1.0f,-1.0f),
  49. Vector4( 1.0f, 1.0f,-1.0f),
  50. Vector4( 1.0f, 1.0f,-1.0f),
  51. Vector4(-1.0f, 1.0f,-1.0f),
  52. Vector4( 0.0f, 0.0f, 1.0f),
  53. Vector4(-1.0f, 1.0f,-1.0f),
  54. Vector4( 0.0f, 0.0f, 1.0f),
  55. Vector4(-1.0f,-1.0f,-1.0f),
  56. Vector4( 0.0f, 0.0f, 1.0f),
  57. Vector4( 1.0f,-1.0f,-1.0f),
  58. Vector4( 0.0f, 0.0f, 1.0f),
  59. Vector4( 1.0f, 1.0f,-1.0f),
  60. };
  61. // 镜头位置
  62. Vector4 g_eye(0.0f,3.0f,3.0f); 
  63. // 镜头对准的点
  64. Vector4 g_lookat(0.0f, 0.0f, 0.0f); 
  65. // 镜头正上方的方向
  66. Vector4 g_up(0.0f, -1.0f, 1.0f); 
  67. // `使用DirectX9来绘图`
  68. void RenderFrameDX9(void)
  69. {
  70. LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
  71.     device->SetRenderState( D3DRS_LIGHTING, FALSE );
  72.     device->Clear(
  73. 0, NULL, // `清除整个画面`
  74. D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, // `清除颜色和Z Buffer`
  75. D3DCOLOR_ARGB(0, 0, 0, 0), // `设置要把颜色清成黑色`
  76. 1.0f, // `设置要把Z值清为1, 也就是离镜头最远.`
  77. 0 // `设置要把Stencil buffer清为0, 在这是否设置没有区别.`
  78. );
  79. // `计算出一个可以转换到镜头坐标系的矩阵`
  80. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  81. // `设置镜头转换矩阵`
  82. // `因为内存排列方法相同, 可以直接把Matrix4x4类型转换成D3DMATRIX.`
  83. device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix);
  84. // `计算出一个使用透视投影的矩阵`
  85. Matrix4x4 perspective_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 1.0f, 100.0f);
  86. // `设置视角转换矩阵`
  87. device->SetTransform(D3DTS_PROJECTION, (D3DMATRIX *)&perspective_matrix);
  88. // `开始下绘图指令`
  89. device->BeginScene();
  90. // `设置数据格式`
  91. device->SetFVF(D3DFVF_XYZ);
  92. // `画出金字塔的8条边线`
  93. device->DrawPrimitiveUP(D3DPT_LINELIST, 8, g_vertices, sizeof(Vector4)); 
  94. // `声明所有的绘图指令都下完了`
  95. device->EndScene(); 
  96. // `显示出背景backbuffer的画面`
  97. device->Present( NULL, NULL, NULL, NULL );
  98. }
  99. // `使用OpenGL来绘图`
  100. void RenderFrameOpenGL(void)
  101. {
  102. // `清除画面`
  103. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  104. // `计算出一个可以转换到镜头坐标系的矩阵`
  105. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  106. // `设置镜头转换矩阵`
  107. glMatrixMode(GL_MODELVIEW);
  108. glLoadMatrixf((float *) &view_matrix);
  109. // `计算出一个透视投影的透视矩阵`
  110. Matrix4x4 perspective_matrix = GutMatrixPerspectiveRH_OpenGL(90.0f, 1.0f, 1.0f, 100.0f);
  111. // `设置视角转换矩阵`
  112. glMatrixMode(GL_PROJECTION);
  113. glLoadMatrixf((float *) &perspective_matrix);
  114. // `画出金字塔的8条边线`
  115. glEnableClientState(GL_VERTEX_ARRAY);
  116. glVertexPointer(4, GL_FLOAT, sizeof(Vector4), g_vertices);
  117. glDrawArrays(GL_LINES, 0, 16);
  118. // `把背景backbuffer的画面显示出来`
  119. GutSwapBuffersOpenGL();
  120. }