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

OpenGL

开发平台:

Visual C++

  1. #ifdef _ENABLE_DX10_
  2. #include "Gut.h"
  3. #include "render_data.h"
  4. #include <d3dx10.h>
  5. static ID3D10Device *g_pDevice = NULL;
  6. static ID3D10InputLayout *g_pVertexLayout = NULL;
  7. static ID3D10Buffer *g_pSunVertexBuffer = NULL;
  8. static ID3D10Buffer *g_pEarthVertexBuffer = NULL;
  9. static ID3D10Buffer *g_pMoonVertexBuffer = NULL;
  10. static ID3D10Buffer *g_pSphereIndexBuffer = NULL;
  11. static ID3D10Buffer *g_pConstantBuffer = NULL;
  12. static ID3D10VertexShader *g_pVertexShader = NULL;
  13. static ID3D10PixelShader *g_pPixelShader = NULL;
  14. static ID3D10RasterizerState *g_pRasterizerState= NULL;
  15. static D3DXMATRIX g_proj_matrix;
  16. bool InitResourceDX10(void)
  17. {
  18. g_pDevice = GutGetGraphicsDeviceDX10();
  19. ID3D10Blob *pVSCode = NULL;
  20. // 载入Vertex Shader
  21. g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "VS", "vs_4_0", &pVSCode);
  22. if ( NULL==g_pVertexShader )
  23. return false;
  24. // 载入Pixel Shader
  25. g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "PS", "ps_4_0");
  26. if ( NULL==g_pPixelShader )
  27. return false;
  28.     // 设置Vertex数据格式
  29.     D3D10_INPUT_ELEMENT_DESC layout[] =
  30. {
  31. { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
  32. { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
  33. };
  34.     if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) )
  35. return false;
  36. SAFE_RELEASE(pVSCode);
  37. D3D10_BUFFER_DESC cbDesc;
  38. // sun vertex buffer
  39.     cbDesc.ByteWidth = sizeof(Vertex_VC) * g_iNumSphereVertices;
  40.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  41.     cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  42.     cbDesc.CPUAccessFlags = 0;
  43.     cbDesc.MiscFlags = 0;
  44. // 打开Vertex Buffer时同时把数据拷贝过去
  45. D3D10_SUBRESOURCE_DATA sbDesc;
  46. sbDesc.pSysMem = g_pSunVertices;
  47. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  48. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pSunVertexBuffer ) )
  49. return false;
  50. // 打开Vertex Buffer时同时把数据拷贝过去
  51. sbDesc.pSysMem = g_pEarthVertices;
  52. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  53. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pEarthVertexBuffer ) )
  54. return false;
  55. // 打开Vertex Buffer时同时把数据拷贝过去
  56. sbDesc.pSysMem = g_pMoonVertices;
  57. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  58. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pMoonVertexBuffer ) )
  59. return false;
  60. // 设置一块可以用来放Index的内存.
  61.     cbDesc.ByteWidth = sizeof(unsigned short) * g_iNumSphereIndices;
  62.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  63.     cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
  64.     cbDesc.CPUAccessFlags = 0;
  65.     cbDesc.MiscFlags = 0;
  66. // 打开Index Buffer时同时把数据拷贝过去
  67. sbDesc.pSysMem = g_pSphereIndices;
  68.     // 分配一块可以存放Index的内存, 也就是Index Buffer.
  69. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pSphereIndexBuffer ) )
  70. return false;
  71. // 分配Shader读取参数的内存空间
  72.     cbDesc.ByteWidth = sizeof(Matrix4x4);
  73.     cbDesc.Usage = D3D10_USAGE_DYNAMIC;
  74.     cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
  75.     cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  76.     cbDesc.MiscFlags = 0;
  77. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) )
  78. return false;
  79. // 计算出一个可以转换到镜头坐标系的矩阵
  80. D3DXMatrixPerspectiveFovRH(&g_proj_matrix, FastMath::DegreeToRadian(90.0f), 1.0f, 0.1f, 100.0f);
  81. // 打开rasterizer state对象
  82. D3D10_RASTERIZER_DESC rasterizer_state_desc;
  83. rasterizer_state_desc.FillMode = D3D10_FILL_SOLID;
  84. rasterizer_state_desc.CullMode = D3D10_CULL_BACK;
  85. rasterizer_state_desc.FrontCounterClockwise = true;
  86. rasterizer_state_desc.DepthBias = 0;
  87. rasterizer_state_desc.DepthBiasClamp = 0.0f;
  88. rasterizer_state_desc.SlopeScaledDepthBias = 0.0f;
  89. rasterizer_state_desc.DepthClipEnable = false;
  90. rasterizer_state_desc.ScissorEnable = false;
  91. rasterizer_state_desc.MultisampleEnable = false;
  92. rasterizer_state_desc.AntialiasedLineEnable = false;
  93. if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) )
  94. return false;
  95. g_pDevice->RSSetState(g_pRasterizerState);
  96. return true;
  97. }
  98. bool ReleaseResourceDX10(void)
  99. {
  100.   SAFE_RELEASE(g_pVertexLayout);
  101.   SAFE_RELEASE(g_pSunVertexBuffer);
  102.   SAFE_RELEASE(g_pEarthVertexBuffer);
  103.   SAFE_RELEASE(g_pMoonVertexBuffer);
  104.   SAFE_RELEASE(g_pSphereIndexBuffer);
  105.   SAFE_RELEASE(g_pConstantBuffer);
  106.   SAFE_RELEASE(g_pVertexShader);
  107.   SAFE_RELEASE(g_pPixelShader);
  108. SAFE_RELEASE(g_pRasterizerState);
  109. return true;
  110. }
  111. void ResizeWindowDX10(int width, int height)
  112. {
  113. GutResetGraphicsDeviceDX10();
  114. float aspect = (float) height / (float) width;
  115. D3DXMatrixPerspectiveFovRH(&g_proj_matrix, FastMath::DegreeToRadian(90.0f), aspect, 0.1f, 100.0f);
  116. }
  117. void RenderFrameDX10(void)
  118. {
  119. Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  120. UINT stride = sizeof(Vertex_VC);
  121. UINT offset = 0;
  122. // 获得调用GutCreateGraphicsDeviceDX10时所生成的D3D10对象
  123. ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer
  124.     ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer
  125. IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer
  126. // 清除颜色
  127. g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor);
  128. // 清除Depth/Stencil buffer
  129. g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);
  130. // 设置vertex shader
  131. g_pDevice->VSSetShader(g_pVertexShader);
  132. // 设置pixel shader
  133. g_pDevice->PSSetShader(g_pPixelShader);
  134. // 设置vertex shader读取参数的内存位罝
  135.     g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);
  136. // 设置vertex数据格式
  137. g_pDevice->IASetInputLayout(g_pVertexLayout);
  138. // 设置index buffer
  139. g_pDevice->IASetIndexBuffer(g_pSphereIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  140. // 设置三角形顶点索引值数据排列是triangle strip
  141. g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  142. // 计算出一个可以转换到镜头坐标系的矩阵
  143. D3DXMATRIX temp_matrix;
  144. D3DXMATRIX view_matrix, view_proj_matrix, world_view_proj_matrix;
  145. D3DXMatrixLookAtRH(&view_matrix, (D3DXVECTOR3 *)&g_eye, (D3DXVECTOR3 *)&g_lookat, (D3DXVECTOR3 *)&g_up);
  146. D3DXMatrixMultiply(&view_proj_matrix, &view_matrix, &g_proj_matrix);
  147. // 太阳, 代入鼠标的旋转控制
  148. D3DXMATRIX sun_matrix, sun_ry, sun_rx;
  149. D3DXMatrixRotationX(&sun_rx, g_fRotate_X);
  150. D3DXMatrixRotationY(&sun_ry, g_fRotate_Y);
  151. D3DXMatrixMultiply(&sun_matrix, &sun_ry, &sun_rx);
  152. D3DXMatrixMultiply(&world_view_proj_matrix, &sun_matrix, &view_proj_matrix);
  153. // 设置shader参数
  154. D3DXMATRIX *pConstData;
  155. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  156. *pConstData = world_view_proj_matrix;
  157. g_pConstantBuffer->Unmap();
  158. // 
  159. g_pDevice->IASetVertexBuffers(0, 1, &g_pSunVertexBuffer, &stride, &offset);
  160. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  161. // 水星
  162. float mercury_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year_mercury); 
  163. D3DXMATRIX mercury_matrix, mercury_translate, mercury_rotate;
  164. D3DXMatrixRotationY(&mercury_rotate, mercury_rotate_y);
  165. D3DXMatrixTranslation(&mercury_translate, mercury_to_sun_distance, 0.0f, 0.0f);
  166. D3DXMatrixMultiply(&temp_matrix, &mercury_translate, &mercury_rotate);
  167. D3DXMatrixMultiply(&mercury_matrix, &temp_matrix, &sun_matrix);
  168. D3DXMatrixMultiply(&world_view_proj_matrix, &mercury_matrix, &view_proj_matrix);
  169. // 设置shader参数
  170. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  171. *pConstData = world_view_proj_matrix;
  172. g_pConstantBuffer->Unmap();
  173. g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset);
  174. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  175. // 金星
  176. float venus_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year_venus); 
  177. D3DXMATRIX venus_matrix, venus_rotate, venus_translate;
  178. D3DXMatrixRotationY(&venus_rotate, venus_rotate_y);
  179. D3DXMatrixTranslation(&venus_translate, venus_to_sun_distance, 0.0f, 0.0f);
  180. D3DXMatrixMultiply(&temp_matrix, &venus_translate, &venus_rotate);
  181. D3DXMatrixMultiply(&venus_matrix, &temp_matrix, &sun_matrix);
  182. D3DXMatrixMultiply(&world_view_proj_matrix, &venus_matrix, &view_proj_matrix);
  183. // 设置shader参数
  184. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  185. *pConstData = world_view_proj_matrix;
  186. g_pConstantBuffer->Unmap();
  187. g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset);
  188. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  189. // 地球
  190. float earth_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_year); 
  191. D3DXMATRIX earth_matrix, earth_rotate, earth_translate;
  192. D3DXMatrixRotationY(&earth_rotate, earth_rotate_y);
  193. D3DXMatrixTranslation(&earth_translate, earth_to_sun_distance, 0.0f, 0.0f);
  194. D3DXMatrixMultiply(&temp_matrix, &earth_translate, &earth_rotate);
  195. D3DXMatrixMultiply(&earth_matrix, &temp_matrix, &sun_matrix);
  196. D3DXMatrixMultiply(&world_view_proj_matrix, &earth_matrix, &view_proj_matrix);
  197. // 设置shader参数
  198. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  199. *pConstData = world_view_proj_matrix;
  200. g_pConstantBuffer->Unmap();
  201. g_pDevice->IASetVertexBuffers(0, 1, &g_pEarthVertexBuffer, &stride, &offset);
  202. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  203. // 月亮
  204. float moon_rotate_y = 2.0f * MATH_PI * (g_simulation_days / days_a_month); 
  205. D3DXMATRIX moon_matrix, moon_rotate, moon_translate;
  206. D3DXMatrixRotationY(&moon_rotate, moon_rotate_y);
  207. D3DXMatrixTranslation(&moon_translate, moon_to_earth_distance, 0.0f, 0.0f);
  208. D3DXMatrixMultiply(&temp_matrix, &moon_translate, &moon_rotate);
  209. D3DXMatrixMultiply(&moon_matrix, &temp_matrix, &earth_matrix);
  210. D3DXMatrixMultiply(&world_view_proj_matrix, &moon_matrix, &view_proj_matrix);
  211. // 设置shader参数
  212. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  213. *pConstData = world_view_proj_matrix;
  214. g_pConstantBuffer->Unmap();
  215. g_pDevice->IASetVertexBuffers(0, 1, &g_pMoonVertexBuffer, &stride, &offset);
  216. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  217. // 等待硬件扫描结束, 然后再更新画面
  218. pSwapChain->Present(1, 0);
  219. }
  220. #else
  221. void ResizeWindowDX10(int width, int height) {}
  222. void RenderFrameDX10(void) {}
  223. bool ReleaseResourceDX10(void) { return false; }
  224. bool InitResourceDX10(void) { return false; }
  225. #endif // _ENABLE_DX10_