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