render_dx10.cpp
Upload User: gzqinmao
Upload Date: 2022-07-13
Package Size: 472k
Code Size: 5k
Category:

OpenGL program

Development Platform:

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_pVertexBuffer = NULL;
  7. static ID3D10Buffer *g_pConstantBuffer = NULL;
  8. static ID3D10VertexShader *g_pVertexShader = NULL;
  9. static ID3D10PixelShader *g_pPixelShader = NULL;
  10. static Matrix4x4 g_view_proj_matrix;
  11. bool InitResourceDX10(void)
  12. {
  13. g_pDevice = GutGetGraphicsDeviceDX10();
  14. ID3D10Blob *pVSCode = NULL;
  15. // `载入Vertex Shader`
  16. g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_transform_dx10.shader", "VS", "vs_4_0", &pVSCode);
  17. if ( NULL==g_pVertexShader )
  18. return false;
  19. // `载入Pixel Shader`
  20. g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_transform_dx10.shader", "PS", "ps_4_0");
  21. if ( NULL==g_pPixelShader )
  22. return false;
  23.     // `设置Vertex数据格式`
  24.     D3D10_INPUT_ELEMENT_DESC layout[] =
  25. {
  26. { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
  27. };
  28.     if ( D3D_OK != g_pDevice->CreateInputLayout( layout, 1, pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) )
  29. return false;
  30. SAFE_RELEASE(pVSCode);
  31. // `设置一块可以用来放Vertex的内存.`
  32.     D3D10_BUFFER_DESC cbDesc;
  33.     cbDesc.ByteWidth = sizeof(g_vertices);
  34.     cbDesc.Usage = D3D10_USAGE_DYNAMIC;
  35.     cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  36.     cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  37.     cbDesc.MiscFlags = 0;
  38.     // `分配一块可以存放Vertex的内存, 也就是Vertex Buffer.`
  39. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pVertexBuffer ) )
  40. return false;
  41.     // `把数据拷贝到显示适配器内存的Vertex Buffer`
  42.     Vector4 *pVertexBuffer;
  43.     g_pVertexBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pVertexBuffer );
  44. memcpy(pVertexBuffer, g_vertices, sizeof(g_vertices));
  45. g_pVertexBuffer->Unmap();
  46.     // `分配Shader读取参数的内存空间`
  47.     cbDesc.ByteWidth = sizeof(Matrix4x4);
  48.     cbDesc.Usage = D3D10_USAGE_DYNAMIC;
  49.     cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
  50.     cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  51.     cbDesc.MiscFlags = 0;
  52. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) )
  53. return false;
  54. // `计算出一个可以转换到镜头坐标系的矩阵`
  55. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  56. Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_DirectX(60.0f, 1.0f, 1.0f, 100.0f);
  57. g_view_proj_matrix = view_matrix * projection_matrix;
  58. return true;
  59. }
  60. bool ReleaseResourceDX10(void)
  61. {
  62.   SAFE_RELEASE(g_pVertexLayout);
  63.   SAFE_RELEASE(g_pVertexBuffer);
  64.   SAFE_RELEASE(g_pConstantBuffer);
  65.   SAFE_RELEASE(g_pVertexShader);
  66.   SAFE_RELEASE(g_pPixelShader);
  67. return true;
  68. }
  69. void RenderFrameDX10(void)
  70. {
  71. Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  72. UINT stride = sizeof(Vector4);
  73. UINT offset = 0;
  74. Matrix4x4 world_view_proj_matrix;
  75. Matrix4x4 world_matrix;
  76.     Matrix4x4 *pConstData;
  77. // `获得调用GutCreateGraphicsDeviceDX10时所生成的D3D10对象`
  78. //frame buffer
  79. ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); 
  80. //depth/stencil buffer
  81.     ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); 
  82. // front/back buffer
  83. IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); 
  84. // `清除颜色`
  85. g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor);
  86. // `清除Depth/Stencil buffer`
  87. g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);
  88. // `设置vertex shader`
  89. g_pDevice->VSSetShader(g_pVertexShader);
  90. // `设置pixel shader`
  91. g_pDevice->PSSetShader(g_pPixelShader);
  92. // `设置vertex shader读取参数的内存位罝`
  93.     g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);
  94. // `设置vertex数据格式`
  95. g_pDevice->IASetInputLayout(g_pVertexLayout);
  96. // `设置vertex buffer`
  97. g_pDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);
  98.     // `设置要画线`
  99. g_pDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_LINELIST );
  100. // `4个金字塔的位置`
  101. Vector4 pos[4] = 
  102. {
  103. Vector4(-1.0f, -1.0f, 0.0f),
  104. Vector4( 1.0f, -1.0f, 0.0f),
  105. Vector4(-1.0f,  1.0f, 0.0f),
  106. Vector4( 1.0f,  1.0f, 0.0f),
  107. };
  108. for ( int i=0; i<4; i++ )
  109. {
  110. // `设置转换矩阵`
  111. world_matrix.Translate_Replace(pos[i]);
  112. world_view_proj_matrix = world_matrix * g_view_proj_matrix;
  113. // `设置shader参数`
  114. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  115. *pConstData = world_view_proj_matrix;
  116. g_pConstantBuffer->Unmap();
  117. // `画线`
  118. g_pDevice->Draw(16, 0);
  119. }
  120. // `更新画面`
  121. pSwapChain->Present(0, 0);
  122. }
  123. #endif // _ENABLE_DX10_