{"id":68679,"date":"2026-01-30T13:24:57","date_gmt":"2026-01-30T05:24:57","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/68679.html"},"modified":"2026-01-30T13:24:57","modified_gmt":"2026-01-30T05:24:57","slug":"%e7%ac%ac13%e7%ab%a0-direct3d%e6%a0%b8%e5%bf%83%e7%bc%96%e7%a8%8b%e7%b2%be%e8%a6%81-%e4%bb%8e%e5%88%9d%e5%a7%8b%e5%8c%96%e5%88%b0%e6%b8%b2%e6%9f%93%e6%b5%81%e6%b0%b4%e7%ba%bf","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/68679.html","title":{"rendered":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf"},"content":{"rendered":"<h2>\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf<\/h2>\n<h3>13.1 Direct3D\u521d\u59cb\u5316\u6df1\u5ea6\u89e3\u6790\u4e0e\u5546\u4e1a\u5b9e\u8df5<\/h3>\n<h4>13.1.1 Direct3D\u8bbe\u5907\u521b\u5efa\u7684\u827a\u672f<\/h4>\n<p>\u5728\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d&#xff0c;Direct3D\u8bbe\u5907\u7684\u521b\u5efa\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u6280\u672f\u6b65\u9aa4&#xff0c;\u66f4\u662f\u6027\u80fd\u548c\u517c\u5bb9\u6027\u7684\u5e73\u8861\u827a\u672f\u3002\u4ee5\u300a\u5deb\u5e083&#xff1a;\u72c2\u730e\u300b\u4e3a\u4f8b&#xff0c;\u8fd9\u6b3e\u6e38\u620f\u9700\u8981\u652f\u6301\u4eceDirectX 9\u5230DirectX 11\u7684\u5404\u79cd\u786c\u4ef6\u914d\u7f6e&#xff0c;\u56e0\u6b64\u5176\u8bbe\u5907\u521b\u5efa\u903b\u8f91\u5fc5\u987b\u8db3\u591f\u5065\u58ee\u548c\u7075\u6d3b\u3002<\/p>\n<p>Windows\u6e38\u620f\u7f16\u7a0b\u7406\u8bba\u4e2d&#xff0c;\u8bbe\u5907\u521b\u5efa\u7684\u6838\u5fc3\u662f\u7406\u89e3\u7279\u6027\u7ea7\u522b&#xff08;Feature Level&#xff09;\u7684\u6982\u5ff5\u3002\u7279\u6027\u7ea7\u522b\u5b9a\u4e49\u4e86GPU\u652f\u6301\u7684\u529f\u80fd\u96c6&#xff0c;\u4ece9.1\u523011.0&#xff0c;\u6bcf\u4e2a\u7ea7\u522b\u90fd\u5bf9\u5e94\u7740\u4e0d\u540c\u7684\u786c\u4ef6\u80fd\u529b\u3002\u5546\u4e1a\u6e38\u620f\u901a\u5e38\u4f1a\u4ece\u6700\u9ad8\u7ea7\u522b\u5f00\u59cb\u5c1d\u8bd5&#xff0c;\u7136\u540e\u9010\u6b65\u964d\u7ea7\u76f4\u5230\u627e\u5230\u5408\u9002\u7684\u7ea7\u522b\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u5546\u4e1a\u7ea7\u7684\u8bbe\u5907\u521b\u5efa\u51fd\u6570&#xff0c;\u5b83\u8003\u8651\u4e86\u591a\u79cd\u786c\u4ef6\u914d\u7f6e\u548c\u9519\u8bef\u5904\u7406&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;windows.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;d3d11.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;dxgi.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;d3d11.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;dxgi.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Direct3DDeviceManager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">GPUInfo<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>wstring description<span class=\"token punctuation\">;<\/span><br \/>\n        UINT dedicatedVideoMemory<span class=\"token punctuation\">;<\/span><br \/>\n        UINT dedicatedSystemMemory<span class=\"token punctuation\">;<\/span><br \/>\n        UINT sharedSystemMemory<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">bool<\/span> isPrimaryAdapter<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>GPUInfo<span class=\"token operator\">&gt;<\/span> gpuList<span class=\"token punctuation\">;<\/span><br \/>\n    IDXGIFactory<span class=\"token operator\">*<\/span> dxgiFactory<span class=\"token punctuation\">;<\/span><br \/>\n    IDXGIAdapter<span class=\"token operator\">*<\/span> selectedAdapter<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Device<span class=\"token operator\">*<\/span> direct3DDevice<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><br \/>\n    D3D_FEATURE_LEVEL selectedFeatureLevel<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Direct3DDeviceManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">dxgiFactory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">selectedAdapter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">direct3DDevice<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">selectedFeatureLevel<\/span><span class=\"token punctuation\">(<\/span>D3D_FEATURE_LEVEL_9_1<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> enableDebugLayer <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        HRESULT result <span class=\"token operator\">&#061;<\/span> S_OK<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 1. \u521b\u5efaDXGI\u5de5\u5382<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">CreateDXGIFactory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__uuidof<\/span><span class=\"token punctuation\">(<\/span>IDXGIFactory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dxgiFactory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">LogError<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;\u521b\u5efaDXGI\u5de5\u5382\u5931\u8d25&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 2. \u679a\u4e3e\u6240\u6709GPU\u5e76\u9009\u62e9\u6700\u4f73\u9002\u914d\u5668<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">EnumerateAndSelectGPU<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 3. \u5b9a\u4e49\u7279\u6027\u7ea7\u522b\u6570\u7ec4&#xff08;\u4ece\u9ad8\u5230\u4f4e\u5c1d\u8bd5&#xff09;<\/span><br \/>\n        D3D_FEATURE_LEVEL featureLevels<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            D3D_FEATURE_LEVEL_11_1<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ Windows 8\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_11_0<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ Windows 7\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_10_1<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ Windows Vista SP2\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_10_0<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ Windows Vista\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_9_3<span class=\"token punctuation\">,<\/span>   <span class=\"token comment\">\/\/ Windows 7\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_9_2<span class=\"token punctuation\">,<\/span>   <span class=\"token comment\">\/\/ Windows 7\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n            D3D_FEATURE_LEVEL_9_1    <span class=\"token comment\">\/\/ Windows 7\u53ca\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 4. \u521b\u5efa\u6807\u5fd7<\/span><br \/>\n        UINT creationFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>enableDebugLayer<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            creationFlags <span class=\"token operator\">|&#061;<\/span> D3D11_CREATE_DEVICE_DEBUG<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u521b\u5efa\u8bbe\u5907\u548c\u4e0a\u4e0b\u6587<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">D3D11CreateDevice<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            selectedAdapter<span class=\"token punctuation\">,<\/span><br \/>\n            selectedAdapter <span class=\"token operator\">?<\/span> D3D_DRIVER_TYPE_UNKNOWN <span class=\"token operator\">:<\/span> D3D_DRIVER_TYPE_HARDWARE<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            creationFlags<span class=\"token punctuation\">,<\/span><br \/>\n            featureLevels<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">ARRAYSIZE<\/span><span class=\"token punctuation\">(<\/span>featureLevels<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            D3D11_SDK_VERSION<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>direct3DDevice<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>selectedFeatureLevel<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>deviceContext<br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 6. \u5982\u679c\u4f7f\u7528\u786c\u4ef6\u9002\u914d\u5668\u5931\u8d25&#xff0c;\u5c1d\u8bd5\u4f7f\u7528WARP\u8f6f\u4ef6\u9002\u914d\u5668<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">LogWarning<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;\u786c\u4ef6\u8bbe\u5907\u521b\u5efa\u5931\u8d25&#xff0c;\u5c1d\u8bd5WARP\u8f6f\u4ef6\u8bbe\u5907&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">D3D11CreateDevice<\/span><span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                D3D_DRIVER_TYPE_WARP<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ WARP\u8f6f\u4ef6\u6e32\u67d3\u5668<\/span><br \/>\n                <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                creationFlags<span class=\"token punctuation\">,<\/span><br \/>\n                featureLevels<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token function\">ARRAYSIZE<\/span><span class=\"token punctuation\">(<\/span>featureLevels<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                D3D11_SDK_VERSION<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token operator\">&amp;<\/span>direct3DDevice<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token operator\">&amp;<\/span>selectedFeatureLevel<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token operator\">&amp;<\/span>deviceContext<br \/>\n            <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">LogError<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;WARP\u8bbe\u5907\u521b\u5efa\u4e5f\u5931\u8d25&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 7. \u8f93\u51fa\u8bbe\u5907\u4fe1\u606f<\/span><br \/>\n        <span class=\"token function\">LogDeviceInfo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">EnumerateAndSelectGPU<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        IDXGIAdapter<span class=\"token operator\">*<\/span> adapter <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        UINT adapterIndex <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        GPUInfo bestAdapter<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">bool<\/span> foundBest <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u679a\u4e3e\u6240\u6709\u9002\u914d\u5668<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>dxgiFactory<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">EnumAdapters<\/span><span class=\"token punctuation\">(<\/span>adapterIndex<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>adapter<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> DXGI_ERROR_NOT_FOUND<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            GPUInfo gpuInfo<span class=\"token punctuation\">;<\/span><br \/>\n            DXGI_ADAPTER_DESC adapterDesc<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>adapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetDesc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>adapterDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                gpuInfo<span class=\"token punctuation\">.<\/span>description <span class=\"token operator\">&#061;<\/span> adapterDesc<span class=\"token punctuation\">.<\/span>Description<span class=\"token punctuation\">;<\/span><br \/>\n                gpuInfo<span class=\"token punctuation\">.<\/span>dedicatedVideoMemory <span class=\"token operator\">&#061;<\/span> adapterDesc<span class=\"token punctuation\">.<\/span>DedicatedVideoMemory<span class=\"token punctuation\">;<\/span><br \/>\n                gpuInfo<span class=\"token punctuation\">.<\/span>dedicatedSystemMemory <span class=\"token operator\">&#061;<\/span> adapterDesc<span class=\"token punctuation\">.<\/span>DedicatedSystemMemory<span class=\"token punctuation\">;<\/span><br \/>\n                gpuInfo<span class=\"token punctuation\">.<\/span>sharedSystemMemory <span class=\"token operator\">&#061;<\/span> adapterDesc<span class=\"token punctuation\">.<\/span>SharedSystemMemory<span class=\"token punctuation\">;<\/span><br \/>\n                gpuInfo<span class=\"token punctuation\">.<\/span>isPrimaryAdapter <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>adapterIndex <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                gpuList<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>gpuInfo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u9009\u62e9\u7b56\u7565&#xff1a;\u4f18\u5148\u9009\u62e9\u4e13\u7528\u663e\u5b58\u6700\u5927\u7684GPU<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>foundBest <span class=\"token operator\">||<\/span> gpuInfo<span class=\"token punctuation\">.<\/span>dedicatedVideoMemory <span class=\"token operator\">&gt;<\/span> bestAdapter<span class=\"token punctuation\">.<\/span>dedicatedVideoMemory<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    bestAdapter <span class=\"token operator\">&#061;<\/span> gpuInfo<span class=\"token punctuation\">;<\/span><br \/>\n                    foundBest <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token comment\">\/\/ \u66f4\u65b0\u9009\u4e2d\u7684\u9002\u914d\u5668<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>selectedAdapter<span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><br \/>\n                        selectedAdapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                    adapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">AddRef<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    selectedAdapter <span class=\"token operator\">&#061;<\/span> adapter<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            adapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            adapterIndex<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>foundBest<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">LogWarning<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;\u672a\u627e\u5230\u5408\u9002\u7684GPU\u9002\u914d\u5668&#xff0c;\u5c06\u4f7f\u7528\u9ed8\u8ba4\u9002\u914d\u5668&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u4f7f\u7528\u9ed8\u8ba4\u9002\u914d\u5668&#xff08;NULL\u8868\u793a\u4f7f\u7528\u9ed8\u8ba4&#xff09;<\/span><br \/>\n            selectedAdapter <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">LogDeviceInfo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>wstring featureLevelStr<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>selectedFeatureLevel<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_11_1<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 11.1&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_11_0<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 11.0&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_10_1<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 10.1&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_10_0<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 10.0&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_9_3<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 9.3&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_9_2<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 9.2&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> D3D_FEATURE_LEVEL_9_1<span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D 9.1&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n            featureLevelStr <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Unknown&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        std<span class=\"token double-colon punctuation\">::<\/span>wstring logMessage <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;Direct3D\u8bbe\u5907\u521b\u5efa\u6210\u529f\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;\u7279\u6027\u7ea7\u522b: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> featureLevelStr <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>gpuList<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;GPU\u6570\u91cf: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_wstring<\/span><span class=\"token punctuation\">(<\/span>gpuList<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> gpuList<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;GPU &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_wstring<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> gpuList<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>description <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;  \u4e13\u7528\u663e\u5b58: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_wstring<\/span><span class=\"token punctuation\">(<\/span>gpuList<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>dedicatedVideoMemory <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034; MB\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;  \u4e13\u7528\u7cfb\u7edf\u5185\u5b58: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_wstring<\/span><span class=\"token punctuation\">(<\/span>gpuList<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>dedicatedSystemMemory <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034; MB\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                logMessage <span class=\"token operator\">&#043;&#061;<\/span> L<span class=\"token string\">&#034;  \u5171\u4eab\u7cfb\u7edf\u5185\u5b58: &#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_wstring<\/span><span class=\"token punctuation\">(<\/span>gpuList<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>sharedSystemMemory <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034; MB\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>logMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">LogError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>wstring<span class=\"token operator\">&amp;<\/span> message<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>wstring errorMessage <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;[ERROR] &#034;<\/span> <span class=\"token operator\">&#043;<\/span> message <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>errorMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">LogWarning<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>wstring<span class=\"token operator\">&amp;<\/span> message<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>wstring warningMessage <span class=\"token operator\">&#061;<\/span> L<span class=\"token string\">&#034;[WARNING] &#034;<\/span> <span class=\"token operator\">&#043;<\/span> message <span class=\"token operator\">&#043;<\/span> L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>warningMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>deviceContext<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            deviceContext <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>direct3DDevice<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            direct3DDevice<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            direct3DDevice <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>selectedAdapter<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            selectedAdapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            selectedAdapter <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>dxgiFactory<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            dxgiFactory<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            dxgiFactory <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    ID3D11Device<span class=\"token operator\">*<\/span> <span class=\"token function\">GetDevice<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> direct3DDevice<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> <span class=\"token function\">GetDeviceContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> deviceContext<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    D3D_FEATURE_LEVEL <span class=\"token function\">GetFeatureLevel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> selectedFeatureLevel<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">Direct3DDeviceManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd9\u4e2a\u8bbe\u5907\u7ba1\u7406\u5668\u5c55\u793a\u4e86\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d\u7684\u6700\u4f73\u5b9e\u8df5&#xff1a;<\/p>\n<li>\u5065\u58ee\u7684\u9519\u8bef\u5904\u7406&#xff1a;\u4ece\u6700\u9ad8\u7279\u6027\u7ea7\u522b\u5f00\u59cb\u5c1d\u8bd5&#xff0c;\u9010\u6b65\u964d\u7ea7<\/li>\n<li>\u591aGPU\u652f\u6301&#xff1a;\u81ea\u52a8\u9009\u62e9\u6027\u80fd\u6700\u597d\u7684GPU<\/li>\n<li>\u5907\u7528\u65b9\u6848&#xff1a;\u786c\u4ef6\u52a0\u901f\u5931\u8d25\u65f6\u4f7f\u7528WARP\u8f6f\u4ef6\u6e32\u67d3\u5668<\/li>\n<li>\u8be6\u7ec6\u7684\u65e5\u5fd7&#xff1a;\u5e2e\u52a9\u8c03\u8bd5\u548c\u7528\u6237\u6280\u672f\u652f\u6301<\/li>\n<h4>13.1.2 \u4ea4\u6362\u94fe\u914d\u7f6e\u7684\u5546\u4e1a\u8003\u91cf<\/h4>\n<p>\u4ea4\u6362\u94fe\u914d\u7f6e\u76f4\u63a5\u5f71\u54cd\u6e38\u620f\u7684\u89c6\u89c9\u4f53\u9a8c\u548c\u6027\u80fd\u3002\u5728\u300a\u8d5b\u535a\u670b\u514b2077\u300b\u7b49\u73b0\u4ee3\u6e38\u620f\u4e2d&#xff0c;\u73a9\u5bb6\u53ef\u4ee5\u5728\u591a\u79cd\u663e\u793a\u6a21\u5f0f\u95f4\u5207\u6362&#xff1a;\u5168\u5c4f\u72ec\u5360\u6a21\u5f0f\u3001\u65e0\u8fb9\u6846\u7a97\u53e3\u6a21\u5f0f\u548c\u7a97\u53e3\u6a21\u5f0f\u3002\u6bcf\u79cd\u6a21\u5f0f\u90fd\u6709\u5176\u4f18\u7f3a\u70b9\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u6df1\u5165\u63a2\u8ba8\u4ea4\u6362\u94fe\u914d\u7f6e\u7684\u5404\u4e2a\u65b9\u9762&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;windows.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;d3d11.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;dxgi.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;d3d11.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;dxgi.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DisplayMode<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    FullscreenExclusive<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ \u5168\u5c4f\u72ec\u5360\u6a21\u5f0f&#xff08;\u6700\u4f73\u6027\u80fd&#xff09;<\/span><br \/>\n    BorderlessWindow<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/\/ \u65e0\u8fb9\u6846\u7a97\u53e3\u6a21\u5f0f&#xff08;Alt&#043;Tab\u5207\u6362\u6d41\u7545&#xff09;<\/span><br \/>\n    Windowed              <span class=\"token comment\">\/\/ \u7a97\u53e3\u6a21\u5f0f&#xff08;\u517c\u5bb9\u6027\u6700\u597d&#xff09;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RefreshRateMode<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    VSyncEnabled<span class=\"token punctuation\">,<\/span>         <span class=\"token comment\">\/\/ \u5782\u76f4\u540c\u6b65\u5f00\u542f&#xff08;\u9632\u6b62\u6495\u88c2&#xff0c;\u53ef\u80fd\u9650\u5236\u5e27\u7387&#xff09;<\/span><br \/>\n    VSyncDisabled<span class=\"token punctuation\">,<\/span>        <span class=\"token comment\">\/\/ \u5782\u76f4\u540c\u6b65\u5173\u95ed&#xff08;\u6700\u5927\u5e27\u7387&#xff0c;\u53ef\u80fd\u6495\u88c2&#xff09;<\/span><br \/>\n    AdaptiveSync          <span class=\"token comment\">\/\/ \u81ea\u9002\u5e94\u540c\u6b65&#xff08;G-Sync\/FreeSync&#xff09;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">SwapChainManager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    IDXGISwapChain<span class=\"token operator\">*<\/span> swapChain<span class=\"token punctuation\">;<\/span><br \/>\n    DisplayMode currentDisplayMode<span class=\"token punctuation\">;<\/span><br \/>\n    RefreshRateMode currentRefreshRateMode<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6e\u53c2\u6570<\/span><br \/>\n    UINT width<span class=\"token punctuation\">;<\/span><br \/>\n    UINT height<span class=\"token punctuation\">;<\/span><br \/>\n    DXGI_FORMAT format<span class=\"token punctuation\">;<\/span><br \/>\n    UINT bufferCount<span class=\"token punctuation\">;<\/span><br \/>\n    UINT sampleCount<span class=\"token punctuation\">;<\/span><br \/>\n    UINT sampleQuality<span class=\"token punctuation\">;<\/span><br \/>\n    HWND windowHandle<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5168\u5c4f\u76f8\u5173<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> isFullscreen<span class=\"token punctuation\">;<\/span><br \/>\n    DXGI_MODE_DESC fullscreenMode<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">SwapChainManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">swapChain<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">currentDisplayMode<\/span><span class=\"token punctuation\">(<\/span>DisplayMode<span class=\"token double-colon punctuation\">::<\/span>Windowed<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">currentRefreshRateMode<\/span><span class=\"token punctuation\">(<\/span>RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncEnabled<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">width<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">height<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span>DXGI_FORMAT_R8G8B8A8_UNORM<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">bufferCount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\">\/\/ \u53cc\u7f13\u51b2<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">sampleCount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">sampleQuality<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">windowHandle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">isFullscreen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>fullscreenMode<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>fullscreenMode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">,<\/span><br \/>\n        HWND hwnd<span class=\"token punctuation\">,<\/span><br \/>\n        UINT initialWidth<span class=\"token punctuation\">,<\/span><br \/>\n        UINT initialHeight<span class=\"token punctuation\">,<\/span><br \/>\n        DisplayMode displayMode <span class=\"token operator\">&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>Windowed<span class=\"token punctuation\">,<\/span><br \/>\n        RefreshRateMode refreshRateMode <span class=\"token operator\">&#061;<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncEnabled<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        windowHandle <span class=\"token operator\">&#061;<\/span> hwnd<span class=\"token punctuation\">;<\/span><br \/>\n        width <span class=\"token operator\">&#061;<\/span> initialWidth<span class=\"token punctuation\">;<\/span><br \/>\n        height <span class=\"token operator\">&#061;<\/span> initialHeight<span class=\"token punctuation\">;<\/span><br \/>\n        currentDisplayMode <span class=\"token operator\">&#061;<\/span> displayMode<span class=\"token punctuation\">;<\/span><br \/>\n        currentRefreshRateMode <span class=\"token operator\">&#061;<\/span> refreshRateMode<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u83b7\u53d6DXGI\u5de5\u5382&#xff08;\u901a\u8fc7\u8bbe\u5907\u67e5\u8be2&#xff09;<\/span><br \/>\n        IDXGIDevice<span class=\"token operator\">*<\/span> dxgiDevice <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">QueryInterface<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__uuidof<\/span><span class=\"token punctuation\">(<\/span>IDXGIDevice<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dxgiDevice<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        IDXGIAdapter<span class=\"token operator\">*<\/span> adapter <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> dxgiDevice<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetAdapter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>adapter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        dxgiDevice<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        IDXGIFactory<span class=\"token operator\">*<\/span> factory <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> adapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetParent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__uuidof<\/span><span class=\"token punctuation\">(<\/span>IDXGIFactory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>factory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        adapter<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6839\u636e\u663e\u793a\u6a21\u5f0f\u521b\u5efa\u4ea4\u6362\u94fe<\/span><br \/>\n        DXGI_SWAP_CHAIN_DESC swapChainDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>swapChainDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>swapChainDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u57fa\u672c\u914d\u7f6e<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> format<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>BufferUsage <span class=\"token operator\">&#061;<\/span> DXGI_USAGE_RENDER_TARGET_OUTPUT<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>BufferCount <span class=\"token operator\">&#061;<\/span> bufferCount<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>OutputWindow <span class=\"token operator\">&#061;<\/span> windowHandle<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>Windowed <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>displayMode <span class=\"token operator\">!&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>FullscreenExclusive<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>SwapEffect <span class=\"token operator\">&#061;<\/span> DXGI_SWAP_EFFECT_DISCARD<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>Flags <span class=\"token operator\">&#061;<\/span> DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91c7\u6837\u914d\u7f6e<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> sampleCount<span class=\"token punctuation\">;<\/span><br \/>\n        swapChainDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> sampleQuality<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5237\u65b0\u7387\u914d\u7f6e<\/span><br \/>\n        <span class=\"token function\">ConfigureRefreshRate<\/span><span class=\"token punctuation\">(<\/span>swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6839\u636e\u663e\u793a\u6a21\u5f0f\u8fdb\u884c\u7279\u6b8a\u914d\u7f6e<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>displayMode <span class=\"token operator\">&#061;&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>BorderlessWindow<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u65e0\u8fb9\u6846\u7a97\u53e3\u6a21\u5f0f\u9700\u8981\u7279\u6b8a\u5904\u7406<\/span><br \/>\n            <span class=\"token function\">ConfigureBorderlessWindow<\/span><span class=\"token punctuation\">(<\/span>factory<span class=\"token punctuation\">,<\/span> swapChainDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u4ea4\u6362\u94fe<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> factory<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateSwapChain<\/span><span class=\"token punctuation\">(<\/span>device<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>swapChainDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>swapChain<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>displayMode <span class=\"token operator\">&#061;&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>FullscreenExclusive <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u4e3a\u5168\u5c4f\u6a21\u5f0f<\/span><br \/>\n            swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">SetFullscreenState<\/span><span class=\"token punctuation\">(<\/span>TRUE<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u663e\u793a\u6a21\u5f0f<\/span><br \/>\n            IDXGIOutput<span class=\"token operator\">*<\/span> output <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetContainingOutput<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>output<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> output<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                DXGI_MODE_DESC currentMode<span class=\"token punctuation\">;<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetDesc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>swapChainDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    fullscreenMode <span class=\"token operator\">&#061;<\/span> swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">;<\/span><br \/>\n                    isFullscreen <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                output<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        factory<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ConfigureRefreshRate<\/span><span class=\"token punctuation\">(<\/span>DXGI_MODE_DESC<span class=\"token operator\">&amp;<\/span> bufferDesc<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>currentRefreshRateMode<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncEnabled<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5f00\u542f\u5782\u76f4\u540c\u6b65&#xff0c;\u4f7f\u7528\u663e\u793a\u5668\u7684\u539f\u751f\u5237\u65b0\u7387<\/span><br \/>\n            bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Numerator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u9ed8\u8ba460Hz<\/span><br \/>\n            bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Denominator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncDisabled<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5173\u95ed\u5782\u76f4\u540c\u6b65&#xff0c;\u6700\u5927\u5e27\u7387<\/span><br \/>\n            bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Numerator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Denominator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>AdaptiveSync<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u81ea\u9002\u5e94\u540c\u6b65&#xff0c;\u9700\u8981\u68c0\u6d4b\u663e\u793a\u5668\u652f\u6301<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">IsAdaptiveSyncSupported<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u81ea\u9002\u5e94\u540c\u6b65\u53c2\u6570<\/span><br \/>\n                bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Numerator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Denominator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8fd9\u91cc\u9700\u8981\u8bbe\u7f6e\u7279\u6b8a\u7684\u4ea4\u6362\u94fe\u6807\u5fd7<\/span><br \/>\n                <span class=\"token comment\">\/\/ DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING (Windows 10\u53ca\u66f4\u9ad8\u7248\u672c)<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u4e0d\u652f\u6301\u81ea\u9002\u5e94\u540c\u6b65&#xff0c;\u56de\u9000\u5230\u5782\u76f4\u540c\u6b65<\/span><br \/>\n                bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Numerator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                bufferDesc<span class=\"token punctuation\">.<\/span>RefreshRate<span class=\"token punctuation\">.<\/span>Denominator <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ConfigureBorderlessWindow<\/span><span class=\"token punctuation\">(<\/span>IDXGIFactory<span class=\"token operator\">*<\/span> factory<span class=\"token punctuation\">,<\/span> DXGI_SWAP_CHAIN_DESC<span class=\"token operator\">&amp;<\/span> swapChainDesc<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u83b7\u53d6\u4e3b\u663e\u793a\u5668\u7684\u5c3a\u5bf8<\/span><br \/>\n        IDXGIOutput<span class=\"token operator\">*<\/span> primaryOutput <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>factory<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">EnumOutputs<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>primaryOutput<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> primaryOutput<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            DXGI_OUTPUT_DESC outputDesc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>primaryOutput<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetDesc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>outputDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5c06\u7a97\u53e3\u8bbe\u7f6e\u4e3a\u8986\u76d6\u6574\u4e2a\u663e\u793a\u5668<\/span><br \/>\n                width <span class=\"token operator\">&#061;<\/span> outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>right <span class=\"token operator\">&#8211;<\/span> outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>left<span class=\"token punctuation\">;<\/span><br \/>\n                height <span class=\"token operator\">&#061;<\/span> outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>bottom <span class=\"token operator\">&#8211;<\/span> outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>top<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8c03\u6574\u4ea4\u6362\u94fe\u5c3a\u5bf8<\/span><br \/>\n                swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n                swapChainDesc<span class=\"token punctuation\">.<\/span>BufferDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7a97\u53e3\u6837\u5f0f\u4e3a\u65e0\u8fb9\u6846<\/span><br \/>\n                <span class=\"token function\">SetWindowLong<\/span><span class=\"token punctuation\">(<\/span>windowHandle<span class=\"token punctuation\">,<\/span> GWL_STYLE<span class=\"token punctuation\">,<\/span> WS_POPUP <span class=\"token operator\">|<\/span> WS_VISIBLE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">SetWindowPos<\/span><span class=\"token punctuation\">(<\/span>windowHandle<span class=\"token punctuation\">,<\/span> HWND_TOP<span class=\"token punctuation\">,<\/span><br \/>\n                    outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>left<span class=\"token punctuation\">,<\/span><br \/>\n                    outputDesc<span class=\"token punctuation\">.<\/span>DesktopCoordinates<span class=\"token punctuation\">.<\/span>top<span class=\"token punctuation\">,<\/span><br \/>\n                    width<span class=\"token punctuation\">,<\/span> height<span class=\"token punctuation\">,<\/span><br \/>\n                    SWP_FRAMECHANGED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            primaryOutput<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">IsAdaptiveSyncSupported<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728\u5b9e\u9645\u5e94\u7528\u4e2d&#xff0c;\u8fd9\u91cc\u9700\u8981\u68c0\u6d4bG-Sync\u6216FreeSync\u652f\u6301<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b80\u5316\u7248\u672c&#xff1a;\u603b\u662f\u8fd4\u56defalse<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Resize<\/span><span class=\"token punctuation\">(<\/span>UINT newWidth<span class=\"token punctuation\">,<\/span> UINT newHeight<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>swapChain<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91ca\u653e\u73b0\u6709\u7684\u6e32\u67d3\u76ee\u6807\u89c6\u56fe\u7b49\u8d44\u6e90<\/span><br \/>\n        <span class=\"token comment\">\/\/ &#xff08;\u8fd9\u91cc\u5047\u8bbe\u8c03\u7528\u8005\u5df2\u7ecf\u91ca\u653e\u4e86\u76f8\u5173\u8d44\u6e90&#xff09;<\/span><\/p>\n<p>        width <span class=\"token operator\">&#061;<\/span> newWidth<span class=\"token punctuation\">;<\/span><br \/>\n        height <span class=\"token operator\">&#061;<\/span> newHeight<span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ResizeBuffers<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            bufferCount<span class=\"token punctuation\">,<\/span><br \/>\n            width<span class=\"token punctuation\">,<\/span><br \/>\n            height<span class=\"token punctuation\">,<\/span><br \/>\n            format<span class=\"token punctuation\">,<\/span><br \/>\n            DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH<br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">ToggleFullscreen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>swapChain<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        BOOL isCurrentlyFullscreen <span class=\"token operator\">&#061;<\/span> FALSE<span class=\"token punctuation\">;<\/span><br \/>\n        IDXGIOutput<span class=\"token operator\">*<\/span> currentOutput <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u5168\u5c4f\u72b6\u6001<\/span><br \/>\n        swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetFullscreenState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>isCurrentlyFullscreen<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>currentOutput<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u5207\u6362\u5168\u5c4f\u72b6\u6001<\/span><br \/>\n        HRESULT result <span class=\"token operator\">&#061;<\/span> swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">SetFullscreenState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>isCurrentlyFullscreen<span class=\"token punctuation\">,<\/span> currentOutput<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentOutput<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            currentOutput<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            isFullscreen <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">!<\/span>isCurrentlyFullscreen<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>isFullscreen<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                currentDisplayMode <span class=\"token operator\">&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>FullscreenExclusive<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                currentDisplayMode <span class=\"token operator\">&#061;<\/span> DisplayMode<span class=\"token double-colon punctuation\">::<\/span>Windowed<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">SetRefreshRateMode<\/span><span class=\"token punctuation\">(<\/span>RefreshRateMode mode<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentRefreshRateMode <span class=\"token operator\">&#061;&#061;<\/span> mode<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        currentRefreshRateMode <span class=\"token operator\">&#061;<\/span> mode<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u9700\u8981\u91cd\u65b0\u521b\u5efa\u4ea4\u6362\u94fe\u6765\u5e94\u7528\u65b0\u7684\u5237\u65b0\u7387\u8bbe\u7f6e<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728\u5b9e\u9645\u5e94\u7528\u4e2d&#xff0c;\u8fd9\u91cc\u5e94\u8be5\u4fdd\u5b58\u5f53\u524d\u72b6\u6001\u5e76\u91cd\u65b0\u521d\u59cb\u5316<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Present<\/span><span class=\"token punctuation\">(<\/span>UINT syncInterval <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> UINT flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>swapChain<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6839\u636e\u5237\u65b0\u7387\u6a21\u5f0f\u8c03\u6574\u5448\u73b0\u53c2\u6570<\/span><br \/>\n        UINT presentFlags <span class=\"token operator\">&#061;<\/span> flags<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>currentRefreshRateMode<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncEnabled<span class=\"token operator\">:<\/span><br \/>\n            syncInterval <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u7b49\u5f85\u5782\u76f4\u540c\u6b65<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>VSyncDisabled<span class=\"token operator\">:<\/span><br \/>\n            syncInterval <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u7acb\u5373\u5448\u73b0<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> RefreshRateMode<span class=\"token double-colon punctuation\">::<\/span>AdaptiveSync<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">IsAdaptiveSyncSupported<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                syncInterval <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                presentFlags <span class=\"token operator\">|&#061;<\/span> DXGI_PRESENT_ALLOW_TEARING<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                syncInterval <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Present<\/span><span class=\"token punctuation\">(<\/span>syncInterval<span class=\"token punctuation\">,<\/span> presentFlags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>swapChain<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5207\u6362\u5230\u7a97\u53e3\u6a21\u5f0f\u518d\u91ca\u653e&#xff0c;\u907f\u514d\u5168\u5c4f\u72b6\u6001\u7684\u95ee\u9898<\/span><br \/>\n            swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">SetFullscreenState<\/span><span class=\"token punctuation\">(<\/span>FALSE<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            swapChain<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            swapChain <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    IDXGISwapChain<span class=\"token operator\">*<\/span> <span class=\"token function\">GetSwapChain<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> swapChain<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    UINT <span class=\"token function\">GetWidth<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> width<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    UINT <span class=\"token function\">GetHeight<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> height<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    DisplayMode <span class=\"token function\">GetDisplayMode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> currentDisplayMode<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    RefreshRateMode <span class=\"token function\">GetRefreshRateMode<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> currentRefreshRateMode<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">SwapChainManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd9\u4e2a\u4ea4\u6362\u94fe\u7ba1\u7406\u5668\u5904\u7406\u4e86\u73b0\u4ee3\u6e38\u620f\u4e2d\u7684\u591a\u79cd\u663e\u793a\u914d\u7f6e\u9700\u6c42&#xff1a;<\/p>\n<li>\u591a\u79cd\u663e\u793a\u6a21\u5f0f\u652f\u6301&#xff1a;\u5168\u5c4f\u72ec\u5360\u3001\u65e0\u8fb9\u6846\u7a97\u53e3\u3001\u7a97\u53e3\u6a21\u5f0f<\/li>\n<li>\u5237\u65b0\u7387\u63a7\u5236&#xff1a;\u5782\u76f4\u540c\u6b65\u3001\u65e0\u9650\u5236\u5e27\u7387\u3001\u81ea\u9002\u5e94\u540c\u6b65<\/li>\n<li>\u52a8\u6001\u8c03\u6574&#xff1a;\u7a97\u53e3\u5927\u5c0f\u6539\u53d8\u65f6\u81ea\u52a8\u8c03\u6574\u4ea4\u6362\u94fe<\/li>\n<li>\u6027\u80fd\u4f18\u5316&#xff1a;\u6839\u636e\u663e\u793a\u6a21\u5f0f\u4f18\u5316\u5448\u73b0\u53c2\u6570<\/li>\n<h4>13.1.3 \u6df1\u5ea6\u6a21\u677f\u7f13\u51b2\u533a\u7684\u5546\u4e1a\u7ea7\u5b9e\u73b0<\/h4>\n<p>\u6df1\u5ea6\u6a21\u677f\u7f13\u51b2\u533a\u5bf9\u4e8e3D\u6e38\u620f\u7684\u6b63\u786e\u6e32\u67d3\u81f3\u5173\u91cd\u8981\u3002\u5728\u300a\u8352\u91ce\u5927\u9556\u5ba22\u300b\u7b49\u5f00\u653e\u4e16\u754c\u6e38\u620f\u4e2d&#xff0c;\u590d\u6742\u7684\u573a\u666f\u9700\u8981\u9ad8\u6548\u7684\u6df1\u5ea6\u7ba1\u7406\u6765\u786e\u4fdd\u6b63\u786e\u7684\u7269\u4f53\u906e\u6321\u5173\u7cfb\u3002<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;windows.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;d3d11.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;dxgi.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;d3d11.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">DepthStencilManager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">DepthStencilConfig<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        DXGI_FORMAT format<span class=\"token punctuation\">;<\/span><br \/>\n        UINT width<span class=\"token punctuation\">;<\/span><br \/>\n        UINT height<span class=\"token punctuation\">;<\/span><br \/>\n        UINT sampleCount<span class=\"token punctuation\">;<\/span><br \/>\n        UINT sampleQuality<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">bool<\/span> enableDepthTest<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">bool<\/span> enableStencilTest<span class=\"token punctuation\">;<\/span><br \/>\n        D3D11_COMPARISON_FUNC depthComparisonFunc<span class=\"token punctuation\">;<\/span><br \/>\n        D3D11_DEPTH_WRITE_MASK depthWriteMask<span class=\"token punctuation\">;<\/span><br \/>\n        UINT stencilReadMask<span class=\"token punctuation\">;<\/span><br \/>\n        UINT stencilWriteMask<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6df1\u5ea6\u6a21\u677f\u8d44\u6e90<\/span><br \/>\n    ID3D11Texture2D<span class=\"token operator\">*<\/span> depthStencilTexture<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DepthStencilView<span class=\"token operator\">*<\/span> depthStencilView<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DepthStencilState<span class=\"token operator\">*<\/span> depthStencilState<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u914d\u7f6e<\/span><br \/>\n    DepthStencilConfig currentConfig<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a&#xff08;\u7528\u4e8e\u7279\u6b8a\u6548\u679c&#xff0c;\u5982\u6df1\u5ea6\u5265\u79bb&#xff09;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>ID3D11Texture2D<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> multiDepthTextures<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>ID3D11DepthStencilView<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span> multiDepthViews<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">DepthStencilManager<\/span><span class=\"token punctuation\">(<\/span>ID3D11Device<span class=\"token operator\">*<\/span> dev<span class=\"token punctuation\">,<\/span> ID3D11DeviceContext<span class=\"token operator\">*<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">device<\/span><span class=\"token punctuation\">(<\/span>dev<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthStencilTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthStencilView<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthStencilState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9ed8\u8ba4\u914d\u7f6e<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_D24_UNORM_S8_UINT<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>sampleCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>sampleQuality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableStencilTest <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>depthComparisonFunc <span class=\"token operator\">&#061;<\/span> D3D11_COMPARISON_LESS<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>depthWriteMask <span class=\"token operator\">&#061;<\/span> D3D11_DEPTH_WRITE_MASK_ALL<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>stencilReadMask <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0xFF<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>stencilWriteMask <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0xFF<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span>UINT width<span class=\"token punctuation\">,<\/span> UINT height<span class=\"token punctuation\">,<\/span> UINT sampleCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> UINT sampleQuality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>sampleCount <span class=\"token operator\">&#061;<\/span> sampleCount<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>sampleQuality <span class=\"token operator\">&#061;<\/span> sampleQuality<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">CreateDepthStencilResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateDepthStencilResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6e05\u7406\u73b0\u6709\u8d44\u6e90<\/span><br \/>\n        <span class=\"token function\">ReleaseResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u7eb9\u7406<\/span><br \/>\n        D3D11_TEXTURE2D_DESC depthStencilDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        depthStencilDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>format<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>sampleCount<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>sampleQuality<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_DEPTH_STENCIL<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u89c6\u56fe<\/span><br \/>\n        D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilViewDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilViewDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        depthStencilViewDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>format<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>sampleCount <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilViewDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2DMS<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilViewDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2D<span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilViewDesc<span class=\"token punctuation\">.<\/span>Texture2D<span class=\"token punctuation\">.<\/span>MipSlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilViewDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u72b6\u6001<\/span><br \/>\n        D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilStateDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6df1\u5ea6\u6d4b\u8bd5\u914d\u7f6e<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthEnable <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthWriteMask <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>depthWriteMask<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthFunc <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>depthComparisonFunc<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6a21\u677f\u6d4b\u8bd5\u914d\u7f6e<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>StencilEnable <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>enableStencilTest<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>StencilReadMask <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>stencilReadMask<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>StencilWriteMask <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>stencilWriteMask<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6b63\u9762\u591a\u8fb9\u5f62\u6a21\u677f\u64cd\u4f5c<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>FrontFace<span class=\"token punctuation\">.<\/span>StencilFailOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_KEEP<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>FrontFace<span class=\"token punctuation\">.<\/span>StencilDepthFailOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_INCR<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>FrontFace<span class=\"token punctuation\">.<\/span>StencilPassOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_KEEP<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>FrontFace<span class=\"token punctuation\">.<\/span>StencilFunc <span class=\"token operator\">&#061;<\/span> D3D11_COMPARISON_ALWAYS<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u80cc\u9762\u591a\u8fb9\u5f62\u6a21\u677f\u64cd\u4f5c<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>BackFace<span class=\"token punctuation\">.<\/span>StencilFailOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_KEEP<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>BackFace<span class=\"token punctuation\">.<\/span>StencilDepthFailOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_DECR<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>BackFace<span class=\"token punctuation\">.<\/span>StencilPassOp <span class=\"token operator\">&#061;<\/span> D3D11_STENCIL_OP_KEEP<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>BackFace<span class=\"token punctuation\">.<\/span>StencilFunc <span class=\"token operator\">&#061;<\/span> D3D11_COMPARISON_ALWAYS<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u6df1\u5ea6\u6a21\u677f\u72b6\u6001<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetDepthStencilState<\/span><span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateMultiDepthBuffers<\/span><span class=\"token punctuation\">(<\/span>UINT count<span class=\"token punctuation\">,<\/span> DXGI_FORMAT format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R32_FLOAT<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6e05\u7406\u73b0\u6709\u7684\u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> texture <span class=\"token operator\">:<\/span> multiDepthTextures<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>texture<span class=\"token punctuation\">)<\/span> texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        multiDepthTextures<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> view <span class=\"token operator\">:<\/span> multiDepthViews<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>view<span class=\"token punctuation\">)<\/span> view<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        multiDepthViews<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u591a\u4e2a\u6df1\u5ea6\u7f13\u51b2\u533a&#xff08;\u7528\u4e8e\u6df1\u5ea6\u5265\u79bb\u7b49\u9ad8\u7ea7\u6280\u672f&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>UINT i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> count<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            ID3D11Texture2D<span class=\"token operator\">*<\/span> depthTexture <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            ID3D11DepthStencilView<span class=\"token operator\">*<\/span> depthView <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u7eb9\u7406<\/span><br \/>\n            D3D11_TEXTURE2D_DESC texDesc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>texDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>texDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            texDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> format<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_DEPTH_STENCIL <span class=\"token operator\">|<\/span> D3D11_BIND_SHADER_RESOURCE<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>texDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u6e05\u7406\u5df2\u521b\u5efa\u7684\u8d44\u6e90<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> texture <span class=\"token operator\">:<\/span> multiDepthTextures<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>texture<span class=\"token punctuation\">)<\/span> texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> view <span class=\"token operator\">:<\/span> multiDepthViews<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>view<span class=\"token punctuation\">)<\/span> view<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u89c6\u56fe<\/span><br \/>\n            D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dsvDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            dsvDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_D32_FLOAT<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6df1\u5ea6\u683c\u5f0f<\/span><br \/>\n            dsvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2D<span class=\"token punctuation\">;<\/span><br \/>\n            dsvDesc<span class=\"token punctuation\">.<\/span>Texture2D<span class=\"token punctuation\">.<\/span>MipSlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>depthTexture<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                depthTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6e05\u7406\u5df2\u521b\u5efa\u7684\u8d44\u6e90<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> texture <span class=\"token operator\">:<\/span> multiDepthTextures<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>texture<span class=\"token punctuation\">)<\/span> texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> view <span class=\"token operator\">:<\/span> multiDepthViews<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>view<span class=\"token punctuation\">)<\/span> view<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            multiDepthTextures<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>depthTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            multiDepthViews<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>depthView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> depthValue <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> UINT8 stencilValue <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            UINT clearFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                clearFlags <span class=\"token operator\">|&#061;<\/span> D3D11_CLEAR_DEPTH<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableStencilTest<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                clearFlags <span class=\"token operator\">|&#061;<\/span> D3D11_CLEAR_STENCIL<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>clearFlags <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">,<\/span> clearFlags<span class=\"token punctuation\">,<\/span> depthValue<span class=\"token punctuation\">,<\/span> stencilValue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6e05\u9664\u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> view <span class=\"token operator\">:<\/span> multiDepthViews<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>view<span class=\"token punctuation\">,<\/span> D3D11_CLEAR_DEPTH<span class=\"token punctuation\">,<\/span> depthValue<span class=\"token punctuation\">,<\/span> stencilValue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">SetDepthTestEnabled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">bool<\/span> enabled<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest <span class=\"token operator\">&#061;&#061;<\/span> enabled<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest <span class=\"token operator\">&#061;<\/span> enabled<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u72b6\u6001<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilState<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilState <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilStateDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthEnable <span class=\"token operator\">&#061;<\/span> enabled<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthWriteMask <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>depthWriteMask<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthFunc <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>depthComparisonFunc<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ &#8230; \u5176\u4ed6\u914d\u7f6e<\/span><\/p>\n<p>        device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetDepthStencilState<\/span><span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">SetDepthComparisonFunc<\/span><span class=\"token punctuation\">(<\/span>D3D11_COMPARISON_FUNC func<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>depthComparisonFunc <span class=\"token operator\">&#061;&#061;<\/span> func<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        currentConfig<span class=\"token punctuation\">.<\/span>depthComparisonFunc <span class=\"token operator\">&#061;<\/span> func<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u72b6\u6001<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilState<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilState <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilStateDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthEnable <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>enableDepthTest<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthWriteMask <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>depthWriteMask<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilStateDesc<span class=\"token punctuation\">.<\/span>DepthFunc <span class=\"token operator\">&#061;<\/span> func<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ &#8230; \u5176\u4ed6\u914d\u7f6e<\/span><\/p>\n<p>        device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilStateDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetDepthStencilState<\/span><span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Resize<\/span><span class=\"token punctuation\">(<\/span>UINT newWidth<span class=\"token punctuation\">,<\/span> UINT newHeight<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>newWidth <span class=\"token operator\">&#061;&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&amp;&amp;<\/span> newHeight <span class=\"token operator\">&#061;&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        currentConfig<span class=\"token punctuation\">.<\/span>width <span class=\"token operator\">&#061;<\/span> newWidth<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>height <span class=\"token operator\">&#061;<\/span> newHeight<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u8d44\u6e90<\/span><br \/>\n        <span class=\"token function\">CreateDepthStencilResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a&#xff08;\u5982\u679c\u5b58\u5728&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>multiDepthTextures<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">CreateMultiDepthBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>UINT<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>multiDepthTextures<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ReleaseResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilState<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilState<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilState <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilView<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilView <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            depthStencilTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            depthStencilTexture <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91ca\u653e\u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> texture <span class=\"token operator\">:<\/span> multiDepthTextures<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>texture<span class=\"token punctuation\">)<\/span> texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        multiDepthTextures<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> view <span class=\"token operator\">:<\/span> multiDepthViews<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>view<span class=\"token punctuation\">)<\/span> view<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        multiDepthViews<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    ID3D11DepthStencilView<span class=\"token operator\">*<\/span> <span class=\"token function\">GetDepthStencilView<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> depthStencilView<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    ID3D11DepthStencilState<span class=\"token operator\">*<\/span> <span class=\"token function\">GetDepthStencilState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> depthStencilState<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    UINT <span class=\"token function\">GetWidth<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> currentConfig<span class=\"token punctuation\">.<\/span>width<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    UINT <span class=\"token function\">GetHeight<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> currentConfig<span class=\"token punctuation\">.<\/span>height<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">DepthStencilManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ReleaseResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd9\u4e2a\u6df1\u5ea6\u6a21\u677f\u7ba1\u7406\u5668\u63d0\u4f9b\u4e86\u4ee5\u4e0b\u9ad8\u7ea7\u529f\u80fd&#xff1a;<\/p>\n<li>\u52a8\u6001\u914d\u7f6e&#xff1a;\u53ef\u4ee5\u8fd0\u884c\u65f6\u4fee\u6539\u6df1\u5ea6\u6d4b\u8bd5\u548c\u6a21\u677f\u6d4b\u8bd5\u53c2\u6570<\/li>\n<li>\u591a\u91cd\u6df1\u5ea6\u7f13\u51b2\u533a&#xff1a;\u652f\u6301\u6df1\u5ea6\u5265\u79bb\u7b49\u9ad8\u7ea7\u6e32\u67d3\u6280\u672f<\/li>\n<li>\u81ea\u52a8\u8d44\u6e90\u7ba1\u7406&#xff1a;\u7a97\u53e3\u5927\u5c0f\u6539\u53d8\u65f6\u81ea\u52a8\u91cd\u65b0\u521b\u5efa\u8d44\u6e90<\/li>\n<li>\u6027\u80fd\u4f18\u5316&#xff1a;\u53ea\u5728\u9700\u8981\u65f6\u66f4\u65b0\u72b6\u6001<\/li>\n<h3>13.2 Direct3D\u6e32\u67d3\u6d41\u6c34\u7ebf\u5b8c\u6574\u5b9e\u73b0<\/h3>\n<h4>13.2.1 \u73b0\u4ee3\u6e32\u67d3\u6d41\u6c34\u7ebf\u67b6\u6784<\/h4>\n<p>\u73b0\u4ee3\u6e38\u620f\u5982\u300a\u6700\u7ec8\u5e7b\u60f37\u91cd\u5236\u7248\u300b\u4f7f\u7528\u590d\u6742\u7684\u6e32\u67d3\u6d41\u6c34\u7ebf&#xff0c;\u5305\u62ec\u524d\u5411\u6e32\u67d3\u3001\u5ef6\u8fdf\u6e32\u67d3\u3001\u524d\u5411&#043;\u7b49\u591a\u79cd\u6280\u672f\u3002\u7406\u89e3\u8fd9\u4e9b\u6d41\u6c34\u7ebf\u67b6\u6784\u5bf9\u4e8e\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u81f3\u5173\u91cd\u8981\u3002<\/p>\n<p>\u4e0b\u9762\u5b9e\u73b0\u4e00\u4e2a\u7075\u6d3b\u7684\u6e32\u67d3\u6d41\u6c34\u7ebf\u7ba1\u7406\u5668&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;windows.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;d3d11.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;d3dcompiler.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;DirectXMath.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;map&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;d3d11.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\"><span class=\"token function\">comment<\/span><span class=\"token punctuation\">(<\/span>lib<span class=\"token punctuation\">,<\/span> <\/span><span class=\"token string\">&#034;d3dcompiler.lib&#034;<\/span><span class=\"token expression\"><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">using<\/span> <span class=\"token keyword\">namespace<\/span> DirectX<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RenderPipelineType<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    Forward<span class=\"token punctuation\">,<\/span>     <span class=\"token comment\">\/\/ \u524d\u5411\u6e32\u67d3&#xff08;\u4f20\u7edf\u65b9\u5f0f&#xff09;<\/span><br \/>\n    Deferred<span class=\"token punctuation\">,<\/span>    <span class=\"token comment\">\/\/ \u5ef6\u8fdf\u6e32\u67d3&#xff08;\u73b0\u4ee3AAA\u6e38\u620f\u5e38\u7528&#xff09;<\/span><br \/>\n    ForwardPlus<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u524d\u5411&#043;\u6e32\u67d3&#xff08;\u5e73\u8861\u65b9\u6848&#xff09;<\/span><br \/>\n    TileBased    <span class=\"token comment\">\/\/ \u57fa\u4e8e\u5206\u5757\u7684\u5ef6\u8fdf\u6e32\u67d3&#xff08;\u79fb\u52a8\u5e73\u53f0&#xff09;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">LightingModel<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    Phong<span class=\"token punctuation\">,<\/span>       <span class=\"token comment\">\/\/ Phong\u5149\u7167\u6a21\u578b<\/span><br \/>\n    BlinnPhong<span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ Blinn-Phong\u5149\u7167\u6a21\u578b&#xff08;\u66f4\u9ad8\u6548&#xff09;<\/span><br \/>\n    PBR<span class=\"token punctuation\">,<\/span>         <span class=\"token comment\">\/\/ \u57fa\u4e8e\u7269\u7406\u7684\u6e32\u67d3&#xff08;\u73b0\u4ee3\u6807\u51c6&#xff09;<\/span><br \/>\n    CelShading   <span class=\"token comment\">\/\/ \u5361\u901a\u6e32\u67d3<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">PipelineConfig<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    RenderPipelineType pipelineType<span class=\"token punctuation\">;<\/span><br \/>\n    LightingModel lightingModel<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> enableShadows<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> enableSSAO<span class=\"token punctuation\">;<\/span>      <span class=\"token comment\">\/\/ \u5c4f\u5e55\u7a7a\u95f4\u73af\u5883\u5149\u906e\u853d<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> enableBloom<span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/\/ \u6cdb\u5149\u6548\u679c<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> enableMotionBlur<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u8fd0\u52a8\u6a21\u7cca<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> enableDepthOfField<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u666f\u6df1\u6548\u679c<\/span><br \/>\n    UINT shadowMapSize<span class=\"token punctuation\">;<\/span><br \/>\n    UINT msaaLevel<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RenderPipelineManager<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5f53\u524d\u914d\u7f6e<\/span><br \/>\n    PipelineConfig currentConfig<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6e32\u67d3\u76ee\u6807<\/span><br \/>\n    ID3D11RenderTargetView<span class=\"token operator\">*<\/span> mainRenderTargetView<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Texture2D<span class=\"token operator\">*<\/span> mainRenderTargetTexture<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ G-Buffer\u7528\u4e8e\u5ef6\u8fdf\u6e32\u67d3<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">GBuffer<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        ID3D11Texture2D<span class=\"token operator\">*<\/span> texture<span class=\"token punctuation\">;<\/span><br \/>\n        ID3D11RenderTargetView<span class=\"token operator\">*<\/span> rtv<span class=\"token punctuation\">;<\/span><br \/>\n        ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> srv<span class=\"token punctuation\">;<\/span><br \/>\n        DXGI_FORMAT format<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>GBuffer<span class=\"token operator\">&gt;<\/span> gBuffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n    ID3D11Texture2D<span class=\"token operator\">*<\/span> depthStencilTexture<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DepthStencilView<span class=\"token operator\">*<\/span> depthStencilView<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> depthSRV<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7740\u8272\u5668<\/span><br \/>\n    ID3D11VertexShader<span class=\"token operator\">*<\/span> forwardVS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11PixelShader<span class=\"token operator\">*<\/span> forwardPS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11VertexShader<span class=\"token operator\">*<\/span> deferredVS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11PixelShader<span class=\"token operator\">*<\/span> deferredPS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11PixelShader<span class=\"token operator\">*<\/span> lightingPS<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8f93\u5165\u5e03\u5c40<\/span><br \/>\n    ID3D11InputLayout<span class=\"token operator\">*<\/span> inputLayout<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5e38\u91cf\u548c\u91c7\u6837\u5668<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> perFrameConstantBuffer<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> perObjectConstantBuffer<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11SamplerState<span class=\"token operator\">*<\/span> linearSampler<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11SamplerState<span class=\"token operator\">*<\/span> pointSampler<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89c6\u53e3<\/span><br \/>\n    D3D11_VIEWPORT mainViewport<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">RenderPipelineManager<\/span><span class=\"token punctuation\">(<\/span>ID3D11Device<span class=\"token operator\">*<\/span> dev<span class=\"token punctuation\">,<\/span> ID3D11DeviceContext<span class=\"token operator\">*<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">device<\/span><span class=\"token punctuation\">(<\/span>dev<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">mainRenderTargetView<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">mainRenderTargetTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthStencilTexture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthStencilView<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">depthSRV<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">forwardVS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">forwardPS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deferredVS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deferredPS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">lightingPS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">inputLayout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">perFrameConstantBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">perObjectConstantBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">linearSampler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">pointSampler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9ed8\u8ba4\u914d\u7f6e<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Forward<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>lightingModel <span class=\"token operator\">&#061;<\/span> LightingModel<span class=\"token double-colon punctuation\">::<\/span>BlinnPhong<span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableShadows <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableSSAO <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableBloom <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableMotionBlur <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>enableDepthOfField <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>shadowMapSize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2048<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        currentConfig<span class=\"token punctuation\">.<\/span>msaaLevel <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span>UINT width<span class=\"token punctuation\">,<\/span> UINT height<span class=\"token punctuation\">,<\/span> PipelineConfig config<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        currentConfig <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u89c6\u53e3<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>TopLeftX <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>TopLeftY <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>width<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>MinDepth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>MaxDepth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u4e3b\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateMainRenderTarget<\/span><span class=\"token punctuation\">(<\/span>width<span class=\"token punctuation\">,<\/span> height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateDepthStencil<\/span><span class=\"token punctuation\">(<\/span>width<span class=\"token punctuation\">,<\/span> height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efaG-Buffer&#xff08;\u5982\u679c\u662f\u5ef6\u8fdf\u6e32\u67d3&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>config<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Deferred <span class=\"token operator\">||<\/span><br \/>\n            config<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>ForwardPlus<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateGBuffer<\/span><span class=\"token punctuation\">(<\/span>width<span class=\"token punctuation\">,<\/span> height<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u7740\u8272\u5668<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CompileShaders<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateConstantBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u91c7\u6837\u5668\u72b6\u6001<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateSamplerStates<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateMainRenderTarget<\/span><span class=\"token punctuation\">(<\/span>UINT width<span class=\"token punctuation\">,<\/span> UINT height<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521b\u5efa\u4e3b\u6e32\u67d3\u76ee\u6807\u7eb9\u7406<\/span><br \/>\n        D3D11_TEXTURE2D_DESC textureDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>textureDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>textureDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        textureDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R8G8B8A8_UNORM<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>msaaLevel<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_RENDER_TARGET <span class=\"token operator\">|<\/span> D3D11_BIND_SHADER_RESOURCE<span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        textureDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>textureDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mainRenderTargetTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6e32\u67d3\u76ee\u6807\u89c6\u56fe<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateRenderTargetView<\/span><span class=\"token punctuation\">(<\/span>mainRenderTargetTexture<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mainRenderTargetView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateDepthStencil<\/span><span class=\"token punctuation\">(<\/span>UINT width<span class=\"token punctuation\">,<\/span> UINT height<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u7eb9\u7406<\/span><br \/>\n        D3D11_TEXTURE2D_DESC depthStencilDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>depthStencilDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        depthStencilDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R24G8_TYPELESS<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7528\u4e8e\u521b\u5efaSRV<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> currentConfig<span class=\"token punctuation\">.<\/span>msaaLevel<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_DEPTH_STENCIL <span class=\"token operator\">|<\/span> D3D11_BIND_SHADER_RESOURCE<span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        depthStencilDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>depthStencilDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilTexture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u89c6\u56fe<\/span><br \/>\n        D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dsvDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        dsvDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_D24_UNORM_S8_UINT<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>msaaLevel <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            dsvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2DMS<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            dsvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2D<span class=\"token punctuation\">;<\/span><br \/>\n            dsvDesc<span class=\"token punctuation\">.<\/span>Texture2D<span class=\"token punctuation\">.<\/span>MipSlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthStencilView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u7eb9\u7406\u7684\u7740\u8272\u5668\u8d44\u6e90\u89c6\u56fe&#xff08;\u7528\u4e8e\u540e\u5904\u7406&#xff09;<\/span><br \/>\n        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>srvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>srvDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        srvDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R24_UNORM_X8_TYPELESS<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>msaaLevel <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            srvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_SRV_DIMENSION_TEXTURE2DMS<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            srvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_SRV_DIMENSION_TEXTURE2D<span class=\"token punctuation\">;<\/span><br \/>\n            srvDesc<span class=\"token punctuation\">.<\/span>Texture2D<span class=\"token punctuation\">.<\/span>MostDetailedMip <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            srvDesc<span class=\"token punctuation\">.<\/span>Texture2D<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateShaderResourceView<\/span><span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>srvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>depthSRV<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateGBuffer<\/span><span class=\"token punctuation\">(<\/span>UINT width<span class=\"token punctuation\">,<\/span> UINT height<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ G-Buffer\u901a\u5e38\u5305\u542b&#xff1a;<\/span><br \/>\n        <span class=\"token comment\">\/\/ 1. \u6f2b\u53cd\u5c04\u989c\u8272 &#043; \u6750\u8d28\u7c7b\u578b<\/span><br \/>\n        <span class=\"token comment\">\/\/ 2. \u6cd5\u7ebf &#043; \u7c97\u7cd9\u5ea6<\/span><br \/>\n        <span class=\"token comment\">\/\/ 3. \u4f4d\u7f6e &#043; \u91d1\u5c5e\u5ea6<\/span><br \/>\n        <span class=\"token comment\">\/\/ 4. \u81ea\u53d1\u5149 &#043; \u5176\u4ed6\u6570\u636e<\/span><\/p>\n<p>        DXGI_FORMAT gBufferFormats<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            DXGI_FORMAT_R8G8B8A8_UNORM<span class=\"token punctuation\">,<\/span>   <span class=\"token comment\">\/\/ \u6f2b\u53cd\u5c04 &#043; \u6750\u8d28<\/span><br \/>\n            DXGI_FORMAT_R16G16B16A16_FLOAT<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u6cd5\u7ebf &#043; \u7c97\u7cd9\u5ea6<\/span><br \/>\n            DXGI_FORMAT_R32G32B32A32_FLOAT<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u4f4d\u7f6e &#043; \u91d1\u5c5e\u5ea6<\/span><br \/>\n            DXGI_FORMAT_R8G8B8A8_UNORM    <span class=\"token comment\">\/\/ \u81ea\u53d1\u5149 &#043; \u5176\u4ed6<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> gBufferNames<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;DiffuseMaterial&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;NormalRoughness&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;PositionMetalness&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;EmissiveOther&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            GBuffer buffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u7eb9\u7406<\/span><br \/>\n            D3D11_TEXTURE2D_DESC texDesc<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>texDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>texDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            texDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> width<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> height<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> gBufferFormats<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ G-Buffer\u901a\u5e38\u4e0d\u4f7f\u7528\u591a\u91cd\u91c7\u6837<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_RENDER_TARGET <span class=\"token operator\">|<\/span> D3D11_BIND_SHADER_RESOURCE<span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            texDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>texDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u6e05\u7406\u5df2\u521b\u5efa\u7684\u7f13\u51b2\u533a<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> gb <span class=\"token operator\">:<\/span> gBuffer<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u6e32\u67d3\u76ee\u6807\u89c6\u56fe<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateRenderTargetView<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6e05\u7406\u5df2\u521b\u5efa\u7684\u7f13\u51b2\u533a<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> gb <span class=\"token operator\">:<\/span> gBuffer<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u521b\u5efa\u7740\u8272\u5668\u8d44\u6e90\u89c6\u56fe<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateShaderResourceView<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>buffer<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u6e05\u7406\u5df2\u521b\u5efa\u7684\u7f13\u51b2\u533a<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> gb <span class=\"token operator\">:<\/span> gBuffer<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>srv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span> gb<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            buffer<span class=\"token punctuation\">.<\/span>format <span class=\"token operator\">&#061;<\/span> gBufferFormats<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CompileShaders<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        HRESULT result <span class=\"token operator\">&#061;<\/span> S_OK<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u524d\u5411\u7740\u8272\u5668<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> forwardVSCode <span class=\"token operator\">&#061;<\/span><br \/>\n            <span class=\"token string\">&#034;cbuffer PerFrameConstants : register(b0)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 viewMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 projectionMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 cameraPosition;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float padding;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;cbuffer PerObjectConstants : register(b1)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 worldMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 materialColor;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float roughness;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float metalness;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 paddingObj;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;struct VertexInput\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 position : POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal : NORMAL;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 texcoord : TEXCOORD;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;struct PixelInput\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 position : SV_POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 worldPosition : POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal : NORMAL;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 texcoord : TEXCOORD;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;PixelInput main(VertexInput input)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    PixelInput output;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u4e16\u754c\u53d8\u6362\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 worldPos &#061; mul(float4(input.position, 1.0f), worldMatrix);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u89c6\u56fe\u548c\u6295\u5f71\u53d8\u6362\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.position &#061; mul(mul(worldPos, viewMatrix), projectionMatrix);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u4f20\u9012\u5176\u4ed6\u6570\u636e\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.worldPosition &#061; worldPos.xyz;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.normal &#061; normalize(mul(input.normal, (float3x3)worldMatrix));\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.texcoord &#061; input.texcoord;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    return output;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;}&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> forwardPSCode <span class=\"token operator\">&#061;<\/span><br \/>\n            <span class=\"token string\">&#034;cbuffer PerFrameConstants : register(b0)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 viewMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 projectionMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 cameraPosition;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float padding;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;cbuffer PerObjectConstants : register(b1)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 worldMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 materialColor;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float roughness;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float metalness;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 paddingObj;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;struct PixelInput\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 position : SV_POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 worldPosition : POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal : NORMAL;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 texcoord : TEXCOORD;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\/\/ \u7b80\u5355\u5149\u7167\u8ba1\u7b97&#xff08;Blinn-Phong&#xff09;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;float3 CalculateLighting(float3 position, float3 normal, float3 viewDir)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 lightColor &#061; float3(1.0f, 1.0f, 1.0f);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 lightDirection &#061; normalize(float3(1.0f, 1.0f, -1.0f));\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u6f2b\u53cd\u5c04\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float diffuse &#061; max(dot(normal, lightDirection), 0.0f);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 diffuseColor &#061; lightColor * diffuse;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u955c\u9762\u53cd\u5c04&#xff08;Blinn-Phong&#xff09;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 halfVector &#061; normalize(lightDirection &#043; viewDir);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float specular &#061; pow(max(dot(normal, halfVector), 0.0f), 32.0f);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 specularColor &#061; lightColor * specular;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u73af\u5883\u5149\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 ambientColor &#061; float3(0.1f, 0.1f, 0.1f);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    return ambientColor &#043; diffuseColor &#043; specularColor;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;}\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;float4 main(PixelInput input) : SV_TARGET\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u6807\u51c6\u5316\u6cd5\u7ebf\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal &#061; normalize(input.normal);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u8ba1\u7b97\u89c6\u7ebf\u65b9\u5411\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 viewDir &#061; normalize(cameraPosition &#8211; input.worldPosition);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u8ba1\u7b97\u5149\u7167\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 lighting &#061; CalculateLighting(input.worldPosition, normal, viewDir);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u5e94\u7528\u6750\u8d28\u989c\u8272\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 finalColor &#061; materialColor.rgb * lighting;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    return float4(finalColor, materialColor.a);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;}&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        ID3DBlob<span class=\"token operator\">*<\/span> vsBlob <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        ID3DBlob<span class=\"token operator\">*<\/span> psBlob <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        ID3DBlob<span class=\"token operator\">*<\/span> errorBlob <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u9876\u70b9\u7740\u8272\u5668<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">D3DCompile<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            forwardVSCode<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>forwardVSCode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;ForwardVS&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;main&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;vs_5_0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>vsBlob<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>errorBlob<br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errorBlob<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">OutputDebugStringA<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>errorBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferPointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                errorBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u9876\u70b9\u7740\u8272\u5668<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateVertexShader<\/span><span class=\"token punctuation\">(<\/span>vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferPointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferSize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>forwardVS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u50cf\u7d20\u7740\u8272\u5668<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">D3DCompile<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            forwardPSCode<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>forwardPSCode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;ForwardPS&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;main&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;ps_5_0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>psBlob<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>errorBlob<br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errorBlob<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                errorBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u50cf\u7d20\u7740\u8272\u5668<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreatePixelShader<\/span><span class=\"token punctuation\">(<\/span>psBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferPointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> psBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferSize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>forwardPS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u8f93\u5165\u5e03\u5c40<\/span><br \/>\n        D3D11_INPUT_ELEMENT_DESC layout<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> <span class=\"token string\">&#034;POSITION&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> DXGI_FORMAT_R32G32B32_FLOAT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> D3D11_INPUT_PER_VERTEX_DATA<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> <span class=\"token string\">&#034;NORMAL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> DXGI_FORMAT_R32G32B32_FLOAT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">12<\/span><span class=\"token punctuation\">,<\/span> D3D11_INPUT_PER_VERTEX_DATA<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> <span class=\"token string\">&#034;TEXCOORD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> DXGI_FORMAT_R32G32_FLOAT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">24<\/span><span class=\"token punctuation\">,<\/span> D3D11_INPUT_PER_VERTEX_DATA<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateInputLayout<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            layout<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferPointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetBufferSize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token operator\">&amp;<\/span>inputLayout<br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6e05\u7406\u4e34\u65f6\u5bf9\u8c61<\/span><br \/>\n        vsBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        psBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>errorBlob<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            errorBlob<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateConstantBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521b\u5efa\u6bcf\u5e27\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_BUFFER_DESC perFrameDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>perFrameDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>perFrameDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        perFrameDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DYNAMIC<span class=\"token punctuation\">;<\/span><br \/>\n        perFrameDesc<span class=\"token punctuation\">.<\/span>ByteWidth <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>PerFrameConstants<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        perFrameDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_CONSTANT_BUFFER<span class=\"token punctuation\">;<\/span><br \/>\n        perFrameDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> D3D11_CPU_ACCESS_WRITE<span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>perFrameDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>perFrameConstantBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6bcf\u4e2a\u5bf9\u8c61\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_BUFFER_DESC perObjectDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>perObjectDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>perObjectDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        perObjectDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DYNAMIC<span class=\"token punctuation\">;<\/span><br \/>\n        perObjectDesc<span class=\"token punctuation\">.<\/span>ByteWidth <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>PerObjectConstants<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        perObjectDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_CONSTANT_BUFFER<span class=\"token punctuation\">;<\/span><br \/>\n        perObjectDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> D3D11_CPU_ACCESS_WRITE<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>perObjectDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>perObjectConstantBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CreateSamplerStates<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u521b\u5efa\u7ebf\u6027\u91c7\u6837\u5668<\/span><br \/>\n        D3D11_SAMPLER_DESC linearDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>linearDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>linearDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        linearDesc<span class=\"token punctuation\">.<\/span>Filter <span class=\"token operator\">&#061;<\/span> D3D11_FILTER_MIN_MAG_MIP_LINEAR<span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>AddressU <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>AddressV <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>AddressW <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>MipLODBias <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>MaxAnisotropy <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>ComparisonFunc <span class=\"token operator\">&#061;<\/span> D3D11_COMPARISON_ALWAYS<span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>MinLOD <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        linearDesc<span class=\"token punctuation\">.<\/span>MaxLOD <span class=\"token operator\">&#061;<\/span> D3D11_FLOAT32_MAX<span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateSamplerState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>linearDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>linearSampler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u70b9\u91c7\u6837\u5668<\/span><br \/>\n        D3D11_SAMPLER_DESC pointDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>pointDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>pointDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        pointDesc<span class=\"token punctuation\">.<\/span>Filter <span class=\"token operator\">&#061;<\/span> D3D11_FILTER_MIN_MAG_MIP_POINT<span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>AddressU <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>AddressV <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>AddressW <span class=\"token operator\">&#061;<\/span> D3D11_TEXTURE_ADDRESS_WRAP<span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>MipLODBias <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>MaxAnisotropy <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>ComparisonFunc <span class=\"token operator\">&#061;<\/span> D3D11_COMPARISON_ALWAYS<span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>BorderColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>MinLOD <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pointDesc<span class=\"token punctuation\">.<\/span>MaxLOD <span class=\"token operator\">&#061;<\/span> D3D11_FLOAT32_MAX<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateSamplerState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>pointDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>pointSampler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">BeginFrame<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> clearColor<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u89c6\u53e3<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">RSSetViewports<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mainViewport<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6e05\u9664\u4e3b\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearRenderTargetView<\/span><span class=\"token punctuation\">(<\/span>mainRenderTargetView<span class=\"token punctuation\">,<\/span> clearColor<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">,<\/span> D3D11_CLEAR_DEPTH<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6839\u636e\u6d41\u6c34\u7ebf\u7c7b\u578b\u8bbe\u7f6e\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>pipelineType<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Forward<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u524d\u5411\u6e32\u67d3&#xff1a;\u76f4\u63a5\u6e32\u67d3\u5230\u4e3b\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetRenderTargets<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mainRenderTargetView<span class=\"token punctuation\">,<\/span> depthStencilView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">case<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Deferred<span class=\"token operator\">:<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>ForwardPlus<span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5ef6\u8fdf\u6e32\u67d3&#xff1a;\u6e32\u67d3\u5230G-Buffer<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                ID3D11RenderTargetView<span class=\"token operator\">*<\/span> rtvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    rtvs<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> gBuffer<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u6e05\u9664G-Buffer<\/span><br \/>\n                    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> clearGBuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearRenderTargetView<\/span><span class=\"token punctuation\">(<\/span>rtvs<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> clearGBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetRenderTargets<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">,<\/span> rtvs<span class=\"token punctuation\">,<\/span> depthStencilView<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u91c7\u6837\u5668<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetSamplers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>linearSampler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetSamplers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>pointSampler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">RenderObject<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        ID3D11Buffer<span class=\"token operator\">*<\/span> vertexBuffer<span class=\"token punctuation\">,<\/span><br \/>\n        ID3D11Buffer<span class=\"token operator\">*<\/span> indexBuffer<span class=\"token punctuation\">,<\/span><br \/>\n        UINT vertexCount<span class=\"token punctuation\">,<\/span><br \/>\n        UINT indexCount<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMMATRIX<span class=\"token operator\">&amp;<\/span> worldMatrix<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT4<span class=\"token operator\">&amp;<\/span> materialColor<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> roughness <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> metalness <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u66f4\u65b0\u6bcf\u5bf9\u8c61\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_MAPPED_SUBRESOURCE mapped<span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Map<\/span><span class=\"token punctuation\">(<\/span>perObjectConstantBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> D3D11_MAP_WRITE_DISCARD<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mapped<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        PerObjectConstants<span class=\"token operator\">*<\/span> constants <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>PerObjectConstants<span class=\"token operator\">*<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>mapped<span class=\"token punctuation\">.<\/span>pData<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">XMStoreFloat4x4<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>constants<span class=\"token operator\">-&gt;<\/span>worldMatrix<span class=\"token punctuation\">,<\/span> <span class=\"token function\">XMMatrixTranspose<\/span><span class=\"token punctuation\">(<\/span>worldMatrix<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        constants<span class=\"token operator\">-&gt;<\/span>materialColor <span class=\"token operator\">&#061;<\/span> materialColor<span class=\"token punctuation\">;<\/span><br \/>\n        constants<span class=\"token operator\">-&gt;<\/span>roughness <span class=\"token operator\">&#061;<\/span> roughness<span class=\"token punctuation\">;<\/span><br \/>\n        constants<span class=\"token operator\">-&gt;<\/span>metalness <span class=\"token operator\">&#061;<\/span> metalness<span class=\"token punctuation\">;<\/span><\/p>\n<p>        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Unmap<\/span><span class=\"token punctuation\">(<\/span>perObjectConstantBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">VSSetConstantBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>perObjectConstantBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetConstantBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>perObjectConstantBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8f93\u5165\u5e03\u5c40\u548c\u9876\u70b9\u7f13\u51b2\u533a<\/span><br \/>\n        UINT stride <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>Vertex<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        UINT offset <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetInputLayout<\/span><span class=\"token punctuation\">(<\/span>inputLayout<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetVertexBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>vertexBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>stride<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>offset<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7d22\u5f15\u7f13\u51b2\u533a&#xff08;\u5982\u679c\u6709&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>indexBuffer <span class=\"token operator\">&amp;&amp;<\/span> indexCount <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetIndexBuffer<\/span><span class=\"token punctuation\">(<\/span>indexBuffer<span class=\"token punctuation\">,<\/span> DXGI_FORMAT_R32_UINT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u56fe\u5143\u62d3\u6251<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetPrimitiveTopology<\/span><span class=\"token punctuation\">(<\/span>D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6839\u636e\u6d41\u6c34\u7ebf\u7c7b\u578b\u8bbe\u7f6e\u7740\u8272\u5668<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Forward<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">VSSetShader<\/span><span class=\"token punctuation\">(<\/span>forwardVS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShader<\/span><span class=\"token punctuation\">(<\/span>forwardPS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5ef6\u8fdf\u6e32\u67d3\u4f7f\u7528\u4e0d\u540c\u7684\u7740\u8272\u5668<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">VSSetShader<\/span><span class=\"token punctuation\">(<\/span>deferredVS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShader<\/span><span class=\"token punctuation\">(<\/span>deferredPS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ed8\u5236<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>indexBuffer <span class=\"token operator\">&amp;&amp;<\/span> indexCount <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">DrawIndexed<\/span><span class=\"token punctuation\">(<\/span>indexCount<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Draw<\/span><span class=\"token punctuation\">(<\/span>vertexCount<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplyLightingPass<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>Deferred <span class=\"token operator\">||<\/span><br \/>\n            currentConfig<span class=\"token punctuation\">.<\/span>pipelineType <span class=\"token operator\">&#061;&#061;<\/span> RenderPipelineType<span class=\"token double-colon punctuation\">::<\/span>ForwardPlus<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5ef6\u8fdf\u6e32\u67d3\u7684\u7167\u660e\u9636\u6bb5<\/span><br \/>\n            <span class=\"token comment\">\/\/ 1. \u5c06\u6e32\u67d3\u76ee\u6807\u5207\u6362\u56de\u4e3b\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetRenderTargets<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mainRenderTargetView<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 2. \u8bbe\u7f6eG-Buffer\u4f5c\u4e3a\u7eb9\u7406\u8f93\u5165<\/span><br \/>\n            ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> gBuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6f2b\u53cd\u5c04&#043;\u6750\u8d28<\/span><br \/>\n            srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> gBuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6cd5\u7ebf&#043;\u7c97\u7cd9\u5ea6<\/span><br \/>\n            srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> gBuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4f4d\u7f6e&#043;\u91d1\u5c5e\u5ea6<\/span><br \/>\n            srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> gBuffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u81ea\u53d1\u5149&#043;\u5176\u4ed6<\/span><br \/>\n            srvs<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> depthSRV<span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/\/ \u6df1\u5ea6<\/span><\/p>\n<p>            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShaderResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> srvs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 3. \u8bbe\u7f6e\u7167\u660e\u7740\u8272\u5668<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">VSSetShader<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5168\u5c4f\u56db\u8fb9\u5f62\u4e0d\u9700\u8981\u9876\u70b9\u7740\u8272\u5668<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShader<\/span><span class=\"token punctuation\">(<\/span>lightingPS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 4. \u7ed8\u5236\u5168\u5c4f\u56db\u8fb9\u5f62<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetPrimitiveTopology<\/span><span class=\"token punctuation\">(<\/span>D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Draw<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ 6\u4e2a\u9876\u70b9\u5f62\u62102\u4e2a\u4e09\u89d2\u5f62<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 5. \u89e3\u9664\u7eb9\u7406\u7ed1\u5b9a<\/span><br \/>\n            ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> nullSRVs<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShaderResources<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> nullSRVs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplyPostProcessing<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd9\u91cc\u53ef\u4ee5\u5b9e\u73b0\u5404\u79cd\u540e\u5904\u7406\u6548\u679c<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableSSAO<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ApplySSAO<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableBloom<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ApplyBloom<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableMotionBlur<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ApplyMotionBlur<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>currentConfig<span class=\"token punctuation\">.<\/span>enableDepthOfField<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ApplyDepthOfField<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplySSAO<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5c4f\u5e55\u7a7a\u95f4\u73af\u5883\u5149\u906e\u853d\u5b9e\u73b0<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728\u5b9e\u9645\u5e94\u7528\u4e2d&#xff0c;\u8fd9\u901a\u5e38\u9700\u8981\u5355\u72ec\u7684\u6e32\u67d3\u76ee\u6807\u548c\u590d\u6742\u7684\u7740\u8272\u5668<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplyBloom<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6cdb\u5149\u6548\u679c\u5b9e\u73b0<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u901a\u5e38\u5305\u62ec&#xff1a;\u4eae\u5ea6\u63d0\u53d6\u3001\u9ad8\u65af\u6a21\u7cca\u3001\u5408\u6210\u7b49\u6b65\u9aa4<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplyMotionBlur<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd0\u52a8\u6a21\u7cca\u5b9e\u73b0<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9700\u8981\u901f\u5ea6\u7f13\u51b2\u533a\u8bb0\u5f55\u50cf\u7d20\u8fd0\u52a8<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">ApplyDepthOfField<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u666f\u6df1\u6548\u679c\u5b9e\u73b0<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u57fa\u4e8e\u6df1\u5ea6\u4fe1\u606f\u6a21\u7cca\u80cc\u666f\u548c\u524d\u666f<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">EndFrame<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u540e\u5904\u7406\u5b8c\u6210\u540e&#xff0c;\u53ef\u4ee5\u5728\u8fd9\u91cc\u6267\u884c\u6700\u7ec8\u7684\u5448\u73b0<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6ce8\u610f&#xff1a;\u5b9e\u9645\u7684\u5448\u73b0\u5e94\u8be5\u5728\u4ea4\u6362\u94fe\u4e2d\u8fdb\u884c<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Resize<\/span><span class=\"token punctuation\">(<\/span>UINT newWidth<span class=\"token punctuation\">,<\/span> UINT newHeight<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u66f4\u65b0\u89c6\u53e3<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>newWidth<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        mainViewport<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>newHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>mainRenderTargetView<span class=\"token punctuation\">)<\/span> mainRenderTargetView<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>mainRenderTargetTexture<span class=\"token punctuation\">)<\/span> mainRenderTargetTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">CreateMainRenderTarget<\/span><span class=\"token punctuation\">(<\/span>newWidth<span class=\"token punctuation\">,<\/span> newHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efa\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">)<\/span> depthStencilView<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">)<\/span> depthStencilTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthSRV<span class=\"token punctuation\">)<\/span> depthSRV<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">CreateDepthStencil<\/span><span class=\"token punctuation\">(<\/span>newWidth<span class=\"token punctuation\">,<\/span> newHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u65b0\u521b\u5efaG-Buffer&#xff08;\u5982\u679c\u5b58\u5728&#xff09;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> buffer <span class=\"token operator\">:<\/span> gBuffer<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>srv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">CreateGBuffer<\/span><span class=\"token punctuation\">(<\/span>newWidth<span class=\"token punctuation\">,<\/span> newHeight<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6e05\u7406\u6240\u6709\u8d44\u6e90<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>inputLayout<span class=\"token punctuation\">)<\/span> inputLayout<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>forwardVS<span class=\"token punctuation\">)<\/span> forwardVS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>forwardPS<span class=\"token punctuation\">)<\/span> forwardPS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>deferredVS<span class=\"token punctuation\">)<\/span> deferredVS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>deferredPS<span class=\"token punctuation\">)<\/span> deferredPS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>lightingPS<span class=\"token punctuation\">)<\/span> lightingPS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>perFrameConstantBuffer<span class=\"token punctuation\">)<\/span> perFrameConstantBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>perObjectConstantBuffer<span class=\"token punctuation\">)<\/span> perObjectConstantBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>linearSampler<span class=\"token punctuation\">)<\/span> linearSampler<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pointSampler<span class=\"token punctuation\">)<\/span> pointSampler<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthSRV<span class=\"token punctuation\">)<\/span> depthSRV<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilView<span class=\"token punctuation\">)<\/span> depthStencilView<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>depthStencilTexture<span class=\"token punctuation\">)<\/span> depthStencilTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>mainRenderTargetView<span class=\"token punctuation\">)<\/span> mainRenderTargetView<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>mainRenderTargetTexture<span class=\"token punctuation\">)<\/span> mainRenderTargetTexture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> buffer <span class=\"token operator\">:<\/span> gBuffer<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>srv<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>srv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>rtv<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token punctuation\">)<\/span> buffer<span class=\"token punctuation\">.<\/span>texture<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        gBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5e38\u91cf\u7f13\u51b2\u533a\u7ed3\u6784<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">PerFrameConstants<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        XMFLOAT4X4 viewMatrix<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT4X4 projectionMatrix<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT3 cameraPosition<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> padding<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">PerObjectConstants<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        XMFLOAT4X4 worldMatrix<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT4 materialColor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> roughness<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> metalness<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT2 paddingObj<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Vertex<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        XMFLOAT3 position<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT3 normal<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT2 texcoord<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">RenderPipelineManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u8fd9\u4e2a\u6e32\u67d3\u6d41\u6c34\u7ebf\u7ba1\u7406\u5668\u5b9e\u73b0\u4e86\u73b0\u4ee3\u6e38\u620f\u5f15\u64ce\u7684\u6838\u5fc3\u529f\u80fd&#xff1a;<\/p>\n<li>\u591a\u6d41\u6c34\u7ebf\u652f\u6301&#xff1a;\u524d\u5411\u6e32\u67d3\u3001\u5ef6\u8fdf\u6e32\u67d3\u7b49<\/li>\n<li>G-Buffer\u7ba1\u7406&#xff1a;\u4e3a\u5ef6\u8fdf\u6e32\u67d3\u63d0\u4f9b\u652f\u6301<\/li>\n<li>\u540e\u5904\u7406\u6548\u679c&#xff1a;SSAO\u3001\u6cdb\u5149\u3001\u8fd0\u52a8\u6a21\u7cca\u3001\u666f\u6df1\u7b49<\/li>\n<li>\u52a8\u6001\u8c03\u6574&#xff1a;\u7a97\u53e3\u5927\u5c0f\u6539\u53d8\u65f6\u81ea\u52a8\u8c03\u6574\u8d44\u6e90<\/li>\n<li>\u6a21\u5757\u5316\u8bbe\u8ba1&#xff1a;\u6613\u4e8e\u6269\u5c55\u548c\u7ef4\u62a4<\/li>\n<h3>13.3 \u9ad8\u7ea7\u6e32\u67d3\u6280\u672f\u4e0e\u4f18\u5316<\/h3>\n<h4>13.3.1 \u5b9e\u4f8b\u5316\u6e32\u67d3<\/h4>\n<p>\u5b9e\u4f8b\u5316\u6e32\u67d3\u662f\u73b0\u4ee3\u6e38\u620f\u4e2d\u7684\u91cd\u8981\u4f18\u5316\u6280\u672f&#xff0c;\u7279\u522b\u662f\u5728\u6e32\u67d3\u5927\u91cf\u76f8\u4f3c\u5bf9\u8c61\u65f6&#xff08;\u5982\u8349\u5730\u3001\u6811\u6728\u3001\u4eba\u7fa4&#xff09;\u3002\u300a\u523a\u5ba2\u4fe1\u6761&#xff1a;\u82f1\u7075\u6bbf\u300b\u4e2d\u5e7f\u9614\u7684\u573a\u666f\u5c31\u5927\u91cf\u4f7f\u7528\u4e86\u5b9e\u4f8b\u5316\u6e32\u67d3\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">InstancedRenderer<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">InstanceData<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        XMFLOAT4X4 worldMatrix<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT4 color<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT2 uvOffset<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> scale<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> rotation<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b9e\u4f8b\u7f13\u51b2\u533a<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> instanceBuffer<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> dynamicInstanceBuffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9876\u70b9\u548c\u7d22\u5f15\u7f13\u51b2\u533a<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> vertexBuffer<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> indexBuffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7740\u8272\u5668<\/span><br \/>\n    ID3D11VertexShader<span class=\"token operator\">*<\/span> instancedVS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11PixelShader<span class=\"token operator\">*<\/span> instancedPS<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11InputLayout<span class=\"token operator\">*<\/span> instancedInputLayout<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> perFrameBuffer<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> perInstanceBuffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b9e\u4f8b\u6570\u636e<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>InstanceData<span class=\"token operator\">&gt;<\/span> instances<span class=\"token punctuation\">;<\/span><br \/>\n    UINT maxInstances<span class=\"token punctuation\">;<\/span><br \/>\n    UINT instanceStride<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">InstancedRenderer<\/span><span class=\"token punctuation\">(<\/span>ID3D11Device<span class=\"token operator\">*<\/span> dev<span class=\"token punctuation\">,<\/span> ID3D11DeviceContext<span class=\"token operator\">*<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">device<\/span><span class=\"token punctuation\">(<\/span>dev<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">instanceBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">dynamicInstanceBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">vertexBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">indexBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">instancedVS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">instancedPS<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">instancedInputLayout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">perFrameBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">perInstanceBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">maxInstances<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">instanceStride<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>InstanceData<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span>UINT maxInstanceCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        maxInstances <span class=\"token operator\">&#061;<\/span> maxInstanceCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u5b9e\u4f8b\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_BUFFER_DESC instanceBufferDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>instanceBufferDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>instanceBufferDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        instanceBufferDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DYNAMIC<span class=\"token punctuation\">;<\/span><br \/>\n        instanceBufferDesc<span class=\"token punctuation\">.<\/span>ByteWidth <span class=\"token operator\">&#061;<\/span> maxInstances <span class=\"token operator\">*<\/span> instanceStride<span class=\"token punctuation\">;<\/span><br \/>\n        instanceBufferDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_VERTEX_BUFFER<span class=\"token punctuation\">;<\/span><br \/>\n        instanceBufferDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> D3D11_CPU_ACCESS_WRITE<span class=\"token punctuation\">;<\/span><br \/>\n        instanceBufferDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        instanceBufferDesc<span class=\"token punctuation\">.<\/span>StructureByteStride <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>instanceBufferDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>instanceBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u5b9e\u4f8b\u5316\u7740\u8272\u5668<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CompileInstancedShaders<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">CreateConstantBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">CompileInstancedShaders<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5b9e\u4f8b\u5316\u4e13\u7528\u9876\u70b9\u7740\u8272\u5668<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> instancedVSCode <span class=\"token operator\">&#061;<\/span><br \/>\n            <span class=\"token string\">&#034;cbuffer PerFrameConstants : register(b0)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 viewProjMatrix;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 cameraPosition;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float time;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;struct VertexInput\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 position : POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal : NORMAL;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 texcoord : TEXCOORD0;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 instanceColor : COLOR;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4x4 instanceWorld : WORLD;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 instanceUVOffset : TEXCOORD1;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;struct PixelInput\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 position : SV_POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 worldPosition : POSITION;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float3 normal : NORMAL;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float2 texcoord : TEXCOORD0;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 color : COLOR;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;};\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;PixelInput main(VertexInput input)\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;{\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    PixelInput output;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u5e94\u7528\u5b9e\u4f8b\u7684\u4e16\u754c\u53d8\u6362\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    float4 worldPos &#061; mul(float4(input.position, 1.0f), input.instanceWorld);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u5e94\u7528\u89c6\u56fe\u6295\u5f71\u53d8\u6362\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.position &#061; mul(worldPos, viewProjMatrix);\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \/\/ \u4f20\u9012\u5176\u4ed6\u6570\u636e\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.worldPosition &#061; worldPos.xyz;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.normal &#061; normalize(mul(input.normal, (float3x3)input.instanceWorld));\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.texcoord &#061; input.texcoord &#043; input.instanceUVOffset;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    output.color &#061; input.instanceColor;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    \\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;    return output;\\\\n&#034;<\/span><br \/>\n            <span class=\"token string\">&#034;}&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7f16\u8bd1\u7740\u8272\u5668&#8230;<\/span><br \/>\n        <span class=\"token comment\">\/\/ &#xff08;\u4e3a\u4e86\u7b80\u6d01&#xff0c;\u7701\u7565\u4e86\u7f16\u8bd1\u4ee3\u7801&#xff0c;\u4e0e\u524d\u9762\u7c7b\u4f3c&#xff09;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">UpdateInstances<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>InstanceData<span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> newInstances<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        instances <span class=\"token operator\">&#061;<\/span> newInstances<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u786e\u4fdd\u4e0d\u8d85\u8fc7\u6700\u5927\u5b9e\u4f8b\u6570<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> maxInstances<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>maxInstances<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u66f4\u65b0\u5b9e\u4f8b\u7f13\u51b2\u533a<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        D3D11_MAPPED_SUBRESOURCE mapped<span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Map<\/span><span class=\"token punctuation\">(<\/span>instanceBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> D3D11_MAP_WRITE_DISCARD<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mapped<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>mapped<span class=\"token punctuation\">.<\/span>pData<span class=\"token punctuation\">,<\/span> instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> instanceStride<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Unmap<\/span><span class=\"token punctuation\">(<\/span>instanceBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Render<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u9876\u70b9\u7f13\u51b2\u533a&#xff08;\u4e24\u4e2a\u7f13\u51b2\u533a&#xff1a;\u51e0\u4f55\u4f53\u6570\u636e\u548c\u5b9e\u4f8b\u6570\u636e&#xff09;<\/span><br \/>\n        ID3D11Buffer<span class=\"token operator\">*<\/span> buffers<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> vertexBuffer<span class=\"token punctuation\">,<\/span> instanceBuffer <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        UINT strides<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>Vertex<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> instanceStride <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        UINT offsets<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetVertexBuffers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> buffers<span class=\"token punctuation\">,<\/span> strides<span class=\"token punctuation\">,<\/span> offsets<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetIndexBuffer<\/span><span class=\"token punctuation\">(<\/span>indexBuffer<span class=\"token punctuation\">,<\/span> DXGI_FORMAT_R32_UINT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8f93\u5165\u5e03\u5c40<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetInputLayout<\/span><span class=\"token punctuation\">(<\/span>instancedInputLayout<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u56fe\u5143\u62d3\u6251<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">IASetPrimitiveTopology<\/span><span class=\"token punctuation\">(<\/span>D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7740\u8272\u5668<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">VSSetShader<\/span><span class=\"token punctuation\">(<\/span>instancedVS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">PSSetShader<\/span><span class=\"token punctuation\">(<\/span>instancedPS<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ed8\u5236\u5b9e\u4f8b\u5316\u51e0\u4f55\u4f53<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5047\u8bbe\u6bcf\u4e2a\u5b9e\u4f8b\u7684\u4e09\u89d2\u5f62\u6570\u91cf\u4e3atriangleCount<\/span><br \/>\n        UINT triangleCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u793a\u4f8b\u503c<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">DrawIndexedInstanced<\/span><span class=\"token punctuation\">(<\/span>triangleCount <span class=\"token operator\">*<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span> instances<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instanceBuffer<span class=\"token punctuation\">)<\/span> instanceBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>dynamicInstanceBuffer<span class=\"token punctuation\">)<\/span> dynamicInstanceBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>vertexBuffer<span class=\"token punctuation\">)<\/span> vertexBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>indexBuffer<span class=\"token punctuation\">)<\/span> indexBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instancedVS<span class=\"token punctuation\">)<\/span> instancedVS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instancedPS<span class=\"token punctuation\">)<\/span> instancedPS<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>instancedInputLayout<span class=\"token punctuation\">)<\/span> instancedInputLayout<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>perFrameBuffer<span class=\"token punctuation\">)<\/span> perFrameBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>perInstanceBuffer<span class=\"token punctuation\">)<\/span> perInstanceBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">InstancedRenderer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>13.3.2 \u7ea7\u8054\u9634\u5f71\u6620\u5c04<\/h4>\n<p>\u7ea7\u8054\u9634\u5f71\u6620\u5c04\u662f\u5927\u578b\u5f00\u653e\u4e16\u754c\u6e38\u620f\u4e2d\u7684\u5173\u952e\u6280\u672f&#xff0c;\u300a\u4e0a\u53e4\u5377\u8f745&#xff1a;\u5929\u9645\u300b\u548c\u300a\u5deb\u5e083\u300b\u90fd\u4f7f\u7528\u4e86\u8fd9\u9879\u6280\u672f\u6765\u5904\u7406\u5927\u8303\u56f4\u7684\u52a8\u6001\u9634\u5f71\u3002<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">CascadedShadowMap<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">CascadeData<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        XMFLOAT4X4 viewProjMatrix<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT4 splitDepth<span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT3 lightDirection<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> padding<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9634\u5f71\u56fe\u7eb9\u7406\u548c\u89c6\u56fe<\/span><br \/>\n    ID3D11Texture2D<span class=\"token operator\">*<\/span> shadowMapArray<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DepthStencilView<span class=\"token operator\">*<\/span> shadowDSV<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> shadowSRV<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9634\u5f71\u56fe\u5c3a\u5bf8\u548c\u7ea7\u8054\u6570\u91cf<\/span><br \/>\n    UINT shadowMapSize<span class=\"token punctuation\">;<\/span><br \/>\n    UINT cascadeCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89c6\u9525\u5206\u5272\u8ddd\u79bb<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span> cascadeSplits<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> cascadeBuffer<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89c6\u53e3\u6570\u7ec4<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>D3D11_VIEWPORT<span class=\"token operator\">&gt;<\/span> cascadeViewports<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">CascadedShadowMap<\/span><span class=\"token punctuation\">(<\/span>ID3D11Device<span class=\"token operator\">*<\/span> dev<span class=\"token punctuation\">,<\/span> ID3D11DeviceContext<span class=\"token operator\">*<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">device<\/span><span class=\"token punctuation\">(<\/span>dev<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">shadowMapArray<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">shadowDSV<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">shadowSRV<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">shadowMapSize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2048<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">cascadeCount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">cascadeBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u9ed8\u8ba4\u7ea7\u8054\u5206\u5272&#xff08;\u57fa\u4e8e\u5230\u6444\u50cf\u673a\u7684\u8ddd\u79bb&#xff09;<\/span><br \/>\n        cascadeSplits <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token number\">0.05f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.15f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.50f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0f<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">Initialize<\/span><span class=\"token punctuation\">(<\/span>UINT size <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2048<\/span><span class=\"token punctuation\">,<\/span> UINT cascades <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        shadowMapSize <span class=\"token operator\">&#061;<\/span> size<span class=\"token punctuation\">;<\/span><br \/>\n        cascadeCount <span class=\"token operator\">&#061;<\/span> cascades<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u9634\u5f71\u56fe\u6570\u7ec4\u7eb9\u7406<\/span><br \/>\n        D3D11_TEXTURE2D_DESC shadowMapDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>shadowMapDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>shadowMapDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        shadowMapDesc<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> shadowMapSize<span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> shadowMapSize<span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> cascadeCount<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6bcf\u4e2a\u7ea7\u8054\u4e00\u5c42<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R32_TYPELESS<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7528\u4e8e\u6df1\u5ea6\u548c\u7740\u8272\u5668\u91c7\u6837<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>SampleDesc<span class=\"token punctuation\">.<\/span>Quality <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_DEPTH_STENCIL <span class=\"token operator\">|<\/span> D3D11_BIND_SHADER_RESOURCE<span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        shadowMapDesc<span class=\"token punctuation\">.<\/span>MiscFlags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateTexture2D<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>shadowMapDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>shadowMapArray<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u6df1\u5ea6\u6a21\u677f\u89c6\u56fe<\/span><br \/>\n        D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dsvDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        dsvDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_D32_FLOAT<span class=\"token punctuation\">;<\/span><br \/>\n        dsvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_DSV_DIMENSION_TEXTURE2DARRAY<span class=\"token punctuation\">;<\/span><br \/>\n        dsvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>MipSlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        dsvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>FirstArraySlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        dsvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> cascadeCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>shadowMapArray<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>dsvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>shadowDSV<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u7740\u8272\u5668\u8d44\u6e90\u89c6\u56fe<\/span><br \/>\n        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>srvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>srvDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        srvDesc<span class=\"token punctuation\">.<\/span>Format <span class=\"token operator\">&#061;<\/span> DXGI_FORMAT_R32_FLOAT<span class=\"token punctuation\">;<\/span><br \/>\n        srvDesc<span class=\"token punctuation\">.<\/span>ViewDimension <span class=\"token operator\">&#061;<\/span> D3D11_SRV_DIMENSION_TEXTURE2DARRAY<span class=\"token punctuation\">;<\/span><br \/>\n        srvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>MostDetailedMip <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        srvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>MipLevels <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        srvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>FirstArraySlice <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        srvDesc<span class=\"token punctuation\">.<\/span>Texture2DArray<span class=\"token punctuation\">.<\/span>ArraySize <span class=\"token operator\">&#061;<\/span> cascadeCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateShaderResourceView<\/span><span class=\"token punctuation\">(<\/span>shadowMapArray<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>srvDesc<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>shadowSRV<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">FAILED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u4e3a\u6bcf\u4e2a\u7ea7\u8054\u521b\u5efa\u89c6\u53e3<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>UINT i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> cascadeCount<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            D3D11_VIEWPORT viewport<span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>TopLeftX <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>TopLeftY <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>Width <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>shadowMapSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>Height <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">float<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>shadowMapSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>MinDepth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            viewport<span class=\"token punctuation\">.<\/span>MaxDepth <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            cascadeViewports<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>viewport<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521b\u5efa\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_BUFFER_DESC bufferDesc<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>bufferDesc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>bufferDesc<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        bufferDesc<span class=\"token punctuation\">.<\/span>Usage <span class=\"token operator\">&#061;<\/span> D3D11_USAGE_DYNAMIC<span class=\"token punctuation\">;<\/span><br \/>\n        bufferDesc<span class=\"token punctuation\">.<\/span>ByteWidth <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>CascadeData<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> cascadeCount<span class=\"token punctuation\">;<\/span><br \/>\n        bufferDesc<span class=\"token punctuation\">.<\/span>BindFlags <span class=\"token operator\">&#061;<\/span> D3D11_BIND_CONSTANT_BUFFER<span class=\"token punctuation\">;<\/span><br \/>\n        bufferDesc<span class=\"token punctuation\">.<\/span>CPUAccessFlags <span class=\"token operator\">&#061;<\/span> D3D11_CPU_ACCESS_WRITE<span class=\"token punctuation\">;<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CreateBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>bufferDesc<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cascadeBuffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">BeginShadowPass<\/span><span class=\"token punctuation\">(<\/span>UINT cascadeIndex<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>cascadeIndex <span class=\"token operator\">&gt;&#061;<\/span> cascadeCount<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5f53\u524d\u7ea7\u8054\u7684\u6e32\u67d3\u76ee\u6807<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">RSSetViewports<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cascadeViewports<span class=\"token punctuation\">[<\/span>cascadeIndex<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6e05\u9664\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearDepthStencilView<\/span><span class=\"token punctuation\">(<\/span>shadowDSV<span class=\"token punctuation\">,<\/span> D3D11_CLEAR_DEPTH<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u9634\u5f71\u56fe\u4e3a\u6df1\u5ea6\u7f13\u51b2\u533a<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">OMSetRenderTargets<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> shadowDSV<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">CalculateCascadeMatrices<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraPosition<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraDirection<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> lightDirection<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> cameraNear<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> cameraFar<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> cameraFOV<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> aspectRatio<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6bcf\u4e2a\u7ea7\u8054\u7684\u89c6\u56fe\u6295\u5f71\u77e9\u9635<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>CascadeData<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">cascadeData<\/span><span class=\"token punctuation\">(<\/span>cascadeCount<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>UINT i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> cascadeCount<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">float<\/span> splitNear <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> cameraNear <span class=\"token operator\">:<\/span> cascadeSplits<span class=\"token punctuation\">[<\/span>i<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> cameraFar<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">float<\/span> splitFar <span class=\"token operator\">&#061;<\/span> cascadeSplits<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> cameraFar<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u8ba1\u7b97\u7ea7\u8054\u7684\u89c6\u9525<\/span><br \/>\n            XMFLOAT4X4 cascadeViewProj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">CalculateCascadeViewProj<\/span><span class=\"token punctuation\">(<\/span><br \/>\n                cameraPosition<span class=\"token punctuation\">,<\/span> cameraDirection<span class=\"token punctuation\">,<\/span> lightDirection<span class=\"token punctuation\">,<\/span><br \/>\n                splitNear<span class=\"token punctuation\">,<\/span> splitFar<span class=\"token punctuation\">,<\/span> cameraFOV<span class=\"token punctuation\">,<\/span> aspectRatio<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            cascadeData<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>viewProjMatrix <span class=\"token operator\">&#061;<\/span> cascadeViewProj<span class=\"token punctuation\">;<\/span><br \/>\n            cascadeData<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>splitDepth <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMFLOAT4<\/span><span class=\"token punctuation\">(<\/span>splitNear<span class=\"token punctuation\">,<\/span> splitFar<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            cascadeData<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>lightDirection <span class=\"token operator\">&#061;<\/span> lightDirection<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u66f4\u65b0\u5e38\u91cf\u7f13\u51b2\u533a<\/span><br \/>\n        D3D11_MAPPED_SUBRESOURCE mapped<span class=\"token punctuation\">;<\/span><br \/>\n        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Map<\/span><span class=\"token punctuation\">(<\/span>cascadeBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> D3D11_MAP_WRITE_DISCARD<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>mapped<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>mapped<span class=\"token punctuation\">.<\/span>pData<span class=\"token punctuation\">,<\/span> cascadeData<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>CascadeData<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> cascadeCount<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        deviceContext<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Unmap<\/span><span class=\"token punctuation\">(<\/span>cascadeBuffer<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    XMFLOAT4X4 <span class=\"token function\">CalculateCascadeViewProj<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraPos<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraDir<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> lightDir<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> nearPlane<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> farPlane<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> fov<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> aspect<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6444\u50cf\u673a\u89c6\u9525\u7684\u89d2\u70b9<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>XMFLOAT3<span class=\"token operator\">&gt;<\/span> frustumCorners <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">CalculateFrustumCorners<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            cameraPos<span class=\"token punctuation\">,<\/span> cameraDir<span class=\"token punctuation\">,<\/span> nearPlane<span class=\"token punctuation\">,<\/span> farPlane<span class=\"token punctuation\">,<\/span> fov<span class=\"token punctuation\">,<\/span> aspect<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u5305\u56f4\u8fd9\u4e9b\u70b9\u7684AABB<\/span><br \/>\n        XMFLOAT3 minBounds <span class=\"token operator\">&#061;<\/span> frustumCorners<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        XMFLOAT3 maxBounds <span class=\"token operator\">&#061;<\/span> frustumCorners<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> corner <span class=\"token operator\">:<\/span> frustumCorners<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            minBounds<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            minBounds<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            minBounds<span class=\"token punctuation\">.<\/span>z <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            maxBounds<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>maxBounds<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            maxBounds<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>maxBounds<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            maxBounds<span class=\"token punctuation\">.<\/span>z <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>maxBounds<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u4ece\u5149\u6e90\u65b9\u5411\u521b\u5efa\u89c6\u56fe\u77e9\u9635<\/span><br \/>\n        XMVECTOR lightPos <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">&#043;<\/span> maxBounds<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>y <span class=\"token operator\">&#043;<\/span> maxBounds<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">.<\/span>z <span class=\"token operator\">&#043;<\/span> maxBounds<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        XMVECTOR lightTarget <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorAdd<\/span><span class=\"token punctuation\">(<\/span>lightPos<span class=\"token punctuation\">,<\/span> <span class=\"token function\">XMLoadFloat3<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>lightDir<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        XMVECTOR lightUp <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        XMMATRIX lightView <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMMatrixLookAtLH<\/span><span class=\"token punctuation\">(<\/span>lightPos<span class=\"token punctuation\">,<\/span> lightTarget<span class=\"token punctuation\">,<\/span> lightUp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6b63\u4ea4\u6295\u5f71\u77e9\u9635<\/span><br \/>\n        XMFLOAT3 aabbMin<span class=\"token punctuation\">,<\/span> aabbMax<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">TransformAABB<\/span><span class=\"token punctuation\">(<\/span>minBounds<span class=\"token punctuation\">,<\/span> maxBounds<span class=\"token punctuation\">,<\/span> lightView<span class=\"token punctuation\">,<\/span> aabbMin<span class=\"token punctuation\">,<\/span> aabbMax<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        XMMATRIX lightProj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMMatrixOrthographicOffCenterLH<\/span><span class=\"token punctuation\">(<\/span><br \/>\n            aabbMin<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> aabbMax<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span><br \/>\n            aabbMin<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> aabbMax<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span><br \/>\n            aabbMin<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">,<\/span> aabbMax<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u7ec4\u5408\u89c6\u56fe\u6295\u5f71\u77e9\u9635<\/span><br \/>\n        XMFLOAT4X4 result<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">XMStoreFloat4x4<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>result<span class=\"token punctuation\">,<\/span> <span class=\"token function\">XMMatrixMultiply<\/span><span class=\"token punctuation\">(<\/span>lightView<span class=\"token punctuation\">,<\/span> lightProj<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> result<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>XMFLOAT3<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">CalculateFrustumCorners<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraPos<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> cameraDir<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> nearPlane<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> farPlane<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> fov<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> aspect<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>XMFLOAT3<span class=\"token operator\">&gt;<\/span> <span class=\"token function\">corners<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u8fd1\u5e73\u9762\u548c\u8fdc\u5e73\u9762\u7684\u534a\u9ad8\u548c\u534a\u5bbd<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> nearHalfHeight <span class=\"token operator\">&#061;<\/span> nearPlane <span class=\"token operator\">*<\/span> <span class=\"token function\">tan<\/span><span class=\"token punctuation\">(<\/span>fov <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> nearHalfWidth <span class=\"token operator\">&#061;<\/span> nearHalfHeight <span class=\"token operator\">*<\/span> aspect<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">float<\/span> farHalfHeight <span class=\"token operator\">&#061;<\/span> farPlane <span class=\"token operator\">*<\/span> <span class=\"token function\">tan<\/span><span class=\"token punctuation\">(<\/span>fov <span class=\"token operator\">*<\/span> <span class=\"token number\">0.5f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> farHalfWidth <span class=\"token operator\">&#061;<\/span> farHalfHeight <span class=\"token operator\">*<\/span> aspect<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6444\u50cf\u673a\u7684\u53f3\u5411\u91cf\u548c\u4e0a\u5411\u91cf<\/span><br \/>\n        XMVECTOR cameraRight <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7b80\u5316&#xff1a;\u5047\u8bbeX\u8f74\u4e3a\u53f3<\/span><br \/>\n        XMVECTOR cameraUp <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ Y\u8f74\u4e3a\u4e0a<\/span><\/p>\n<p>        XMVECTOR cameraForward <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMLoadFloat3<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>cameraDir<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u89d2\u70b9<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd1\u5e73\u9762<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> nearPlane <span class=\"token operator\">&#8211;<\/span> cameraRight <span class=\"token operator\">*<\/span> nearHalfWidth <span class=\"token operator\">&#8211;<\/span> cameraUp <span class=\"token operator\">*<\/span> nearHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> nearPlane <span class=\"token operator\">&#043;<\/span> cameraRight <span class=\"token operator\">*<\/span> nearHalfWidth <span class=\"token operator\">&#8211;<\/span> cameraUp <span class=\"token operator\">*<\/span> nearHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> nearPlane <span class=\"token operator\">&#043;<\/span> cameraRight <span class=\"token operator\">*<\/span> nearHalfWidth <span class=\"token operator\">&#043;<\/span> cameraUp <span class=\"token operator\">*<\/span> nearHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> nearPlane <span class=\"token operator\">&#8211;<\/span> cameraRight <span class=\"token operator\">*<\/span> nearHalfWidth <span class=\"token operator\">&#043;<\/span> cameraUp <span class=\"token operator\">*<\/span> nearHalfHeight<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8fdc\u5e73\u9762<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> farPlane <span class=\"token operator\">&#8211;<\/span> cameraRight <span class=\"token operator\">*<\/span> farHalfWidth <span class=\"token operator\">&#8211;<\/span> cameraUp <span class=\"token operator\">*<\/span> farHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> farPlane <span class=\"token operator\">&#043;<\/span> cameraRight <span class=\"token operator\">*<\/span> farHalfWidth <span class=\"token operator\">&#8211;<\/span> cameraUp <span class=\"token operator\">*<\/span> farHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> farPlane <span class=\"token operator\">&#043;<\/span> cameraRight <span class=\"token operator\">*<\/span> farHalfWidth <span class=\"token operator\">&#043;<\/span> cameraUp <span class=\"token operator\">*<\/span> farHalfHeight<span class=\"token punctuation\">;<\/span><br \/>\n        corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cameraPos <span class=\"token operator\">&#043;<\/span> cameraForward <span class=\"token operator\">*<\/span> farPlane <span class=\"token operator\">&#8211;<\/span> cameraRight <span class=\"token operator\">*<\/span> farHalfWidth <span class=\"token operator\">&#043;<\/span> cameraUp <span class=\"token operator\">*<\/span> farHalfHeight<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> corners<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">TransformAABB<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> minPt<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMFLOAT3<span class=\"token operator\">&amp;<\/span> maxPt<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> XMMATRIX<span class=\"token operator\">&amp;<\/span> transform<span class=\"token punctuation\">,<\/span><br \/>\n        XMFLOAT3<span class=\"token operator\">&amp;<\/span> outMin<span class=\"token punctuation\">,<\/span><br \/>\n        XMFLOAT3<span class=\"token operator\">&amp;<\/span> outMax<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u53d8\u6362AABB\u7684\u6240\u6709\u89d2\u70b9<\/span><br \/>\n        XMFLOAT3 corners<span class=\"token punctuation\">[<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            minPt<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>maxPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>minPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>maxPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>minPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>maxPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> minPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token function\">XMFLOAT3<\/span><span class=\"token punctuation\">(<\/span>minPt<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">,<\/span> maxPt<span class=\"token punctuation\">.<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            maxPt<br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u8f93\u51fa\u8fb9\u754c<\/span><br \/>\n        XMVECTOR vMin <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span>FLT_MAX<span class=\"token punctuation\">,<\/span> FLT_MAX<span class=\"token punctuation\">,<\/span> FLT_MAX<span class=\"token punctuation\">,<\/span> FLT_MAX<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        XMVECTOR vMax <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorSet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>FLT_MAX<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span>FLT_MAX<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span>FLT_MAX<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&#8211;<\/span>FLT_MAX<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u53d8\u6362\u6240\u6709\u70b9\u5e76\u66f4\u65b0\u8fb9\u754c<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            XMVECTOR corner <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMLoadFloat3<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>corners<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            corner <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVector3Transform<\/span><span class=\"token punctuation\">(<\/span>corner<span class=\"token punctuation\">,<\/span> transform<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            vMin <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorMin<\/span><span class=\"token punctuation\">(<\/span>vMin<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            vMax <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">XMVectorMax<\/span><span class=\"token punctuation\">(<\/span>vMax<span class=\"token punctuation\">,<\/span> corner<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token function\">XMStoreFloat3<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>outMin<span class=\"token punctuation\">,<\/span> vMin<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">XMStoreFloat3<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>outMax<span class=\"token punctuation\">,<\/span> vMax<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shadowSRV<span class=\"token punctuation\">)<\/span> shadowSRV<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shadowDSV<span class=\"token punctuation\">)<\/span> shadowDSV<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shadowMapArray<span class=\"token punctuation\">)<\/span> shadowMapArray<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>cascadeBuffer<span class=\"token punctuation\">)<\/span> cascadeBuffer<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    ID3D11ShaderResourceView<span class=\"token operator\">*<\/span> <span class=\"token function\">GetShadowSRV<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> shadowSRV<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    ID3D11Buffer<span class=\"token operator\">*<\/span> <span class=\"token function\">GetCascadeBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> cascadeBuffer<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    UINT <span class=\"token function\">GetCascadeCount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> cascadeCount<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">CascadedShadowMap<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>13.4 \u6027\u80fd\u4f18\u5316\u4e0e\u8c03\u8bd5<\/h3>\n<h4>13.4.1 Direct3D\u8c03\u8bd5\u6280\u5de7<\/h4>\n<p>\u5728\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d&#xff0c;\u8c03\u8bd5\u56fe\u5f62\u95ee\u9898\u662f\u4e00\u9879\u91cd\u8981\u6280\u80fd\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5b9e\u7528\u7684\u8c03\u8bd5\u6280\u5de7&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Direct3DDebugHelper<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    ID3D11Device<span class=\"token operator\">*<\/span> device<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11DeviceContext<span class=\"token operator\">*<\/span> deviceContext<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8c03\u8bd5\u63a5\u53e3<\/span><br \/>\n    ID3D11Debug<span class=\"token operator\">*<\/span> d3dDebug<span class=\"token punctuation\">;<\/span><br \/>\n    ID3D11InfoQueue<span class=\"token operator\">*<\/span> infoQueue<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Direct3DDebugHelper<\/span><span class=\"token punctuation\">(<\/span>ID3D11Device<span class=\"token operator\">*<\/span> dev<span class=\"token punctuation\">,<\/span> ID3D11DeviceContext<span class=\"token operator\">*<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">device<\/span><span class=\"token punctuation\">(<\/span>dev<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">deviceContext<\/span><span class=\"token punctuation\">(<\/span>context<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">d3dDebug<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">,<\/span> <span class=\"token function\">infoQueue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">bool<\/span> <span class=\"token function\">InitializeDebugLayer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        HRESULT result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">QueryInterface<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__uuidof<\/span><span class=\"token punctuation\">(<\/span>ID3D11Debug<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>d3dDebug<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> device<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">QueryInterface<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">__uuidof<\/span><span class=\"token punctuation\">(<\/span>ID3D11InfoQueue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>infoQueue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">SUCCEEDED<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u4fe1\u606f\u961f\u5217\u8fc7\u6ee4\u5668<\/span><br \/>\n                D3D11_INFO_QUEUE_FILTER filter<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">ZeroMemory<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>filter<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>filter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u5141\u8bb8\u6240\u6709\u6d88\u606f\u7c7b\u578b<\/span><br \/>\n                D3D11_MESSAGE_SEVERITY severities<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    D3D11_MESSAGE_SEVERITY_CORRUPTION<span class=\"token punctuation\">,<\/span><br \/>\n                    D3D11_MESSAGE_SEVERITY_ERROR<span class=\"token punctuation\">,<\/span><br \/>\n                    D3D11_MESSAGE_SEVERITY_WARNING<span class=\"token punctuation\">,<\/span><br \/>\n                    D3D11_MESSAGE_SEVERITY_INFO<span class=\"token punctuation\">,<\/span><br \/>\n                    D3D11_MESSAGE_SEVERITY_MESSAGE<br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                filter<span class=\"token punctuation\">.<\/span>AllowList<span class=\"token punctuation\">.<\/span>NumSeverities <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ARRAYSIZE<\/span><span class=\"token punctuation\">(<\/span>severities<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                filter<span class=\"token punctuation\">.<\/span>AllowList<span class=\"token punctuation\">.<\/span>pSeverityList <span class=\"token operator\">&#061;<\/span> severities<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u5b58\u50a8\u9650\u5236<\/span><br \/>\n                infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">SetStorageFilterStackIndex<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">AddStorageFilterEntries<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>filter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u56de\u8c03\u51fd\u6570<\/span><br \/>\n                infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">SetMessageCountLimit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">CheckForLiveObjects<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>d3dDebug<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;&#061;&#061;&#061; \u68c0\u67e5Direct3D\u5b58\u6d3b\u5bf9\u8c61 &#061;&#061;&#061;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            d3dDebug<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ReportLiveDeviceObjects<\/span><span class=\"token punctuation\">(<\/span>D3D11_RLDO_DETAIL <span class=\"token operator\">|<\/span> D3D11_RLDO_IGNORE_INTERNAL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;&#061;&#061;&#061; \u68c0\u67e5\u5b8c\u6210 &#061;&#061;&#061;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">PrintMessages<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>infoQueue<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        UINT64 messageCount <span class=\"token operator\">&#061;<\/span> infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetNumStoredMessages<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>UINT64 i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> messageCount<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            SIZE_T messageSize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetMessage<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>messageSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            D3D11_MESSAGE<span class=\"token operator\">*<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>D3D11_MESSAGE<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span>messageSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">GetMessage<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>messageSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u6839\u636e\u4e25\u91cd\u7ea7\u522b\u8f93\u51fa\u6d88\u606f<\/span><br \/>\n            <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>message<span class=\"token operator\">-&gt;<\/span>Severity<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> D3D11_MESSAGE_SEVERITY_CORRUPTION<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;[CORRUPTION] &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> D3D11_MESSAGE_SEVERITY_ERROR<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;[ERROR] &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> D3D11_MESSAGE_SEVERITY_WARNING<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;[WARNING] &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> D3D11_MESSAGE_SEVERITY_INFO<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;[INFO] &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> D3D11_MESSAGE_SEVERITY_MESSAGE<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;[MESSAGE] &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token function\">OutputDebugStringA<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token operator\">-&gt;<\/span>pDescription<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u6e05\u7a7a\u6d88\u606f\u961f\u5217<\/span><br \/>\n        infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">ClearStoredMessages<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">BeginEvent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>wstring<span class=\"token operator\">&amp;<\/span> eventName<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728GPU\u8c03\u8bd5\u5668\u4e2d\u6807\u8bb0\u4e8b\u4ef6\u5f00\u59cb<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6ce8\u610f&#xff1a;\u8fd9\u9700\u8981Windows 8\u6216\u66f4\u9ad8\u7248\u672c<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5728\u5b9e\u9645\u4ee3\u7801\u4e2d\u5e94\u4f7f\u7528\u6761\u4ef6\u7f16\u8bd1<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">_DEBUG<\/span><\/span><br \/>\n            <span class=\"token comment\">\/\/ deviceContext-&gt;BeginEvent(eventName.c_str());<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">EndEvent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">_DEBUG<\/span><\/span><br \/>\n            <span class=\"token comment\">\/\/ deviceContext-&gt;EndEvent();<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">SetMarker<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>wstring<span class=\"token operator\">&amp;<\/span> markerName<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">_DEBUG<\/span><\/span><br \/>\n            <span class=\"token comment\">\/\/ deviceContext-&gt;SetMarker(markerName.c_str());<\/span><br \/>\n        <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>infoQueue<span class=\"token punctuation\">)<\/span> infoQueue<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>d3dDebug<span class=\"token punctuation\">)<\/span> d3dDebug<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">Release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">Direct3DDebugHelper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Cleanup<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>13.4.2 \u6027\u80fd\u5206\u6790<\/h4>\n<p>\u6027\u80fd\u5206\u6790\u5bf9\u4e8e\u4f18\u5316\u6e38\u620f\u81f3\u5173\u91cd\u8981\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u6027\u80fd\u5206\u6790\u5668&#xff1a;<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PerformanceProfiler<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">ProfileSample<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string name<span class=\"token punctuation\">;<\/span><br \/>\n        LARGE_INTEGER startTime<span class=\"token punctuation\">;<\/span><br \/>\n        LARGE_INTEGER endTime<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> duration<span class=\"token punctuation\">;<\/span><br \/>\n        UINT callCount<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> totalTime<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> minTime<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> maxTime<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    LARGE_INTEGER frequency<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>map<span class=\"token operator\">&lt;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token punctuation\">,<\/span> ProfileSample<span class=\"token operator\">&gt;<\/span> samples<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">PerformanceProfiler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">QueryPerformanceFrequency<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>frequency<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">BeginSample<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> sampleName<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        ProfileSample<span class=\"token operator\">&amp;<\/span> sample <span class=\"token operator\">&#061;<\/span> samples<span class=\"token punctuation\">[<\/span>sampleName<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        sample<span class=\"token punctuation\">.<\/span>name <span class=\"token operator\">&#061;<\/span> sampleName<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">QueryPerformanceCounter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>sample<span class=\"token punctuation\">.<\/span>startTime<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">EndSample<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> sampleName<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> it <span class=\"token operator\">&#061;<\/span> samples<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>sampleName<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>it <span class=\"token operator\">&#061;&#061;<\/span> samples<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        ProfileSample<span class=\"token operator\">&amp;<\/span> sample <span class=\"token operator\">&#061;<\/span> it<span class=\"token operator\">-&gt;<\/span>second<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">QueryPerformanceCounter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>sample<span class=\"token punctuation\">.<\/span>endTime<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u8ba1\u7b97\u6301\u7eed\u65f6\u95f4&#xff08;\u6beb\u79d2&#xff09;<\/span><br \/>\n        sample<span class=\"token punctuation\">.<\/span>duration <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>sample<span class=\"token punctuation\">.<\/span>endTime<span class=\"token punctuation\">.<\/span>QuadPart <span class=\"token operator\">&#8211;<\/span> sample<span class=\"token punctuation\">.<\/span>startTime<span class=\"token punctuation\">.<\/span>QuadPart<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">1000.0<\/span> <span class=\"token operator\">\/<\/span> frequency<span class=\"token punctuation\">.<\/span>QuadPart<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u66f4\u65b0\u7edf\u8ba1\u4fe1\u606f<\/span><br \/>\n        sample<span class=\"token punctuation\">.<\/span>callCount<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        sample<span class=\"token punctuation\">.<\/span>totalTime <span class=\"token operator\">&#043;&#061;<\/span> sample<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>sample<span class=\"token punctuation\">.<\/span>callCount <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            sample<span class=\"token punctuation\">.<\/span>minTime <span class=\"token operator\">&#061;<\/span> sample<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">;<\/span><br \/>\n            sample<span class=\"token punctuation\">.<\/span>maxTime <span class=\"token operator\">&#061;<\/span> sample<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            sample<span class=\"token punctuation\">.<\/span>minTime <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>sample<span class=\"token punctuation\">.<\/span>minTime<span class=\"token punctuation\">,<\/span> sample<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            sample<span class=\"token punctuation\">.<\/span>maxTime <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>sample<span class=\"token punctuation\">.<\/span>maxTime<span class=\"token punctuation\">,<\/span> sample<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">PrintResults<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;&#061;&#061;&#061; \u6027\u80fd\u5206\u6790\u7ed3\u679c &#061;&#061;&#061;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">auto<\/span><span class=\"token operator\">&amp;<\/span> pair <span class=\"token operator\">:<\/span> samples<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> ProfileSample<span class=\"token operator\">&amp;<\/span> sample <span class=\"token operator\">&#061;<\/span> pair<span class=\"token punctuation\">.<\/span>second<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">double<\/span> avgTime <span class=\"token operator\">&#061;<\/span> sample<span class=\"token punctuation\">.<\/span>totalTime <span class=\"token operator\">\/<\/span> sample<span class=\"token punctuation\">.<\/span>callCount<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">wchar_t<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">512<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">swprintf_s<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">,<\/span> L<span class=\"token string\">&#034;%S: \u8c03\u7528\u6b21\u6570&#061;%u, \u5e73\u5747\u65f6\u95f4&#061;%.3fms, \u6700\u5c0f\u65f6\u95f4&#061;%.3fms, \u6700\u5927\u65f6\u95f4&#061;%.3fms, \u603b\u65f6\u95f4&#061;%.3fms\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                sample<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                sample<span class=\"token punctuation\">.<\/span>callCount<span class=\"token punctuation\">,<\/span><br \/>\n                avgTime<span class=\"token punctuation\">,<\/span><br \/>\n                sample<span class=\"token punctuation\">.<\/span>minTime<span class=\"token punctuation\">,<\/span><br \/>\n                sample<span class=\"token punctuation\">.<\/span>maxTime<span class=\"token punctuation\">,<\/span><br \/>\n                sample<span class=\"token punctuation\">.<\/span>totalTime<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token function\">OutputDebugString<\/span><span class=\"token punctuation\">(<\/span>L<span class=\"token string\">&#034;&#061;&#061;&#061; \u5206\u6790\u7ed3\u675f &#061;&#061;&#061;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u91cd\u7f6e\u7edf\u8ba1\u4fe1\u606f<\/span><br \/>\n        samples<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">double<\/span> <span class=\"token function\">GetSampleDuration<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> sampleName<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> it <span class=\"token operator\">&#061;<\/span> samples<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span>sampleName<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>it <span class=\"token operator\">!&#061;<\/span> samples<span class=\"token punctuation\">.<\/span><span class=\"token function\">end<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> it<span class=\"token operator\">-&gt;<\/span>second<span class=\"token punctuation\">.<\/span>duration<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>13.5 \u603b\u7ed3<\/h3>\n<p>\u672c\u7ae0\u6df1\u5165\u63a2\u8ba8\u4e86Direct3D\u6838\u5fc3\u7f16\u7a0b\u7684\u5404\u4e2a\u65b9\u9762&#xff0c;\u4ece\u8bbe\u5907\u521b\u5efa\u5230\u9ad8\u7ea7\u6e32\u67d3\u6280\u672f\u3002\u6211\u4eec\u5b66\u4e60\u4e86&#xff1a;<\/p>\n<li>\u8bbe\u5907\u7ba1\u7406&#xff1a;\u5982\u4f55\u521b\u5efa\u5065\u58ee\u7684Direct3D\u8bbe\u5907&#xff0c;\u5904\u7406\u591a\u79cd\u786c\u4ef6\u914d\u7f6e<\/li>\n<li>\u4ea4\u6362\u94fe\u914d\u7f6e&#xff1a;\u5168\u5c4f\u3001\u7a97\u53e3\u3001\u65e0\u8fb9\u6846\u7a97\u53e3\u7b49\u663e\u793a\u6a21\u5f0f<\/li>\n<li>\u6df1\u5ea6\u6a21\u677f\u7ba1\u7406&#xff1a;\u9ad8\u7ea7\u6df1\u5ea6\u6d4b\u8bd5\u548c\u6a21\u677f\u6d4b\u8bd5\u6280\u672f<\/li>\n<li>\u6e32\u67d3\u6d41\u6c34\u7ebf&#xff1a;\u524d\u5411\u6e32\u67d3\u3001\u5ef6\u8fdf\u6e32\u67d3\u7b49\u73b0\u4ee3\u6e32\u67d3\u67b6\u6784<\/li>\n<li>\u9ad8\u7ea7\u6280\u672f&#xff1a;\u5b9e\u4f8b\u5316\u6e32\u67d3\u3001\u7ea7\u8054\u9634\u5f71\u6620\u5c04<\/li>\n<li>\u6027\u80fd\u4f18\u5316&#xff1a;\u8c03\u8bd5\u6280\u5de7\u548c\u6027\u80fd\u5206\u6790<\/li>\n<p>\u8fd9\u4e9b\u6280\u672f\u662f\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u7684\u57fa\u7840\u3002\u300a\u8d5b\u535a\u670b\u514b2077\u300b\u3001\u300a\u8352\u91ce\u5927\u9556\u5ba22\u300b\u7b49AAA\u6e38\u620f\u90fd\u5efa\u7acb\u5728\u7c7b\u4f3c\u7684\u67b6\u6784\u4e4b\u4e0a\u3002\u901a\u8fc7\u638c\u63e1\u8fd9\u4e9b\u6838\u5fc3\u6982\u5ff5&#xff0c;\u4f60\u5df2\u7ecf\u4e3a\u5f00\u53d1\u81ea\u5df1\u7684Windows\u6e38\u620f\u5960\u5b9a\u4e86\u575a\u5b9e\u7684\u57fa\u7840\u3002<\/p>\n<p>\u8bb0\u4f4f&#xff0c;\u56fe\u5f62\u7f16\u7a0b\u662f\u4e00\u4e2a\u4e0d\u65ad\u53d1\u5c55\u7684\u9886\u57df\u3002DirectX 12\u5df2\u7ecf\u5f15\u5165\u4e86\u66f4\u5e95\u5c42\u7684API\u63a7\u5236&#xff0c;Vulkan\u4e5f\u5728\u8de8\u5e73\u53f0\u9886\u57df\u5360\u636e\u91cd\u8981\u5730\u4f4d\u3002\u4f46\u65e0\u8bbaAPI\u5982\u4f55\u53d8\u5316&#xff0c;\u672c\u7ae0\u8ba8\u8bba\u7684\u6838\u5fc3\u6982\u5ff5\u2014\u2014\u6e32\u67d3\u6d41\u6c34\u7ebf\u3001\u8d44\u6e90\u7ba1\u7406\u3001\u6027\u80fd\u4f18\u5316\u2014\u2014\u90fd\u5c06\u662f\u6e38\u620f\u5f00\u53d1\u4e2d\u7684\u91cd\u8981\u57fa\u77f3\u3002<\/p>\n<p>\u5728\u4e0b\u4e00\u7ae0\u4e2d&#xff0c;\u6211\u4eec\u5c06\u63a2\u8ba8\u66f4\u9ad8\u7ea7\u7684\u4e3b\u9898&#xff0c;\u5305\u62ec\u9ad8\u7ea7\u7740\u8272\u5668\u6280\u672f\u3001\u51e0\u4f55\u7740\u8272\u5668\u3001\u66f2\u9762\u7ec6\u5206\u548c\u8ba1\u7b97\u7740\u8272\u5668\u3002\u7ee7\u7eed\u5b66\u4e60&#xff0c;\u4f60\u5c06\u6210\u4e3a\u4e00\u540d\u771f\u6b63\u7684Windows\u6e38\u620f\u7f16\u7a0b\u4e13\u5bb6\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf<br \/>\n13.1 Direct3D\u521d\u59cb\u5316\u6df1\u5ea6\u89e3\u6790\u4e0e\u5546\u4e1a\u5b9e\u8df5<br \/>\n13.1.1 Direct3D\u8bbe\u5907\u521b\u5efa\u7684\u827a\u672f<br \/>\n\u5728\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d&#xff0c;Direct3D\u8bbe\u5907\u7684\u521b\u5efa\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u6280\u672f\u6b65\u9aa4&#xff0c;\u66f4\u662f\u6027\u80fd\u548c\u517c\u5bb9\u6027\u7684\u5e73\u8861\u827a\u672f\u3002\u4ee5\u300a\u5deb\u5e083&#xff1a;\u72c2\u730e\u300b\u4e3a\u4f8b&#xff0c;\u8fd9\u6b3e\u6e38\u620f\u9700\u8981\u652f\u6301\u4eceDirectX 9\u5230DirectX 11\u7684\u5404\u79cd\u786c\u4ef6\u914d\u7f6e&#xff0c;\u56e0\u6b64\u5176\u8bbe\u5907\u521b\u5efa\u903b\u8f91\u5fc5\u987b\u8db3\u591f\u5065\u58ee\u548c\u7075\u6d3b\u3002<br \/>\nWindows\u6e38<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2477,217,149,270,269,248],"topic":[],"class_list":["post-68679","post","type-post","status-publish","format-standard","hentry","category-server","tag-3d","tag-stm32","tag-windows","tag-270","tag-269","tag-248"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/68679.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf 13.1 Direct3D\u521d\u59cb\u5316\u6df1\u5ea6\u89e3\u6790\u4e0e\u5546\u4e1a\u5b9e\u8df5 13.1.1 Direct3D\u8bbe\u5907\u521b\u5efa\u7684\u827a\u672f \u5728\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d&#xff0c;Direct3D\u8bbe\u5907\u7684\u521b\u5efa\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u6280\u672f\u6b65\u9aa4&#xff0c;\u66f4\u662f\u6027\u80fd\u548c\u517c\u5bb9\u6027\u7684\u5e73\u8861\u827a\u672f\u3002\u4ee5\u300a\u5deb\u5e083&#xff1a;\u72c2\u730e\u300b\u4e3a\u4f8b&#xff0c;\u8fd9\u6b3e\u6e38\u620f\u9700\u8981\u652f\u6301\u4eceDirectX 9\u5230DirectX 11\u7684\u5404\u79cd\u786c\u4ef6\u914d\u7f6e&#xff0c;\u56e0\u6b64\u5176\u8bbe\u5907\u521b\u5efa\u903b\u8f91\u5fc5\u987b\u8db3\u591f\u5065\u58ee\u548c\u7075\u6d3b\u3002 Windows\u6e38\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/68679.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T05:24:57+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/68679.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/68679.html\",\"name\":\"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-30T05:24:57+00:00\",\"dateModified\":\"2026-01-30T05:24:57+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/68679.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/68679.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/68679.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/68679.html","og_locale":"zh_CN","og_type":"article","og_title":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf 13.1 Direct3D\u521d\u59cb\u5316\u6df1\u5ea6\u89e3\u6790\u4e0e\u5546\u4e1a\u5b9e\u8df5 13.1.1 Direct3D\u8bbe\u5907\u521b\u5efa\u7684\u827a\u672f \u5728\u5546\u4e1a\u6e38\u620f\u5f00\u53d1\u4e2d&#xff0c;Direct3D\u8bbe\u5907\u7684\u521b\u5efa\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u6280\u672f\u6b65\u9aa4&#xff0c;\u66f4\u662f\u6027\u80fd\u548c\u517c\u5bb9\u6027\u7684\u5e73\u8861\u827a\u672f\u3002\u4ee5\u300a\u5deb\u5e083&#xff1a;\u72c2\u730e\u300b\u4e3a\u4f8b&#xff0c;\u8fd9\u6b3e\u6e38\u620f\u9700\u8981\u652f\u6301\u4eceDirectX 9\u5230DirectX 11\u7684\u5404\u79cd\u786c\u4ef6\u914d\u7f6e&#xff0c;\u56e0\u6b64\u5176\u8bbe\u5907\u521b\u5efa\u903b\u8f91\u5fc5\u987b\u8db3\u591f\u5065\u58ee\u548c\u7075\u6d3b\u3002 Windows\u6e38","og_url":"https:\/\/www.wsisp.com\/helps\/68679.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-30T05:24:57+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"34 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/68679.html","url":"https:\/\/www.wsisp.com\/helps\/68679.html","name":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-30T05:24:57+00:00","dateModified":"2026-01-30T05:24:57+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/68679.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/68679.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/68679.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u7b2c13\u7ae0 Direct3D\u6838\u5fc3\u7f16\u7a0b\u7cbe\u8981\u2014\u2014\u4ece\u521d\u59cb\u5316\u5230\u6e32\u67d3\u6d41\u6c34\u7ebf"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/68679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=68679"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/68679\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=68679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=68679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=68679"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=68679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}