render_dx10.cpp
Upload User: gzqinmao
Upload Date: 2022-07-13
Package Size: 472k
Code Size: 6k
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_pSphereVertexBuffer = NULL;
  7. static ID3D10Buffer *g_pSphereIndexBuffer = NULL;
  8. static ID3D10Buffer *g_pConstantBuffer = NULL;
  9. static ID3D10VertexShader *g_pVertexShader = NULL;
  10. static ID3D10PixelShader *g_pPixelShader = NULL;
  11. static ID3D10RasterizerState *g_pRasterizerState= NULL;
  12. static Matrix4x4 g_proj_matrix;
  13. bool InitResourceDX10(void)
  14. {
  15. g_pDevice = GutGetGraphicsDeviceDX10();
  16. ID3D10Blob *pVSCode = NULL;
  17. // 载入Vertex Shader
  18. g_pVertexShader = GutLoadVertexShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "VS", "vs_4_0", &pVSCode);
  19. if ( NULL==g_pVertexShader )
  20. return false;
  21. // 载入Pixel Shader
  22. g_pPixelShader = GutLoadPixelShaderDX10_HLSL("../../shaders/vertex_color_dx10.hlsl", "PS", "ps_4_0");
  23. if ( NULL==g_pPixelShader )
  24. return false;
  25.     // 设置Vertex数据格式
  26.     D3D10_INPUT_ELEMENT_DESC layout[] =
  27. {
  28. { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D10_INPUT_PER_VERTEX_DATA, 0 },
  29. { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
  30. };
  31.     if ( D3D_OK != g_pDevice->CreateInputLayout( layout, sizeof(layout)/sizeof(D3D10_INPUT_ELEMENT_DESC), pVSCode->GetBufferPointer(), pVSCode->GetBufferSize(), &g_pVertexLayout ) )
  32. return false;
  33. SAFE_RELEASE(pVSCode);
  34. D3D10_BUFFER_DESC cbDesc;
  35.     cbDesc.ByteWidth = sizeof(Vertex_VC) * g_iNumSphereVertices;
  36.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  37.     cbDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  38.     cbDesc.CPUAccessFlags = 0;
  39.     cbDesc.MiscFlags = 0;
  40. // 打开Vertex Buffer时同时把数据拷贝过去
  41. D3D10_SUBRESOURCE_DATA sbDesc;
  42. sbDesc.pSysMem = g_pSphereVertices;
  43. // 分配一块可以存放Vertex的内存, 也就是Vertex Buffer.
  44. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pSphereVertexBuffer ) )
  45. return false;
  46. // 设置一块可以用来放Index的内存.
  47.     cbDesc.ByteWidth = sizeof(unsigned short) * g_iNumSphereIndices;
  48.     cbDesc.Usage = D3D10_USAGE_IMMUTABLE;
  49.     cbDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
  50.     cbDesc.CPUAccessFlags = 0;
  51.     cbDesc.MiscFlags = 0;
  52. // 打开Index Buffer时同时把数据拷贝过去
  53. sbDesc.pSysMem = g_pSphereIndices;
  54.     // 分配一块可以存放Index的内存, 也就是Index Buffer.
  55. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, &sbDesc, &g_pSphereIndexBuffer ) )
  56. return false;
  57. // 分配Shader读取参数的内存空间
  58.     cbDesc.ByteWidth = sizeof(Matrix4x4);
  59.     cbDesc.Usage = D3D10_USAGE_DYNAMIC;
  60.     cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
  61.     cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  62.     cbDesc.MiscFlags = 0;
  63. if ( D3D_OK != g_pDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer ) )
  64. return false;
  65. // 计算出一个可以转换到镜头坐标系的矩阵
  66. g_proj_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, 1.0f, 0.1f, 100.0f);
  67. // 打开rasterizer state对象
  68. D3D10_RASTERIZER_DESC rasterizer_state_desc;
  69. rasterizer_state_desc.FillMode = D3D10_FILL_SOLID;
  70. rasterizer_state_desc.CullMode = D3D10_CULL_BACK;
  71. rasterizer_state_desc.FrontCounterClockwise = true;
  72. rasterizer_state_desc.DepthBias = 0;
  73. rasterizer_state_desc.DepthBiasClamp = 0.0f;
  74. rasterizer_state_desc.SlopeScaledDepthBias = 0.0f;
  75. rasterizer_state_desc.DepthClipEnable = false;
  76. rasterizer_state_desc.ScissorEnable = false;
  77. rasterizer_state_desc.MultisampleEnable = false;
  78. rasterizer_state_desc.AntialiasedLineEnable = false;
  79. if ( D3D_OK != g_pDevice->CreateRasterizerState(&rasterizer_state_desc, &g_pRasterizerState) )
  80. return false;
  81. g_pDevice->RSSetState(g_pRasterizerState);
  82. return true;
  83. }
  84. bool ReleaseResourceDX10(void)
  85. {
  86.   SAFE_RELEASE(g_pVertexLayout);
  87.   SAFE_RELEASE(g_pSphereVertexBuffer);
  88.   SAFE_RELEASE(g_pSphereIndexBuffer);
  89.   SAFE_RELEASE(g_pConstantBuffer);
  90.   SAFE_RELEASE(g_pVertexShader);
  91.   SAFE_RELEASE(g_pPixelShader);
  92. SAFE_RELEASE(g_pRasterizerState);
  93. return true;
  94. }
  95. void ResizeWindowDX10(int width, int height)
  96. {
  97. GutResetGraphicsDeviceDX10();
  98. float aspect = (float) height / (float) width;
  99. g_proj_matrix = GutMatrixPerspectiveRH_DirectX(90.0f, aspect, 0.1f, 100.0f);
  100. }
  101. void RenderFrameDX10(void)
  102. {
  103. Vector4 vClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  104. UINT stride = sizeof(Vertex_VC);
  105. UINT offset = 0;
  106. // 获得调用GutCreateGraphicsDeviceDX10时所生成的D3D10对象
  107. ID3D10RenderTargetView *pRenderTargetView = GutGetDX10RenderTargetView(); //frame buffer
  108.     ID3D10DepthStencilView *pDepthStencilView = GutGetDX10DepthStencilView(); //depth/stencil buffer
  109. IDXGISwapChain *pSwapChain = GutGetDX10SwapChain(); // front/back buffer
  110. // 清除颜色
  111. g_pDevice->ClearRenderTargetView(pRenderTargetView, (float *)&vClearColor);
  112. // 清除Depth/Stencil buffer
  113. g_pDevice->ClearDepthStencilView(pDepthStencilView, D3D10_CLEAR_DEPTH | D3D10_CLEAR_STENCIL, 1.0f, 0);
  114. // 设置vertex shader
  115. g_pDevice->VSSetShader(g_pVertexShader);
  116. // 设置pixel shader
  117. g_pDevice->PSSetShader(g_pPixelShader);
  118. // 设置vertex shader读取参数的内存位罝
  119.     g_pDevice->VSSetConstantBuffers(0, 1, &g_pConstantBuffer);
  120. // 设置vertex数据格式
  121. g_pDevice->IASetInputLayout(g_pVertexLayout);
  122. // 计算出一个可以转换到镜头坐标系的矩阵
  123. Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
  124. Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix;
  125. // 设置shader参数
  126. Matrix4x4 *pConstData;
  127. g_pConstantBuffer->Map( D3D10_MAP_WRITE_DISCARD, NULL, (void **) &pConstData );
  128. *pConstData = view_proj_matrix;
  129. g_pConstantBuffer->Unmap();
  130. // 设置vertex buffer
  131. g_pDevice->IASetVertexBuffers(0, 1, &g_pSphereVertexBuffer, &stride, &offset);
  132. // 设置index buffer
  133. g_pDevice->IASetIndexBuffer(g_pSphereIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  134. // 设置三角形顶点索引值数据排列是triangle strip
  135. g_pDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  136. // 画出道路
  137. g_pDevice->DrawIndexed(g_iNumSphereIndices, 0, 0);
  138. // 等待硬件扫描结束, 然后再更新画面
  139. pSwapChain->Present(1, 0);
  140. }
  141. #endif