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

OpenGL

开发平台:

Visual C++

  1. #ifdef _ENABLE_DX10_
  2. #include "Gut.h"
  3. #include "render_data.h"
  4. static ID3D10Device *g_pDevice = NULL;
  5. static ID3D10InputLayout *g_pVertexLayout = NULL;
  6. static ID3D10Buffer *g_pPyramidVertexBuffer = NULL;
  7. static ID3D10Buffer *g_pPyramidIndexBuffer = NULL;
  8. static ID3D10Buffer *g_pRoadVertexBuffer = NULL;
  9. static ID3D10Buffer *g_pRoadIndexBuffer = NULL;
  10. static ID3D10Buffer *g_pConstantBuffer = NULL;
  11. static ID3D10VertexShader *g_pVertexShader = NULL;
  12. static ID3D10PixelShader *g_pPixelShader = NULL;
  13. static ID3D10RasterizerState *g_pRasterizerState= NULL;
  14. static Matrix4x4 g_proj_matrix;
  15. bool InitResourceDX10(void)
  16. {
  17. g_pDevice = GutGetGraphicsDeviceDX10();
  18. ID3D10Blob *pVSCode = NULL;
  19. // 载入Vertex Shader
  20. g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "VS", "vs_4_0", &pVSCode);
  21. if ( NULL==g_pVertexShader )
  22. return false;
  23. // 载入Pixel Shader
  24. g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "PS", "ps_4_0");
  25. if ( NULL==g_pPixelShader )
  26. return false;
  27.     // 设置Vertex数据格式
  28.     D3D10_INPUT_ELEMENT_DESC layout[] =
  29. {
  30. { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
  31. { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
  32. };
  33.     if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) )
  34. return false;
  35. SAFE_RELEASE(pVSCode);
  36. // 设置一块可以用来放Vertex的内存.
  37.     D3D10_BUFFER_DESC cbDesc;
  38.     cbDesc.ByteWidth = sizeof(g_pyramid_vertices);
  39.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  40.     cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  41.     cbDesc.CPUAccessFlags = 0;
  42.     cbDesc.MiscFlags = 0;
  43. // 打开Vertex Buffer时同时把数据拷贝过去
  44. D3D10_SUBRESOURCE_DATA sbDesc;
  45. sbDesc.pSysMem = g_pyramid_vertices;
  46. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  47. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pPyramidVertexBuffer ) )
  48. return false;
  49. cbDesc.ByteWidth = sizeof(g_road_vertices);
  50. sbDesc.pSysMem = g_road_vertices;
  51. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  52. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pRoadVertexBuffer ) )
  53. return false;
  54. // 设置一块可以用来放Index的内存.
  55.     cbDesc.ByteWidth = sizeof(g_pyramid_trianglelist_indices);
  56.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  57.     cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
  58.     cbDesc.CPUAccessFlags = 0;
  59.     cbDesc.MiscFlags = 0;
  60. // 打开Index Buffer时同时把数据拷贝过去
  61. sbDesc.pSysMem = g_pyramid_trianglelist_indices;
  62.     // 分配一块可以存放Index的内存, 也就是Index Buffer.
  63. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pPyramidIndexBuffer ) )
  64. return false;
  65. cbDesc.ByteWidth = sizeof(g_road_trianglestrip_indices);
  66. sbDesc.pSysMem = g_road_trianglestrip_indices;
  67.     // 分配一块可以存放Index的内存, 也就是Index Buffer.
  68. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pRoadIndexBuffer ) )
  69. return false;
  70. // 分配Shader读取参数的内存空间
  71.     cbDesc.ByteWidth = sizeof(Matrix4x4);
  72.     cbDesc.Usage = D3D10_USAGE_DYNAMIC;
  73.     cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
  74.     cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  75.     cbDesc.MiscFlags = 0;
  76. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) )
  77. return false;
  78. // 计算出一个可以转换到镜头坐标系的矩阵
  79. g_proj_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 0.1f, 100.0f);
  80. // 创建rasterizer state对象
  81. D3D10_RASTERIZER_DESC rasterizer_state_desc;
  82. rasterizer_state_desc.FillMode = D3D10_FILL_SOLID;
  83. rasterizer_state_desc.CullMode = D3D10_CULL_BACK;
  84. rasterizer_state_desc.FrontCounterClockwise = true;
  85. rasterizer_state_desc.DepthBias = 0;
  86. rasterizer_state_desc.DepthBiasClamp = 0.0f;
  87. rasterizer_state_desc.SlopeScaledDepthBias = 0.0f;
  88. rasterizer_state_desc.DepthClipEnable = false;
  89. rasterizer_state_desc.ScissorEnable = false;
  90. rasterizer_state_desc.MultisampleEnable = false;
  91. rasterizer_state_desc.AntialiasedLineEnable = false;
  92. if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) )
  93. return false;
  94. g_pDevice->RSSetState(g_pRasterizerState);
  95. return true;
  96. }
  97. bool ReleaseResourceDX10(void)
  98. {
  99.   SAFE_RELEASE(g_pVertexLayout);
  100.   SAFE_RELEASE(g_pPyramidVertexBuffer);
  101.   SAFE_RELEASE(g_pPyramidIndexBuffer);
  102.   SAFE_RELEASE(g_pRoadVertexBuffer);
  103.   SAFE_RELEASE(g_pRoadIndexBuffer);
  104.   SAFE_RELEASE(g_pConstantBuffer);
  105.   SAFE_RELEASE(g_pVertexShader);
  106.   SAFE_RELEASE(g_pPixelShader);
  107. SAFE_RELEASE(g_pRasterizerState);
  108. return true;
  109. }
  110. void RenderFrameDX10(void)
  111. {
  112. Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  113. UINT stride = sizeof(Vertex_VC);
  114. UINT offset = 0;
  115. // `获得调用GutCreateGraphicsDeviceDX10时所生成的D3D10对象`
  116. //frame buffer
  117. ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); 
  118. //depth/stencil buffer
  119.     ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); 
  120. // front/back buffer
  121. IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); 
  122. // `清除颜色`
  123. g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor);
  124. // `清除Depth/Stencil buffer`
  125. g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);
  126. // `设置vertex shader`
  127. g_pDevice->VSSetShader(g_pVertexShader);
  128. // `设置pixel shader`
  129. g_pDevice->PSSetShader(g_pPixelShader);
  130. // `设置vertex shader读取参数的内存位罝`
  131.     g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);
  132. // `设置vertex数据格式`
  133. g_pDevice->IASetInputLayout(g_pVertexLayout);
  134. // `计算出一个可以转换到镜头坐标系的矩阵`
  135. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  136. Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix;
  137. Vector4 border(-15.0f, 0.0f, -15.0f);
  138. Vector4 grid_position = border;
  139. const int grids_x = 30;
  140. const int grids_z = 30;
  141. for ( int x=0; x<grids_x; x++ )
  142. {
  143. grid_position[2] = border[2];
  144. int grid_x = x & 0x07;
  145. for ( int z=0; z<grids_z; z++ )
  146. {
  147. // `设置转换矩阵`
  148. Matrix4x4 object_matrix;
  149. object_matrix.Translate_Replace(grid_position);
  150. int grid_z = z & 0x07;
  151. char c = g_map[grid_x][grid_z];
  152. if ( c==0 )
  153. {
  154. Matrix4x4 world_view_proj_matrix = object_matrix * view_proj_matrix;
  155. // `设置shader参数`
  156. Matrix4x4 *pConstData;
  157. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  158. *pConstData = world_view_proj_matrix;
  159. g_pConstantBuffer->Unmap();
  160. // `设置vertex buffer`
  161. g_pDevice->IASetVertexBuffers(0, 1, &g_pRoadVertexBuffer, &stride, &offset);
  162. // `设置index buffer`
  163. g_pDevice->IASetIndexBuffer(g_pRoadIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  164. // `设置三角形顶点索引值数据排列是triangle strip`
  165. g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
  166. // `画出道路`
  167. g_pDevice->DrawIndexed(4, 0, 0);
  168. }
  169. else
  170. {
  171. object_matrix.Scale_Replace(1.0f, (float) c, 1.0f);
  172. object_matrix[3] = grid_position;
  173. Matrix4x4 world_view_proj_matrix = object_matrix * view_proj_matrix;
  174. // `设置shader参数`
  175. Matrix4x4 *pConstData;
  176. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  177. *pConstData = world_view_proj_matrix;
  178. g_pConstantBuffer->Unmap();
  179. // `设置vertex buffer`
  180. g_pDevice->IASetVertexBuffers(0, 1, &g_pPyramidVertexBuffer, &stride, &offset);
  181. // `设置index buffer`
  182. g_pDevice->IASetIndexBuffer(g_pPyramidIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  183. // `设置三角形顶点索引值数据排列是triangle list`
  184. g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  185. // `画出金字塔`
  186. g_pDevice->DrawIndexed(12, 0, 0);
  187. }
  188. grid_position[2] += 1.0f;
  189. }
  190. grid_position[0] += 1.0f;
  191. }
  192. // `等待硬件扫描结束, 然后再更新画面.`
  193. pSwapChain->Present(1, 0);
  194. }
  195. #endif // _ENABLE_DX10_