{
    "version": "https://jsonfeed.org/version/1",
    "title": "欢迎来到SirEnri的小站",
    "subtitle": "",
    "icon": "https://sirenri2001.github.io/assets/favicon.ico",
    "description": "",
    "home_page_url": "https://sirenri2001.github.io",
    "items": [
        {
            "id": "https://sirenri2001.github.io/2026/04/23/A-Engine-Note-1/",
            "url": "https://sirenri2001.github.io/2026/04/23/A-Engine-Note-1/",
            "title": "小引擎随笔(1) - 渲染RHI架构设计",
            "date_published": "2026-04-23T04:44:00.000Z",
            "content_html": "<h1 id=\"引言\"><a class=\"anchor\" href=\"#引言\">#</a> 引言</h1>\n<p>现在想来，小引擎这个项目也已经断断续续写了一年多了。这个项目起初是本人学习Vulkan时，重构vulkan-tutorial上面的教程代码的，后来有了一个想法，加D3D12后端和仿照UE写一套渲染相关的实现。同时也顺便补一下我拿了B-的Advanced Graphics。其实此时AI已经发展的相当厉害了，去年的这个时候我还以为AI不会看文档，不会解决复杂问题，但是现在看来，小引擎内部的一些实现（包括PBR和Importance Sampling）我还必须得请教AI。翻阅PBRT的痛苦谁看谁知道。但后续本人可能会结合自己读过的部分写一些笔记，但这都是后话了。这个博客就让我聊聊小引擎里我最引以为傲的部分：RHI层。</p>\n<h1 id=\"rhi层简介\"><a class=\"anchor\" href=\"#rhi层简介\">#</a> RHI层简介</h1>\n<p>全程是Render Hardware Interface，即渲染硬件接口。一般定义是RHI封装了不同Graphics API之间的细节，提供了一个统一的架构。这个硬件接口的定义并非关系Nvidia、AMD等硬件厂商，其实在一般实现中我们主要围绕不同Graphics API的行为去做RHI的封装。当然，一些Graphics API有对应硬件厂商的特殊API，但目前我们不在这里进行讨论。</p>\n<p>Graphics API主要包括：</p>\n<ul>\n<li><strong>OpenGL</strong>: 最为经典（或者古老）的API，使用相对简单，但是也逐渐被淘汰。目前主要用于教学。一般设置固定管线或者使用可编程管线编写glsl shader进行渲染。</li>\n<li><strong>Vulkan</strong>：现代API，OpenGL的后继。可以使用跨平台spir-v，原生支持还是glsl。同时命名也保持了一致（如uniform，location binding等）。所有人都在说Vulkan的初始化很复杂，不过我个人认为，vulkan的API定义十分细致，以至于任何一个错误都会出现在vulkan文档中，而不是fall through到driver，至少目前我开发引擎过程中没有遇到这种情况。相比较D3D12有时只给一个invalid parameter这种错误，我认为vulkan api还是相对容易使用。同时vulkan可以运行在android端设备，虽然我还没有尝试过。</li>\n<li><strong>DX系列</strong>：其实我应该将DX11和DX12分开讲，但是我只用过DX12。DX12可以看到微软做了很多兼容策略，比如使用DXGI这种可以跨各个DX版本的封装。其实这样设计也能理解，因为DX得考虑Windows不同版本，以及XBOX硬件的适配。不过从OpenGL转到现代API，还是使用vulkan最为舒适。</li>\n<li><strong>Web系列</strong>：首先WebGL看起来是发展相对成熟。当然WebGPU也算一类。但是WebGPU终归还是限制太多了，而且开发的shader语言是slang，同时WebGPU对于一些浏览器、特定渲染功能的支持还不是很好。最重要的是，WebGPU用不了renderdoc。不过，从API封装的角度来说，由于web端平台统一，所以WebGPU的封装做的相当好。相对于Vulkan来说更加顺手和符合逻辑。</li>\n<li><strong>Metal</strong>：没用过所以不太清楚。</li>\n</ul>\n<h1 id=\"rhi层架构\"><a class=\"anchor\" href=\"#rhi层架构\">#</a> RHI层架构</h1>\n<p>A-Engine主要是将Vulkan和D3D12（按照UE的命名规范）两种API的主要功能层面做了一个封装。两种API的语义很接近，所以这个工作并不是特别困难。下面对RHI的主要流程做一个拆解：</p>\n<ol>\n<li>Context管理：其实对应的就是VkDevice，功能上负责创建API的环境，根据硬件选择设备，窗口创建，以及设备队列的等待操作。设备同时也需要创建各类对象，但我将其放在了下列每个对象的Initialize函数中。</li>\n<li>Image Resource和Buffer Resource管理：对应2D/3D贴图，mipmap创建，sampler, resource state transition以及host - device，device - device之间的拷贝操作。当然这些资源的所有拷贝和转换操作都需要传入command buffer进行。</li>\n<li>Pipeline管理：由Pipeline factory对应其中的一个shader file set(VS/PS或CS)，然后factory创建出一个pipeline object，绑定所有实际的资源，以及给command buffer进行draw call或dispatch操作。</li>\n<li>Command buffer管理：由Context分配command pool。目前暂时由Swapchain执行command buffer的submit操作，后续这里需要重构修改。这里的设计逻辑与UE不同，command buffer只是作为一个对象，而没有transition、copy函数，所有相关的函数均放在resource类中。</li>\n<li>RenderPass和FrameBuffer：RenderPass你只需要知道target格式就可以创建了，但是framebuffer需要传入具体的resource。所以目前的逻辑是，Pipeline factory创建时不需要任何一个，但是创建pipeline object时递入render pass确定target格式，执行Begin renderpass时传入frame buffer。这样所有资源在begin renderpass之前都能创建好，同时也可以解决一个frame buffer对多个renderpass，或者一个begin renderpass对多个pipeline的情况。</li>\n<li>Swapchain：这个是最头疼的地方。因为要确保host device之间同步。目前暂时的解决办法就是停等，后续可能加入其他的semaphore处理同步操作。</li>\n</ol>\n<p>今天先写到这里。下次更新D3D12的Descriptor Heap分配策略和Resource state transition实现策略。</p>\n",
            "tags": [
                "A-Engine",
                "Rendering"
            ]
        },
        {
            "id": "https://sirenri2001.github.io/2025/02/04/2025-02-05-unreal-shader-tutorial-(Chinese)/",
            "url": "https://sirenri2001.github.io/2025/02/04/2025-02-05-unreal-shader-tutorial-(Chinese)/",
            "title": "Unreal Shader Tutorial - Chinese Ver.",
            "date_published": "2025-02-04T16:00:00.000Z",
            "content_html": "<h1 id=\"chapter-1-引擎编译和工程创建\"><a class=\"anchor\" href=\"#chapter-1-引擎编译和工程创建\">#</a> Chapter 1. 引擎编译和工程创建</h1>\n<h1 id=\"11-从源代码编译ue引擎\"><a class=\"anchor\" href=\"#11-从源代码编译ue引擎\">#</a> 1.1 从源代码编译UE引擎</h1>\n<p>此部分参考Epic官方文档。</p>\n<p><a href=\"https://dev.epicgames.com/documentation/en-us/unreal-engine/downloading-unreal-engine-source-code\">https://dev.epicgames.com/documentation/en-us/unreal-engine/downloading-unreal-engine-source-code</a></p>\n<p><a href=\"https://dev.epicgames.com/documentation/en-us/unreal-engine/building-unreal-engine-from-source\">https://dev.epicgames.com/documentation/en-us/unreal-engine/building-unreal-engine-from-source</a></p>\n<p>需要注意的是，编译UE引擎可能提示msvc版本不匹配。所以推荐在Visual Studio Installer中额外安装MSVC v14.36版本。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-5.png\" alt=\"alt text\" /></p>\n<h1 id=\"12-创建项目和module\"><a class=\"anchor\" href=\"#12-创建项目和module\">#</a> 1.2 创建项目和Module</h1>\n<p>编译结束后，启动UE引擎，创建C++空项目。不要勾选Starter Content和Raytracing。</p>\n<p><img loading=\"lazy\" src=\"/assets/image.png\" alt=\"alt text\" /></p>\n<p>项目根目录按图创建目录和文件</p>\n<p><img loading=\"lazy\" src=\"/assets/image-11.png\" alt=\"alt text\" /></p>\n<p>编辑器打开MyProject.uproject，在&quot;Modules&quot;里面加入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-json\"><span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\t\"</span><span style=\"color:#998418;--shiki-dark:#B8A965\">Name</span><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleComputeShader</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\t\"</span><span style=\"color:#998418;--shiki-dark:#B8A965\">Type</span><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Runtime</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\t\"</span><span style=\"color:#998418;--shiki-dark:#B8A965\">LoadingPhase</span><span style=\"color:#99841877;--shiki-dark:#B8A96577\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Default</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>编写代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-c#\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShader.Build.cs</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">using</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UnrealBuildTool</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ExampleComputeShader</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ModuleRules</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tpublic</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ExampleComputeShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">ReadOnlyTargetRules</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> base</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPCHUsage</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> PCHUsageMode</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UseExplicitOrSharedPCHs</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPublicDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Core</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CoreUObject</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Engine</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">InputCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.AddRange(new string[] &#123; \"\" &#125;);</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using Slate UI</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.AddRange(new string[] &#123; \"Slate\", \"SlateCore\" &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\t</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using online features</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.Add(\"OnlineSubsystem\");</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.h</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Modules/ModuleManager.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> IModuleInterface</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    virtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> StartupModule</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // virtual void ShutdownModule() override;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.cpp</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleComputeShaderModule.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_MODULE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleComputeShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ExampleComputeShader</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">StartupModule</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<blockquote>\n<h2 id=\"重要概念module\"><a class=\"anchor\" href=\"#重要概念module\">#</a> <strong>重要概念：Module</strong></h2>\n<p>与传统的C++项目组织方式不同，Unreal在类/全局函数上层用Module封装。每一个Module必须有[ModuleName].Build.cs文件，定义了该Module的Public和Private引用以及编译的配置。每一个Module通常有Public和Private的文件夹，引用它的Module只能访问到Public文件夹中的头文件。</p>\n<p>每一个Module在项目编译时都会编译出dll和lib文件，供动态/静态链接。我们可以显式地使用MODULENAME_API宏来暴露符号，使链接器可以链接到你引用该Module中的符号。</p>\n<p>更多的内容参考 <a href=\"https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-modules\">https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-modules</a></p>\n</blockquote>\n<h1 id=\"13-编译启动项目\"><a class=\"anchor\" href=\"#13-编译启动项目\">#</a> 1.3 编译&amp;启动项目</h1>\n<p>Explorer打开项目根目录，右键MyProject.uproject文件，选择Generate Visual Studio Project files，打开MyProject.sln，Solution Explorer找到Games/MyProject，右键Build。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-3.png\" alt=\"alt text\" /></p>\n<p>Build结束后，点击Local Windows Debugger，启动项目。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-6.png\" alt=\"alt text\" /></p>\n<h1 id=\"chapter-2-使用ue实现global-compute-shader\"><a class=\"anchor\" href=\"#chapter-2-使用ue实现global-compute-shader\">#</a> Chapter 2. 使用UE实现Global Compute Shader</h1>\n<p>UE提供了面向HLSL的各种接口。其中涉及到底层调用（RHI、RenderCore）以及渲染引擎（Basepass，Lumen）等。我们在这部分先主要了解RHI、RenderCore，并且使用这两个模块实现一个Compute Shader。这个Compute Shader将接受1个float输入，2个float参数，输出1个结果。输入输出我们将使用GPU Buffer。主要的步骤如下：</p>\n<ul>\n<li>编写usf文件（GPU/HLSL端）</li>\n<li>使用UE自带的函数和宏创建该shader（CPU/C++端）</li>\n<li>定义shader的输入输出参数（CPU/C++端）</li>\n<li>创建shader所需的buffer资源</li>\n<li>调用shader</li>\n<li>创建blueprint函数接口，方便调用和调试</li>\n</ul>\n<h1 id=\"21-编写usf文件\"><a class=\"anchor\" href=\"#21-编写usf文件\">#</a> 2.1 编写usf文件</h1>\n<p>usf全称为Unreal Shader File, 使用hlsl格式编写。为了便于调试usf，我们在VS的Solution Explorer中找到Engine/UE5项目，找到Config/ConsoleCariables.ini，在[Startup]下面添加</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-ini\"><span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Startup</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">r.ShaderDevelopmentMode</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">1</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">r.DumpShaderDebugInfo</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">1</span></span></code></pre>\n<p>这样我们可以在shader编译失败马上重试，并且在项目Saved/ShaderDebugInfo文件夹内找到Shader的Debug信息。</p>\n<p>打开项目根目录，新建Shaders/ExampleComputeShader.usf文件，输入HLSL代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShader.usf</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/Engine/Public/Platform.ush</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RWStructuredBuffer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RWStructuredBuffer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#59873A;--shiki-dark:#80A665\">numthreads</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">void FunctionMultiply</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">\tuint3</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> DispatchThreadId</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> : </span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">SV_DispatchThreadID</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tuint</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> GroupIndex</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> : </span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">SV_GroupIndex</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">    OutputBuffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">DispatchThreadId</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> InputBuffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">DispatchThreadId</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<h1 id=\"22-使用ue自带的函数和宏创建global-shader\"><a class=\"anchor\" href=\"#22-使用ue自带的函数和宏创建global-shader\">#</a> 2.2 使用UE自带的函数和宏创建global shader</h1>\n<p>修改ExampleComputeShaderModule.cpp：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.cpp</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">/**</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * FGlobalShader是定义在全局上的，Unreal也有FMaterialShader，目前我们不做讨论。</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * FGlobalShader的初始化将由Unreal定义的宏进行管理，我们可以使用宏方便地初始化Global Shader</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * 需要注意的是，FGlobalShader不能出现成员变量。我们会用其他的方法设置Shader参数</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FGlobalShader</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tDECLARE_SHADER_TYPE</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Global</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 定义一堆函数，我们不用管是什么</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_SHADER_TYPE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/MyShaders/ExampleComputeShader.usf</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">FunctionMultiply</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SF_Compute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 使用宏自动实现FExampleComputeShaderCS的函数。第一个参数可为空，第二个参数是类名，第三个是usf的path，第四个是usf的入口函数名，第五个是shader类型(SF_Vertex, SF_Pixel, SF_Compute等)。</span></span>\n<span class=\"line\"></span></code></pre>\n<p>修改ExampleComputeShader.Build.cs，添加RHI和RenderCore的依赖:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-c#\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShader.Build.cs</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">using</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UnrealBuildTool</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ExampleComputeShader</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ModuleRules</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tpublic</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ExampleComputeShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">ReadOnlyTargetRules</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> base</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPCHUsage</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> PCHUsageMode</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UseExplicitOrSharedPCHs</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPublicDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Core</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CoreUObject</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Engine</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">InputCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPrivateDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">RHI</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">RenderCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // Add this</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using Slate UI</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.AddRange(new string[] &#123; \"Slate\", \"SlateCore\" &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\t</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using online features</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.Add(\"OnlineSubsystem\");</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<blockquote>\n<h2 id=\"链接器错误lnk2019\"><a class=\"anchor\" href=\"#链接器错误lnk2019\">#</a> 链接器错误：LNK2019</h2>\n<p>此处如忘记加RHI或RenderCore依赖，项目构建报链接器错误LNK2019</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>[3/4] Link [x64] UnrealEditor-ExampleComputeShader.dll</span></span>\n<span class=\"line\"><span>  Creating library G:\\UnrealProjects\\MyProject\\Intermediate\\Build\\Win64\\x64\\UnrealEditor\\Development\\ExampleComputeShader\\UnrealEditor-ExampleComputeShader.sup.lib and object G:\\UnrealProjects\\MyProject\\Intermediate\\Build\\Win64\\x64\\UnrealEditor\\Development\\ExampleComputeShader\\UnrealEditor-ExampleComputeShader.sup.exp</span></span>\n<span class=\"line\"><span>ExampleComputeShaderModule.cpp.obj : error LNK2019: unresolved external symbol \"__declspec(dllimport) class FName __cdecl LegacyShaderPlatformToShaderFormat(enum EShaderPlatform)\" referenced in function \"void __cdecl DispatchExampleComputeShader_RenderThread(class FRHICommandList &#x26;,class FExampleComputeShaderResource *,unsigned int,unsigned int,unsigned int)\" </span></span>\n<span class=\"line\"><span>ExampleComputeShaderModule.cpp.obj : error LNK2019: unresolved external symbol \"__declspec(dllimport) private: void __cdecl FRHIResource::Destroy(void)const \" referenced in function \"public: __cdecl TRefCountPtr&#x3C;class FRHIBuffer>::~TRefCountPtr&#x3C;class FRHIBuffer>(void)\"</span></span>\n<span class=\"line\"><span>ExampleComputeShaderModule.cpp.obj : error LNK2019: unresolved external symbol \"__declspec(dllimport) public: __cdecl FRenderResource::FRenderResource(void)\" referenced in function \"public: __cdecl FExampleComputeShaderResource::FExampleComputeShaderResource(void)\"</span></span>\n<span class=\"line\"><span>ExampleComputeShaderModule.cpp.obj : error LNK2019: unresolved external symbol \"__declspec(dllimport) public: virtual __cdecl FRenderResource::~FRenderResource(void)\" referenced in function \"int `public: __cdecl FExampleComputeShaderResource::FExampleComputeShaderResource(class dtor$0 &#x26;&#x26;)'::`1'::dtor$0\"</span></span></code></pre>\n<p>此问题的解决方法是全局搜索未找到的符号（比如LegacyShaderPlatformToShaderFormat），在引擎源文件中找到对应的函数定义</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// Engine/Source/Runtime/RHI/Public/RHIString.h</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">...</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHI_API FName </span><span style=\"color:#59873A;--shiki-dark:#80A665\">LegacyShaderPlatformToShaderFormat</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">EShaderPlatform Platform</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">...</span></span></code></pre>\n<p>发现使用RHI_API，表示我们需要在自己的项目中添加RHI模块的依赖。</p>\n</blockquote>\n<h1 id=\"23-定义shader的输入输出参数\"><a class=\"anchor\" href=\"#23-定义shader的输入输出参数\">#</a> 2.3 定义Shader的输入输出参数</h1>\n<p>定义Global Shader的参数有几种写法，我们详细介绍使用SHADER_PARAMETER_STRUCT的写法。对于其他定义方式（如使用FShaderParameter/FShaderResourceParameter）将不作介绍，读者可以自行研究<a href=\"https://www.cnblogs.com/wakuwaku/articles/16706479.html\">Reference</a>。</p>\n<p>修改FExampleComputeShaderCS的定义：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 添加头文件</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ShaderParameterStruct.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 使用ShaderParameterStruct.h内的宏定义Shader参数结构体。</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// **注意** 这里每个变量名字必须与usf文件中Shader参数名一致。</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">BEGIN_SHADER_PARAMETER_STRUCT</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleComputeShaderParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">SHADER_PARAMETER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">     // 基本类型的shader参数</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">SHADER_PARAMETER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 基本类型的shader参数</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">SHADER_PARAMETER_UAV</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RWStructuredBuffer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> InputBuffer</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  // UAV Buffer类型的shader参数，需要我们后续手动管理</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">SHADER_PARAMETER_UAV</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RWStructuredBuffer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputBuffer</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // UAV Buffer类型的shader参数，需要我们后续手动管理</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">END_SHADER_PARAMETER_STRUCT</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">/**</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * FGlobalShader是定义在全局上的，Unreal也有FMaterialShader，目前我们不做讨论。</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * FGlobalShader的初始化将由Unreal定义的宏进行管理，我们可以使用宏方便地初始化Global Shader</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> * 需要注意的是，FGlobalShader不能出现成员变量。我们会用其他的方法设置Shader参数</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FGlobalShader</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tDECLARE_SHADER_TYPE</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Global</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 定义一堆函数，我们不用管是什么</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tSHADER_USE_PARAMETER_STRUCT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FGlobalShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  // 定义该Shader使用SHADER_PARAMETER_STRUCT来定义Shader参数</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\tusing</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FParameters</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // SHADER_USE_PARAMETER_STRUCT需要我们定义FParameters，我们在类外定义的，所以只需要using就可以。</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//当然也可以直接在FGlobalShader内部定义BEGIN_SHADER_PARAMETER_STRUCT(FParameters,) 两种方法使用一个即可</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_SHADER_TYPE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/MyShaders/ExampleComputeShader.usf</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">FunctionMultiply</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SF_Compute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 使用宏自动实现FExampleComputeShaderCS的函数。第一个参数可为空，第二个参数是类名，第三个是usf的path，第四个是usf的入口函数名，第五个是shader类型(SF_Vertex, SF_Pixel, SF_Compute等)。</span></span></code></pre>\n<blockquote>\n<h2 id=\"重要概念srv和uav\"><a class=\"anchor\" href=\"#重要概念srv和uav\">#</a> 重要概念：<strong>SRV和UAV</strong></h2>\n<p>SRV和UAV都是在DX11中的buffer类型。区别是，UAV可以在HLSL中写入，而SRV不行。SRV可以在任意的shader绑定，但UAV只能绑定pixel shader和compute shader。后续章节将讲解如何在图形渲染管线中使用UAV。</p>\n<p>参考：<a href=\"https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/shader-resource-view--srv-\">https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/shader-resource-view--srv-</a></p>\n</blockquote>\n<h1 id=\"24-创建shader-buffer所需资源\"><a class=\"anchor\" href=\"#24-创建shader-buffer所需资源\">#</a> 2.4 创建Shader Buffer所需资源</h1>\n<p>我们将创建一个FRenderResource的子类。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.h</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> EXAMPLECOMPUTESHADER_API</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FRenderResource</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 使用EXAMPLECOMPUTESHADER_API因为我们要在别的模块访问到这个类</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 单例模式</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFRWBufferStructured InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  // RWStructuredBuffer&#x3C;float> InputBuffer;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFRWBufferStructured OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // RWStructuredBuffer&#x3C;float> OutputBuffer;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 初始化所有buffer，override基类</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 此函数由FRenderResource::InitResource(FRHICommandList&#x26;)调用</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tvirtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> InitRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListBase</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 此函数由FRenderResource::ReleaseResource(FRHICommandList&#x26;)调用</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tvirtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ReleaseRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 释放所有buffer</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Get</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 单例模式</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">private</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tFExampleComputeShaderResource</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 构造函数私有</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.cpp</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 初始化单例指针</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GInstance </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> nullptr</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\tif</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GInstance</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">nullptr</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\tGInstance </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> new</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// 创建执行在RenderThread的任务。第一个括号写全局唯一的标识符，一般为这个Task起个名字。第二个写Lambda表达式，用FRHICommandList&#x26; RHICmdList作为函数参数。</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tENQUEUE_RENDER_COMMAND</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FInitExampleComputeShaderResource</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandList</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t\t</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\t\tGInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">InitResource</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t\t</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\treturn</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// Buffer初始化函数</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">InitRHI</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListBase</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tInputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Initialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">InputBuffer</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tOutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Initialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">OutputBuffer</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// Buffer释放函数</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ReleaseRHI</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tInputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Release</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tOutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Release</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span></code></pre>\n<blockquote>\n<h2 id=\"重要概念gamethread和renderthread\"><a class=\"anchor\" href=\"#重要概念gamethread和renderthread\">#</a> 重要概念：GameThread和RenderThread</h2>\n<p>为了提高效率，Unreal Engine将游戏逻辑和渲染流程分开执行，使用专门的RenderThread负责处理所有渲染相关的工作。所有的游戏逻辑（加载模块、蓝图函数）等都在GameThread执行，而渲染相关的流程在RenderThread执行。判断一个函数是否在RenderThread执行，我们看它：a.是否接受一个FRHICommandList&amp;类型的参数；b.是否有函数IsInRenderingThread()的检查。在GameThread执行Rendering指令会缺失相关渲染环境，导致一系列错误，反之亦然。</p>\n<p>GameThread可以向RenderThread提交渲染任务，使用ENQUEUE_RENDER_COMMAND。具体调用方式见上方代码。使用FlushRenderingCommands()函数flush所有RenderThread任务。</p>\n<p>参考：<a href=\"https://www.cnblogs.com/kekec/p/15464958.html\">https://www.cnblogs.com/kekec/p/15464958.html</a></p>\n</blockquote>\n<h1 id=\"25-调用shader\"><a class=\"anchor\" href=\"#25-调用shader\">#</a> 2.5 调用Shader</h1>\n<p>终于我们到了最后一步。现在我们需要写一个函数整合刚才所有的资源，调用我们的Compute Shader。这里的写法相对比较固定。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleComputeShaderModule.cpp</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> DispatchExampleComputeShader_RenderThread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandList</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> uint32</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> ThreadGroupX</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> uint32</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> ThreadGroupY</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> uint32</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> ThreadGroupZ</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tTShaderMapRef</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleComputeShaderCS</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Shader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetGlobalShaderMap</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GMaxRHIFeatureLevel</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 声明ShaderMap</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tSetComputePipelineState</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetComputeShader</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 设置该RHICmdList的Pipeline为ComputeShader</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\ttypename</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderCS</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FParameters</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Parameters</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 创建Shader参数</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// 设置基本类型</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Scale</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Translate</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// 设置buffer类型</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UAV</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tParameters</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UAV</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// 传入参数</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tSetShaderParameters</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetComputeShader</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Parameters</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 调用Compute shader</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tDispatchComputeShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetShader</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ThreadGroupX</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ThreadGroupY</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ThreadGroupZ</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 取消绑定buffer参数</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//UnsetShaderSRVs(RHICmdList, Shader, Shader.GetComputeShader());</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tUnsetShaderUAVs</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Shader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetComputeShader</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> DispatchExampleComputeShader_GameThread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> InputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 加入RenderThread任务</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tENQUEUE_RENDER_COMMAND</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FDispatchExampleComputeShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> InputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Translate</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListImmediate</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// LockBuffer并写入数据</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\tfloat*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> InputGPUBuffer </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> static_cast</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float*</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">LockBuffer</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> RLM_WriteOnly</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\t*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">InputGPUBuffer </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> InputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 可以使用FMemory::Memcpy</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// UnlockBuffer</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">UnlockBuffer</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">InputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// 调用RenderThread版本的函数</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tDispatchExampleComputeShader_RenderThread</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> GetGPUReadback</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleComputeShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> OutputVal</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tfloat*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pOutputVal </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">OutputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// Flush所有RenderingCommands, 确保我们的shader已经执行了</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tFlushRenderingCommands</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tENQUEUE_RENDER_COMMAND</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FReadbackOutputBuffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pOutputVal</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListImmediate</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// LockBuffer并读取数据</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\tfloat*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputGPUBuffer </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> static_cast</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float*</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">LockBuffer</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> RLM_ReadOnly</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\t*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pOutputVal </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">OutputGPUBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// UnlockBuffer</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">UnlockBuffer</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">OutputBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// FlushRenderingCommands, 确保上面的RenderCommand被执行了</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tFlushRenderingCommands</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\treturn</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 下面是使用FRHIGPUBufferReadback的调用方式, 效果是相同的</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//FRHIGPUBufferReadback ReadbackBuffer(TEXT(\"ExampleComputeShaderReadback\"));</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//FlushRenderingCommands();</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//ENQUEUE_RENDER_COMMAND(FEnqueueGPUReadback)([&#x26;ReadbackBuffer, Resource](FRHICommandListImmediate&#x26; RHICmdList)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//\tReadbackBuffer.EnqueueCopy(RHICmdList, Resource->OutputBuffer.Buffer, sizeof(int32));</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//&#125;);</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//FlushRenderingCommands();</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//float OutputVal;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//ENQUEUE_RENDER_COMMAND(FEnqueueGPUReadbackLock)([&#x26;ReadbackBuffer, Resource, &#x26;OutputVal](FRHICommandListImmediate&#x26; RHICmdList)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//\tfloat* pOutputVal = static_cast&#x3C;float*>(ReadbackBuffer.Lock(sizeof(float)));</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//\tcheckf(pOutputVal!=nullptr, TEXT(\"ReadbackBuffer failed to lock\"));</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//\tOutputVal = *pOutputVal;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//\tReadbackBuffer.Unlock();</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//&#125;);</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//FlushRenderingCommands();</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//return OutputVal;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span></code></pre>\n<h1 id=\"26-创建blueprint-function并调用\"><a class=\"anchor\" href=\"#26-创建blueprint-function并调用\">#</a> 2.6 创建Blueprint function并调用</h1>\n<p>这一步我们将创建一个Blueprint function，以在游戏内调用我们的compute shader。</p>\n<p>创建ShaderFunctionLibrary模块：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-c#\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ShaderFunctionLibrary.Build.cs</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">using</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UnrealBuildTool</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ShaderFunctionLibrary</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ModuleRules</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tpublic</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ShaderFunctionLibrary</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">ReadOnlyTargetRules</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> base</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPCHUsage</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> PCHUsageMode</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UseExplicitOrSharedPCHs</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPublicDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Core</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CoreUObject</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Engine</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">InputCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPrivateDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleComputeShader</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using Slate UI</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.AddRange(new string[] &#123; \"Slate\", \"SlateCore\" &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\t</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using online features</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.Add(\"OnlineSubsystem\");</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ShaderFunctionLibraryModule.h</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">pragma</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> once</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CoreMinimal.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Kismet/BlueprintFunctionLibrary.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleComputeShaderModule.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ShaderFunctionLibraryModule.generated.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FShaderFunctionLibraryModule</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> IModuleInterface</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    virtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> StartupModule</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // virtual void ShutdownModule() override;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">UCLASS</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">meta</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ScriptName</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ShaderFunctionLibrary</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> MinimalAPI</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UShaderFunctionLibrary</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UBlueprintFunctionLibrary</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tGENERATED_BODY</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tUFUNCTION</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">BlueprintCallable</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> meta</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">DisplayName</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Execute ExampleComputeShader</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Category</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">My Shader Functions</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SHADERFUNCTIONLIBRARY_API </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ExecuteExampleComputeShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">float</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> InputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> float</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\t\tfloat</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tDispatchExampleComputeShader_GameThread</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">InputVal</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Scale</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Translate</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\t\treturn</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> GetGPUReadback</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FExampleComputeShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> OutputVal</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ShaderFunctionLibraryModule.cpp</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ShaderFunctionLibraryModule.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_MODULE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FShaderFunctionLibraryModule</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ShaderFunctionLibrary</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FShaderFunctionLibraryModule</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">StartupModule</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>编译，运行项目，新建Blueprint Actor，打开Blueprint Editor，在<strong>Event Beginplay</strong>后连接我们的<code>Execute ExampleComputeShader</code>，同时输出结果。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-8.png\" alt=\"alt text\" /></p>\n<p>将这个Actor放置到场景中，启动游戏，发现打印结果。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-10.png\" alt=\"alt text\" /></p>\n<p>恭喜！你已经成功创建了一个Compute Shader，并且成功运行。</p>\n<h1 id=\"chapter-2-总结\"><a class=\"anchor\" href=\"#chapter-2-总结\">#</a> Chapter 2 - 总结</h1>\n<p>创建Compute Shader的步骤：</p>\n<ul>\n<li>编写usf文件（GPU/HLSL端）</li>\n<li>创建shader和所需资源</li>\n<li>创建blueprint函数接口，方便调用和调试</li>\n</ul>\n<p>重要概念：</p>\n<ul>\n<li>SRV和UAV</li>\n<li>GameThread和RenderThread</li>\n</ul>\n<h1 id=\"chapter-3-使用ue实现global-vsps\"><a class=\"anchor\" href=\"#chapter-3-使用ue实现global-vsps\">#</a> Chapter 3. 使用UE实现Global VS/PS</h1>\n<h1 id=\"31-编写usf文件\"><a class=\"anchor\" href=\"#31-编写usf文件\">#</a> 3.1 编写usf文件</h1>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleGrapihcsShader.usf</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/Engine/Public/Platform.ush</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// HLSL代码的文档见https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-reference</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 顶点着色器的输入</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">struct</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> VertexAttributes</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tfloat4 v_position : ATTRIBUTE0</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 顶点位置。</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t//通常情况下我们输入模型坐标系的顶点，经由view matrix和perspective projection matrix变换得到NDC。但为了演示方便起见我们直接输入NDC。</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tfloat4 v_color : ATTRIBUTE1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 顶点颜色，取值范围为0.0~1.0</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 顶点着色器的输出，同时也是pixel shader的interpolated输入</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">struct</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Varyings</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tfloat4 p_position : SV_POSITION</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 顶点着色器输出，需要在NDC(Normalized device coordinate)坐标空间下; 片元着色器(pixel shader)的坐标位置输入</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tfloat4 p_color : COLOR0</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 顶点着色器输出; 片元颜色输入</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> MainVS</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">in</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> VertexAttributes</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> vertex</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> out</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Varyings</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> v</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tv</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">p_position</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> vertex</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">v_position</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 此处由于输入的顶点坐标即是NDC，所以不作变换</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tv</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">p_color</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> vertex</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">v_color</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> MainPS</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">in</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Varyings</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> v</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> out</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> float4</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> f_color</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> : </span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">SV_Target0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tf_color </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> v</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">p_color</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 每个片元的颜色输出到render target</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<blockquote>\n<h2 id=\"重要概念hlsl语义semantics\"><a class=\"anchor\" href=\"#重要概念hlsl语义semantics\">#</a> 重要概念：HLSL语义(Semantics)</h2>\n<p>在定义每个函数的输入输出参数时（包括输入输出参数是结构体），我们需要定义每个参数的语义。特定的语义只能在特定的shader中使用，而且特定的shader必须定义特定的语义。比如vertex shader必须有out SV_POSITION.</p>\n<p>参考：<a href=\"https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics\">https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics</a></p>\n<p>参考：<a href=\"https://stackoverflow.com/questions/22064165/why-does-hlsl-have-semantics\">https://stackoverflow.com/questions/22064165/why-does-hlsl-have-semantics</a></p>\n</blockquote>\n<h1 id=\"32-创建global-shader\"><a class=\"anchor\" href=\"#32-创建global-shader\">#</a> 3.2 创建Global Shader</h1>\n<p>创建ExampleGraphicsShader模块</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-c#\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleGrpahicsShader.Build.cs</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">using</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UnrealBuildTool</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ExampleGraphicsShader</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ModuleRules</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tpublic</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ExampleGraphicsShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">ReadOnlyTargetRules</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> base</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPCHUsage</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> PCHUsageMode</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">UseExplicitOrSharedPCHs</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPublicDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Core</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CoreUObject</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Engine</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">InputCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tPrivateDependencyModuleNames</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">AddRange</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">new</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">RHI</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">RenderCore</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using Slate UI</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.AddRange(new string[] &#123; \"Slate\", \"SlateCore\" &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\t</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// Uncomment if you are using online features</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// PrivateDependencyModuleNames.Add(\"OnlineSubsystem\");</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t\t// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>定义Shader和ShaderResource</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleGraphicsShaderModule.h</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">pragma</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> once</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Modules/ModuleManager.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphicsShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> IModuleInterface</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    virtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> StartupModule</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // virtual void ShutdownModule() override;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 这个struct对应hlsl里面的VertexAttributes</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">EXAMPLEGRAPHICSSHADER_API </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">struct</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> VertexAttributes</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFVector4f Position</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // Normally we use homogeneous coordinate so we declared Vec4 but here for demonstration we only use first 2 components to store NDC</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFVector4f Color</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // RGBA</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 存VS和PS对应的渲染资源</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> EXAMPLEGRAPHICSSHADER_API</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FRenderResource</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // Singleton instance</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tvirtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> InitRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListBase</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tvirtual</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ReleaseRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> override</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFVertexDeclarationRHIRef VertexDeclarationRHI</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 定义vertex的数据是如何存储在buffer的。见InitRHI()</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFReadBuffer VertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // GPU只读不写，所以定义为ReadBuffer</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Get</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // Singleton instance</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">EXAMPLEGRAPHICSSHADER_API </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> RenderExampleGraphicsShader_GameThread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">UTextureRenderTarget2D</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> TextureRenderTarget2D</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Resource</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ExampleGraphicsShaderModule.cpp</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleGraphicsShaderModule.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ClearQuad.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">SelectionSet.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">#</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Engine/TextureRenderTarget2D.h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_MODULE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleGraphicsShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ExampleGraphicsShader</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderModule</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">StartupModule</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 在模块初始化后将项目目录的Shaders文件夹Mount到/MyGraphicsShader</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tAddShaderSourceDirectoryMapping</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/MyGraphicsShader</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FPaths</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ProjectDir</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> /</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Shaders</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphcisShaderVS</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FGlobalShader</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tDECLARE_EXPORTED_GLOBAL_SHADER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleGraphcisShaderVS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> EXAMPLEGRAPHICSSHADER_API</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> bool</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ShouldCache</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">EShaderPlatform</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Platform</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\t\treturn</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphcisShaderPS</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FGlobalShader</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tDECLARE_EXPORTED_GLOBAL_SHADER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleGraphcisShaderPS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> EXAMPLEGRAPHICSSHADER_API</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tstatic</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> bool</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ShouldCache</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">EShaderPlatform</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Platform</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\t\treturn</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_SHADER_TYPE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FExampleGraphcisShaderVS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/MyGraphicsShader/ExampleGraphicsShader.usf</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">MainVS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SF_Vertex</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">IMPLEMENT_SHADER_TYPE</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> FExampleGraphcisShaderPS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/MyGraphicsShader/ExampleGraphicsShader.usf</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">MainPS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SF_Pixel</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\">  FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GInstance </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> nullptr</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\tif</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GInstance</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">nullptr</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t\tGInstance </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> new</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderResource</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tENQUEUE_RENDER_COMMAND</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FInitExampleGraphicsShaderResource</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandList</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t\t</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\t\tGInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">InitResource</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t\t</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\treturn</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GInstance</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">InitRHI</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandListBase</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 我们先hard code顶点数据</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tTArray</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Vertices</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tVertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Add</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tVertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Add</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tVertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Add</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FVector4f</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 初始化buffer并拷贝</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tuint32 NumBytes </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Vertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Num</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFRHIResourceCreateInfo </span><span style=\"color:#59873A;--shiki-dark:#80A665\">CreateInfo</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">VertexBuffer</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tVertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">CreateVertexBuffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">NumBytes</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> BUF_Static</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> CreateInfo</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tVertexAttributes</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GPUBufferPtr </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> static_cast</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">LockBuffer</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Vertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Num</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> RLM_WriteOnly</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tFMemory</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Memcpy</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GPUBufferPtr</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Vertices</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetData</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> NumBytes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">UnlockBuffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 到此为止，我们的buffer存储了3个vertices，每个vertex有4个float作为position和4个float作为color。所以一个vertex是4*sizeof(float) + 4*sizeof(float)==32字节。当然3个vertices总共96个字节。</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 下面我们定义vertex buffer的数据排布。</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 定义VertexDeclaration</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tuint16 Stride </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> sizeof</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFVertexDeclarationElementList Elements</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tElements</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Add</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FVertexElement</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> STRUCT_OFFSET</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Position</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VET_Float4</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Stride</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tElements</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Add</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">FVertexElement</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> STRUCT_OFFSET</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">VertexAttributes</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Color</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> VET_Float4</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Stride</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tVertexDeclarationRHI </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> PipelineStateCache</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetOrCreateVertexDeclaration</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Elements</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 根据vertex的定义，前四个float是position，并且我们在hlsl将其定义为ATTRIBUTE0。所以它的InOffset应该是0（因为是结构体的第一个成员）；stride应该是sizeof(VertexAttributes)因为当前指针到下一个vertex指针的偏移量是sizeof(VertexAttributes)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// Color同理，但它的InOffset是Position的大小，即4*sizeof(float)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 如果读者熟悉opengl API，FVertexElement与glVertexAttribPointer相似</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\t</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ReleaseRHI</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">\tif</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\t\tVertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Release</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tVertexDeclarationRHI</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">SafeRelease</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> RenderExampleGraphicsShader_RenderThread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandList</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FRHITexture</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RenderTarget</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 调用shader进行渲染</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 与compute shader不同，graphics shader需要我们定义：1）一个或多个Render Target；2）如何处理Rasterizer、Blend、Depth和Stencil的行为</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 所以需要给到的初始化参数比compute shader多</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 一个很好的例子是DrawClearQuad函数，里面详细写了从RHICmdList.BeginRenderPass到RHICmdList.EndRenderPass的所有步骤。如果你的shader无法工作，请使用DrawClearQuad函数进行测试。</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFRHIRenderPassInfo </span><span style=\"color:#59873A;--shiki-dark:#80A665\">RPInfo</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RenderTarget</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ERenderTargetActions</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Clear_Store</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">BeginRenderPass</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RPInfo</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TEXT</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ExampleGraphicsShaderRenderPass</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 如果需要测试，可以在这里调用DrawClearQuad(RHICmdList, true, FLinearColor(FVector4(1, 0, 1, 1)), true, 1.0, true, 0);</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">\t// 同时注释其他代码。</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">\tauto</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ShaderMap </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> GetGlobalShaderMap</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GMaxRHIFeatureLevel</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tTShaderMapRef</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleGraphcisShaderVS</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\"> VertexShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ShaderMap</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tTShaderMapRef</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FExampleGraphcisShaderPS</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\"> PixelShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ShaderMap</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\tFGraphicsPipelineStateInitializer GraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ApplyCachedRenderTargets</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">GraphicsPSOInit</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">RasterizerState</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TStaticRasterizerState</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">BlendState</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TStaticBlendState</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">DepthStencilState</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> TStaticDepthStencilState</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> CF_Always</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetRHI</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">PrimitiveType</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> PT_TriangleStrip</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">BoundShaderState</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexShaderRHI</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> VertexShader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetVertexShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">BoundShaderState</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">PixelShaderRHI</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> PixelShader</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetPixelShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tGraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">BoundShaderState</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexDeclarationRHI</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexDeclarationRHI</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tSetGraphicsPipelineState</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> GraphicsPSOInit</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">SetStreamSource</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">VertexBuffer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Buffer</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">DrawPrimitive</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">\tRHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">EndRenderPass</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> RenderExampleGraphicsShader_GameThread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">UTextureRenderTarget2D</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> TextureRenderTarget2D</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FExampleGraphicsShaderResource</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> Resource</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tENQUEUE_RENDER_COMMAND</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">FRenderExampleGraphicsShader</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> TextureRenderTarget2D</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\">FRHICommandList</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> RHICmdList</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\t\tRenderExampleGraphicsShader_RenderThread</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RHICmdList</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Resource</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> TextureRenderTarget2D</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetResource</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">-</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">GetTexture2DRHI</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">\t</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<h1 id=\"33-创建蓝图函数和rendertarget\"><a class=\"anchor\" href=\"#33-创建蓝图函数和rendertarget\">#</a> 3.3 创建蓝图函数和Rendertarget</h1>\n<p>添加蓝图函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-cpp\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// ShaderFunctionLibraryModule.h</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">UFUNCTION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">BlueprintCallable</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> meta</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">DisplayName</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Render ExampleGraphicsShader</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Category</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">My Shader Functions</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">static</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SHADERFUNCTIONLIBRARY_API </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">void</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> RenderExampleGraphicsShader</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">UTextureRenderTarget2D</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> RenderTarget</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tFExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">\tRenderExampleGraphicsShader_GameThread</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RenderTarget</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FExampleGraphicsShaderResource</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Get</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>编译，启动Editor</p>\n<p>Content Browser创建：1. Blueprint Actor 2. Material 3. TextureRenderTarget2D<br />\nBlueprint Actor在Event BeginPlay链接Render ExampleGraphicsShader, Variables创建Texture Render Target 2D的Object Reference，并设置成public，将这个变量拖入，与Render ExampleGraphicsShader函数输入链接</p>\n<p><img loading=\"lazy\" src=\"/assets/image-12.png\" alt=\"alt text\" /></p>\n<p>打开材质，拖入刚创建的TextureRenderTarget2D，将RGB连至Base Color</p>\n<p><img loading=\"lazy\" src=\"/assets/image-13.png\" alt=\"alt text\" /></p>\n<p>场景中放入刚创建的blueprint actor和一个static mesh cube，将blueprint actor的rendertarget设置成刚创建的。将static mesh cube材质设置成刚创建的。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-14.png\" alt=\"alt text\" /></p>\n<p><img loading=\"lazy\" src=\"/assets/image-15.png\" alt=\"alt text\" /></p>\n<p>点击运行，你的cube应该如下图所示。</p>\n<p><img loading=\"lazy\" src=\"/assets/image-16.png\" alt=\"alt text\" /></p>\n<h1 id=\"faq\"><a class=\"anchor\" href=\"#faq\">#</a> FAQ</h1>\n<h2 id=\"使用什么configuration编译引擎\"><a class=\"anchor\" href=\"#使用什么configuration编译引擎\">#</a> 使用什么Configuration编译引擎？</h2>\n<p>默认的Development Editor即可</p>\n<h2 id=\"参考材料\"><a class=\"anchor\" href=\"#参考材料\">#</a> 参考材料</h2>\n<ol>\n<li><a href=\"https://dev.epicgames.com/documentation/en-us/unreal-engine/creating-a-new-global-shader-as-a-plugin-in-unreal-engine\">https://dev.epicgames.com/documentation/en-us/unreal-engine/creating-a-new-global-shader-as-a-plugin-in-unreal-engine</a></li>\n<li><a href=\"http://www.valentinkraft.de/compute-shader-in-unreal-tutorial/\">http://www.valentinkraft.de/compute-shader-in-unreal-tutorial/</a></li>\n</ol>\n",
            "tags": [
                "Tutorial",
                "Unreal Engine"
            ]
        },
        {
            "id": "https://sirenri2001.github.io/2024/03/20/2024-03-21-overview-of-fluid-simulation.md/",
            "url": "https://sirenri2001.github.io/2024/03/20/2024-03-21-overview-of-fluid-simulation.md/",
            "title": "Fluid Simulation - Concept and Practice",
            "date_published": "2024-03-20T16:00:00.000Z",
            "content_html": "<h1 id=\"taichi-implementation-for-fluid-simulation\"><a class=\"anchor\" href=\"#taichi-implementation-for-fluid-simulation\">#</a> Taichi implementation for Fluid Simulation</h1>\n<h2 id=\"algorithm-overview\"><a class=\"anchor\" href=\"#algorithm-overview\">#</a> Algorithm Overview</h2>\n<ol>\n<li>Initialize Grid with some Fluid</li>\n<li>for ( i from 1 to n )</li>\n<li>Let <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>t</mi><mo>=</mo><mn>0.0</mn></mrow><annotation encoding=\"application/x-tex\">t = 0.0</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6151em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6444em;\"></span><span class=\"mord\">0.0</span></span></span></span></li>\n</ol>\n<ul>\n<li>While <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>t</mi><mo>&lt;</mo><msub><mi>t</mi><mrow><mi>f</mi><mi>r</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow></msub></mrow><annotation encoding=\"application/x-tex\">t&lt;t_{frame}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6542em;vertical-align:-0.0391em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">&lt;</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.9012em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">t</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3361em;\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.10764em;\">f</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathnormal mtight\">am</span><span class=\"mord mathnormal mtight\">e</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span></span></span></span></li>\n<li>\n<ul>\n<li>Calculate <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi mathvariant=\"normal\">Δ</mi><mi>t</mi></mrow><annotation encoding=\"application/x-tex\">\\Delta t</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span></span></span></span></li>\n</ul>\n</li>\n<li>\n<ul>\n<li>Advect Fluid</li>\n</ul>\n</li>\n<li>\n<ul>\n<li>Pressure Projection (Pressure Solve)</li>\n</ul>\n</li>\n<li>\n<ul>\n<li>Advect Free Surface</li>\n</ul>\n</li>\n<li>\n<ul>\n<li><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>t</mi><mo>=</mo><mi>t</mi><mo>+</mo><mi mathvariant=\"normal\">Δ</mi><mi>t</mi></mrow><annotation encoding=\"application/x-tex\">t = t + \\Delta t</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6151em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6984em;vertical-align:-0.0833em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span></span></span></span></li>\n</ul>\n</li>\n<li>Write frame i</li>\n</ul>\n<hr />\n<h2 id=\"1-linear-interpolation-and-bilinear-interpolation\"><a class=\"anchor\" href=\"#1-linear-interpolation-and-bilinear-interpolation\">#</a> 1. Linear Interpolation and Bilinear Interpolation</h2>\n<hr />\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">#####################</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">#   Bilinear Interpolation function</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">#####################</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">func</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> sample</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> u</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> v</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> int</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">u</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> int</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">v</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # Nearest</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    i </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">min</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">shape</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> -</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> i</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    j </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">min</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">shape</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> -</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vf</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">func</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> lerp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vl</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vr</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> frac</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # frac: [0.0, 1.0]</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> -</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> frac</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vl </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> frac </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vr</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">func</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> bilerp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> u</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> v</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # use -0.5 to decide where bilerp performs in cells</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    s</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> u </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> v </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    iu</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> int</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">s</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> int</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    a </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sample</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iu </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    b </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sample</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iu </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    c </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sample</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iu </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    d </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sample</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iu </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> shape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # fract</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    fu</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> fv </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> s </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iu</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> iv</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lerp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">lerp</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> b</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> fu</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lerp</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">c</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> d</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> fu</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> fv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<hr />\n<h2 id=\"2-advection\"><a class=\"anchor\" href=\"#2-advection\">#</a> 2. Advection</h2>\n<hr />\n<p>Advection can be informally described as follows: &quot;Given some quantity <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>Q</mi></mrow><annotation encoding=\"application/x-tex\">Q</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">Q</span></span></span></span> on our simulation grid, how will <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>Q</mi></mrow><annotation encoding=\"application/x-tex\">Q</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">Q</span></span></span></span> change <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi mathvariant=\"normal\">Δ</mi><mi>t</mi></mrow><annotation encoding=\"application/x-tex\">\\Delta t</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span></span></span></span> later?&quot;</p>\n<p>Therefore, we have:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mtext>advect</mtext><mo stretchy=\"false\">(</mo><msup><mi>Q</mi><mi>n</mi></msup><mo separator=\"true\">,</mo><mi mathvariant=\"normal\">Δ</mi><mi>t</mi><mo separator=\"true\">,</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><msup><mi>Q</mi><mi>n</mi></msup></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">Q^{n+1}=\\text{advect}(Q^n,\\Delta t, \\frac{\\partial Q^n}{\\partial t})\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.0585em;vertical-align:-0.1944em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">Q</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em;\"><span style=\"top:-3.113em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mbin mtight\">+</span><span class=\"mord mtight\">1</span></span></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.0574em;vertical-align:-0.686em;\"></span><span class=\"mord text\"><span class=\"mord\">advect</span></span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord mathnormal\">Q</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7144em;\"><span style=\"top:-3.113em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span></span></span></span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord\"><span class=\"mord mathnormal\">Q</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.6644em;\"><span style=\"top:-3.063em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mclose\">)</span></span></span></span></span></p>\n<h3 id=\"forward-euler\"><a class=\"anchor\" href=\"#forward-euler\">#</a> Forward Euler</h3>\n<p>In the code below, <em>Forward Euler</em> time integrator is used, which consists of three steps:</p>\n<ol>\n<li>Calculate <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mo>−</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">-\\frac{\\partial Q}{\\partial t}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2772em;vertical-align:-0.345em;\"></span><span class=\"mord\">−</span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span></li>\n<li>Sample position <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mover accent=\"true\"><mi>X</mi><mo>⃗</mo></mover><mo>=</mo><mi>Q</mi><mo stretchy=\"false\">(</mo><mi>i</mi><mo separator=\"true\">,</mo><mi>j</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">\\vec{X} = Q(i, j)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.9663em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9663em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.07847em;\">X</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.1522em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\">Q</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">i</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.05724em;\">j</span><span class=\"mclose\">)</span></span></span></span></li>\n<li>Calculate <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mover accent=\"true\"><mi>X</mi><mo>⃗</mo></mover><mrow><mi>p</mi><mi>r</mi><mi>e</mi><mi>v</mi></mrow></msub><mo>=</mo><mover accent=\"true\"><mi>X</mi><mo>⃗</mo></mover><mo>−</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>∗</mo><mi mathvariant=\"normal\">Δ</mi><mi>t</mi></mrow><annotation encoding=\"application/x-tex\">\\vec{X}_{prev} = \\vec{X} - \\frac{\\partial Q}{\\partial t}*\\Delta t</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2524em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9663em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.07847em;\">X</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.1522em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em;\"><span style=\"top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">p</span><span class=\"mord mathnormal mtight\">re</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em;\">v</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.0497em;vertical-align:-0.0833em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9663em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.07847em;\">X</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.1522em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.2772em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">∗</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span></span></span></span></li>\n<li>Set the gridpoint for <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo stretchy=\"false\">(</mo><mi>i</mi><mo separator=\"true\">,</mo><mi>j</mi><mo stretchy=\"false\">)</mo><mo>:</mo><mo>=</mo><mi>Q</mi><mo stretchy=\"false\">(</mo><mi>i</mi><mo separator=\"true\">,</mo><mi>j</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">Q^{n+1}(i,j):=Q(i,j)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.0641em;vertical-align:-0.25em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">Q</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141em;\"><span style=\"top:-3.063em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mbin mtight\">+</span><span class=\"mord mtight\">1</span></span></span></span></span></span></span></span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">i</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.05724em;\">j</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">:=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\">Q</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">i</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.05724em;\">j</span><span class=\"mclose\">)</span></span></span></span> that is nearest to <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mover accent=\"true\"><mi>X</mi><mo>⃗</mo></mover><mrow><mi>p</mi><mi>r</mi><mi>e</mi><mi>v</mi></mrow></msub></mrow><annotation encoding=\"application/x-tex\">\\vec{X}_{prev}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2524em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9663em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.07847em;\">X</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.1522em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em;\"><span style=\"top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">p</span><span class=\"mord mathnormal mtight\">re</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em;\">v</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span></span></span></span></li>\n</ol>\n<p>We can consider using more accurate time integrator, such as RK-2 or implicit euler.</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">kernel</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> advection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">vf</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> qf</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> new_qf</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vf</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        coord_cur </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Vector</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> +</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ti</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Vector</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0.5</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        vel_cur </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vf</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        coord_prev </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> coord_cur </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> vel_cur </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> eulerSimParam</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">dt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        q_prev </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> bilerp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">qf</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> coord_prev</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> coord_prev</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">eulerSimParam</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">shape</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        new_qf</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> q_prev</span></span></code></pre>\n<hr />\n<h2 id=\"3-lagrangian-vs-eulerian\"><a class=\"anchor\" href=\"#3-lagrangian-vs-eulerian\">#</a> 3. <strong>Lagrangian</strong> v.s. <strong>Eulerian</strong></h2>\n<hr />\n<p>[&lt;a href=&quot;<a href=\"https://www.youtube.com/watch?v=0Vp0wU7czBM\">https://www.youtube.com/watch?v=0Vp0wU7czBM</a>&quot;&gt;reference&lt;/a&gt;]</p>\n<p>By default, <strong>Navier-Stokes</strong> equation is defined in <strong>Lagrangian</strong> viewpoint, which is based on particle movements:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mfrac><mrow><mi>d</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mover accent=\"true\"><mi>g</mi><mo>⃗</mo></mover><mo>−</mo><mfrac><mn>1</mn><mi>ρ</mi></mfrac><mi mathvariant=\"normal\">∇</mi><mi>p</mi><mo>+</mo><mi>ν</mi><mi mathvariant=\"normal\">∇</mi><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\frac{d\\vec{u}}{dt}=\\vec{g}-\\frac{1}{\\rho}\\nabla p+\\nu\\nabla\\cdot\\nabla\\vec{u}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">d</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.9084em;vertical-align:-0.1944em;\"></span><span class=\"mord accent\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">g</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1944em;\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.2019em;vertical-align:-0.8804em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3214em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">ρ</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8804em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">p</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.06366em;\">ν</span><span class=\"mord\">∇</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord\">∇</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span></p>\n<p>For each particle <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>p</mi><mo>=</mo><mi>p</mi><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">p=p(x,y,z,t)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.625em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">p</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\">p</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span>, it has velocity <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>u</mi><mo>=</mo><mi>u</mi><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">u=u(x,y,z,t)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em;\"></span><span class=\"mord mathnormal\">u</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\">u</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span> and acceleration</p>\n<p><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mi>a</mi><mtext>particle</mtext></msub><mo>=</mo><mfrac><mrow><mi>d</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><msub><mi>a</mi><mtext>particle</mtext></msub><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">a_{\\text{particle}}=\\frac{d\\vec{u}}{dt}=a_{\\text{particle}}(x,y,z,t)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.7167em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3361em;\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord text mtight\"><span class=\"mord mtight\">particle</span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.2388em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8938em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">d</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.394em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">d</span><span class=\"mord accent mtight\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"mord mathnormal mtight\">u</span></span><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay mtight\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.0361em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3361em;\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord text mtight\"><span class=\"mord mtight\">particle</span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span></p>\n<p>For <strong>Eulerian</strong> viewpoint, the volume domain is fixed, which means point of reference is stationary:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mover accent=\"true\"><mi>a</mi><mo>⃗</mo></mover><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo><mo>=</mo><msub><mover accent=\"true\"><mi>a</mi><mo>⃗</mo></mover><mtext>particle</mtext></msub><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">\\vec{a}(x,y,z,t)=\\vec{a}_{\\text{particle}}(x,y,z,t)\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">a</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2355em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.0361em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">a</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2355em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3361em;\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord text mtight\"><span class=\"mord mtight\">particle</span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span></span></p>\n<p>This equation says the acceleration field at this location and time(<strong>Eulerian</strong> viewpoint) equals to the acceleration of the fluid particle occupying this location at this time(<strong>Lagrangian</strong> viewpoint).</p>\n<p>Therefore, the acceleration at a field variable (<strong>Eulerian</strong> description) can be calculated as:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mover accent=\"true\"><mi>a</mi><mo>⃗</mo></mover><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo><mo>=</mo><mfrac><mrow><mi>d</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>x</mi></mrow></mfrac><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>x</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>y</mi></mrow></mfrac><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>y</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>z</mi></mrow></mfrac><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>z</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">\\vec{a}(x,y,z,t)=\\frac{d\\vec{u}}{dt}=\\frac{\\partial\\vec{u}}{\\partial t}+\\frac{\\partial\\vec{u}}{\\partial x}\\frac{\\partial x}{\\partial t}+\\frac{\\partial\\vec{u}}{\\partial y}\\frac{\\partial y}{\\partial t}+\\frac{\\partial\\vec{u}}{\\partial z}\\frac{\\partial z}{\\partial t}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">a</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2355em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">d</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">x</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">x</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.2714em;vertical-align:-0.8804em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8804em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span></span></p>\n<p>which can be simplified as</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mover accent=\"true\"><mi>a</mi><mo>⃗</mo></mover><mo>=</mo><mfrac><mrow><mi>D</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>D</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mo stretchy=\"false\">(</mo><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover><mo>⋅</mo><mover accent=\"true\"><mi mathvariant=\"normal\">∇</mi><mo>⃗</mo></mover><mo stretchy=\"false\">)</mo><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\vec{a}=\\frac{D\\vec{u}}{Dt}=\\frac{\\partial\\vec{u}}{\\partial t}+(\\vec{u}\\cdot\\vec{\\nabla})\\vec{u}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">a</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2355em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mopen\">(</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.2163em;vertical-align:-0.25em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9663em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\">∇</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2355em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mclose\">)</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span></p>\n<h3 id=\"material-derivative\"><a class=\"anchor\" href=\"#material-derivative\">#</a> Material Derivative</h3>\n<p>Material derivative <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mfrac><mrow><mi>D</mi><mi>Q</mi></mrow><mrow><mi>D</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">\\frac{DQ}{Dt}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2694em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9244em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span> is a general form of the acceleration of Eulerian description:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mfrac><mrow><mi>D</mi><mi>Q</mi></mrow><mrow><mi>D</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mi>Q</mi></mrow><annotation encoding=\"application/x-tex\">\\frac{DQ}{Dt}=\\frac{\\partial Q}{\\partial t}+\\vec{u}\\cdot\\nabla Q\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.0463em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3603em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal\">Q</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.0574em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">Q</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">Q</span></span></span></span></span></p>\n<p>For this equation, we have <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>Q</mi><mo>=</mo><mi>Q</mi><mo stretchy=\"false\">(</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo separator=\"true\">,</mo><mi>z</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">Q = Q(x,y,z,t)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">Q</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\">Q</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">y</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.04398em;\">z</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span>, the quantity at a blob of fluid moving with <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\vec{u}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span>, and <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi mathvariant=\"normal\">∇</mi><mi>Q</mi><mo>=</mo><mrow><mo fence=\"true\">[</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>x</mi></mrow></mfrac><mo separator=\"true\">,</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>y</mi></mrow></mfrac><mo separator=\"true\">,</mo><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>z</mi></mrow></mfrac><mo fence=\"true\">]</mo></mrow></mrow><annotation encoding=\"application/x-tex\">\\nabla Q= \\left[\\frac{\\partial Q}{\\partial x},\\frac{\\partial Q}{\\partial y},\\frac{\\partial Q}{\\partial z}\\right]</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">Q</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.8em;vertical-align:-0.65em;\"></span><span class=\"minner\"><span class=\"mopen delimcenter\" style=\"top:0em;\"><span class=\"delimsizing size2\">[</span></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">x</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.03588em;\">y</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.4811em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.04398em;\">z</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mclose delimcenter\" style=\"top:0em;\"><span class=\"delimsizing size2\">]</span></span></span></span></span></span>. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mi>Q</mi></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">\\frac{\\partial Q}{\\partial t}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2772em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9322em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.4461em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">Q</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span> is the local change due to unsteadiness(related with changes in time). <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mi>Q</mi></mrow><annotation encoding=\"application/x-tex\">\\vec{u}\\cdot\\nabla Q</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.8778em;vertical-align:-0.1944em;\"></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">Q</span></span></span></span> is the change due to movement to a different part of the flow(related with changes in position). This means we can have acceleration in a steady flow.</p>\n<p>Therefore, for Navier Stokes equation</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mfrac><mrow><mi>D</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>D</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mover accent=\"true\"><mi>g</mi><mo>⃗</mo></mover><mo>−</mo><mfrac><mn>1</mn><mi>ρ</mi></mfrac><mi mathvariant=\"normal\">∇</mi><mi>p</mi><mo>+</mo><mi>ν</mi><mi mathvariant=\"normal\">∇</mi><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\frac{D\\vec{u}}{Dt}=\\vec{g}-\\frac{1}{\\rho}\\nabla p+\\nu\\nabla\\cdot\\nabla\\vec{u}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.9084em;vertical-align:-0.1944em;\"></span><span class=\"mord accent\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">g</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1944em;\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.2019em;vertical-align:-0.8804em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3214em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">ρ</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8804em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">p</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.06366em;\">ν</span><span class=\"mord\">∇</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord\">∇</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span></p>\n<p>yields the standard form of the momentum equation:</p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mo>−</mo><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover><mo>+</mo><mover accent=\"true\"><mi>g</mi><mo>⃗</mo></mover><mo>−</mo><mfrac><mn>1</mn><mi>ρ</mi></mfrac><mi mathvariant=\"normal\">∇</mi><mi>p</mi><mo>+</mo><mi>ν</mi><mi mathvariant=\"normal\">∇</mi><mo>⋅</mo><mi mathvariant=\"normal\">∇</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\frac{\\partial\\vec{u}}{\\partial t}=-\\vec{u}\\cdot\\nabla\\vec{u}+\\vec{g}-\\frac{1}{\\rho}\\nabla p+\\nu\\nabla\\cdot\\nabla\\vec{u}\n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.077em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.391em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.7973em;vertical-align:-0.0833em;\"></span><span class=\"mord\">−</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.7973em;vertical-align:-0.0833em;\"></span><span class=\"mord\">∇</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.9084em;vertical-align:-0.1944em;\"></span><span class=\"mord accent\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">g</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1944em;\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.2019em;vertical-align:-0.8804em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3214em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">ρ</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8804em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\">∇</span><span class=\"mord mathnormal\">p</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.06366em;\">ν</span><span class=\"mord\">∇</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">⋅</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord\">∇</span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> advection_step</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    advection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cur</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> color_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cur</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> color_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">nxt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    advection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cur</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cur</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">nxt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    color_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">swap</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">swap</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    apply_vel_bc</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">velocities_pair</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cur</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n",
            "tags": [
                "Fluid Simulation",
                "Tutorial"
            ]
        },
        {
            "id": "https://sirenri2001.github.io/2024/02/03/2024-02-04-fluid-simulation/",
            "url": "https://sirenri2001.github.io/2024/02/03/2024-02-04-fluid-simulation/",
            "title": "Fluid Simulation Overview - Paper Evaluation &#x23;1",
            "date_published": "2024-02-03T16:00:00.000Z",
            "content_html": "<h1 id=\"fluid-simulation-for-computer-graphics-a-tutorial-in-grid-based-and-particle-based-methods\"><a class=\"anchor\" href=\"#fluid-simulation-for-computer-graphics-a-tutorial-in-grid-based-and-particle-based-methods\">#</a> Fluid Simulation For Computer Graphics: A Tutorial in Grid Based and Particle Based Methods</h1>\n<p><em>Colin Braley &amp; Adrian Sandu - Virginia Tech</em></p>\n<h1 id=\"main-contribution\"><a class=\"anchor\" href=\"#main-contribution\">#</a> Main contribution</h1>\n<p>This paper provide a introductory tutorial for people learning fluid simulation at a undergraduate level. It gives out a Navier-Stokes equation and 2 major methods, grid based and particle based, for calculating the equation.</p>\n<h1 id=\"outline-of-the-major-topics\"><a class=\"anchor\" href=\"#outline-of-the-major-topics\">#</a> Outline of the major topics</h1>\n<p>Part 1 Navier-Stokes Equation</p>\n<p>Part 2 Grid Based Simulation</p>\n<ol>\n<li>\n<p>Data Structures that defines each grid (MAC cell)</p>\n<p>Marker-and-Cell Grid technique stores different quantities (pressure &amp; velocity of the fluid) in different locations.The advantage of MAC is it has <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>O</mi><mo stretchy=\"false\">(</mo><mi mathvariant=\"normal\">Δ</mi><msup><mi>x</mi><mn>2</mn></msup><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">O(\\Delta x^2)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.0641em;vertical-align:-0.25em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">O</span><span class=\"mopen\">(</span><span class=\"mord\">Δ</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141em;\"><span style=\"top:-3.063em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span></span></span></span></span><span class=\"mclose\">)</span></span></span></span> accuracy whilst consider the actual velocity value <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>u</mi></mrow><annotation encoding=\"application/x-tex\">u</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em;\"></span><span class=\"mord mathnormal\">u</span></span></span></span> at the center of each cell.</p>\n</li>\n<li>\n<p>Timestep selection (CFL condition)</p>\n<p>CFL condition says, by each <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi mathvariant=\"normal\">Δ</mi><mi>t</mi></mrow><annotation encoding=\"application/x-tex\">\\Delta t</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">t</span></span></span></span> iteration, any quantity will only move <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi mathvariant=\"normal\">Δ</mi><mi>h</mi></mrow><annotation encoding=\"application/x-tex\">\\Delta h</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6944em;\"></span><span class=\"mord\">Δ</span><span class=\"mord mathnormal\">h</span></span></span></span> distance (the length of each cell). However, in real implementations, we don't need to satisfy strictly of this condition since it'll be to slow for calculation. We usually use alternated form of CFL condition to speed up the simulation process.</p>\n</li>\n<li>\n<p>Advection (RK2 or Forward Euler)</p>\n<p>We use the integrator to update each quantity according its neighbors.</p>\n</li>\n<li>\n<p>Pressure Solve (Solving linear equations that defines on Laplacian matrix of the cells)</p>\n<p>We need to satisfy both the incompressibility condition (the divergence of each cell equals 0) and boundary conditions (the surface normal velocity of the fluid equals the surface of solid it contacted).</p>\n<p>Therefore, we can defina a Laplacian matrix that track the connectivity of cells. We can also get the divergence of each cell by calculating the fluid velocity of its neighbors. By solving the linear equation, we get the pressure at every cell.</p>\n</li>\n</ol>\n<h1 id=\"one-thing-interesting-about-the-paper\"><a class=\"anchor\" href=\"#one-thing-interesting-about-the-paper\">#</a> One thing interesting about the paper</h1>\n<p>This paper introduce a different set of methods of CFL to speed up the simulation. By using optimized method of CFL, the advection process will be faster and more robust.</p>\n<h1 id=\"one-thing-i-dont-like-about-the-paper\"><a class=\"anchor\" href=\"#one-thing-i-dont-like-about-the-paper\">#</a> One thing I don't like about the paper</h1>\n<p>The author did not explain well the differences of Navier-Stokes equation in Euler and Lagrangian representation. For example, the left-hand side of the equation</p>\n<p><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mfrac><mrow><mi mathvariant=\"normal\">∂</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mo>+</mo><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><annotation encoding=\"application/x-tex\">\\frac{\\partial \\vec{u}}{\\partial t} + \\vec{u}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2388em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8938em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.394em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\" style=\"margin-right:0.05556em;\">∂</span><span class=\"mord accent mtight\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"mord mathnormal mtight\">u</span></span><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay mtight\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.714em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\">u</span></span><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></p>\n<p>is a Lagrangian representation, while we have</p>\n<p><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mfrac><mrow><mi>D</mi><mover accent=\"true\"><mi>u</mi><mo>⃗</mo></mover></mrow><mrow><mi>D</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">\\frac{D \\vec{u}}{D t}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.2388em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8938em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord mathnormal mtight\">t</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.394em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.02778em;\">D</span><span class=\"mord accent mtight\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.714em;\"><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"mord mathnormal mtight\">u</span></span><span style=\"top:-2.714em;\"><span class=\"pstrut\" style=\"height:2.714em;\"></span><span class=\"accent-body\" style=\"left:-0.2077em;\"><span class=\"overlay mtight\" style=\"height:0.714em;width:0.471em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0.471em\" height=\"0.714em\" style=\"width:0.471em\" viewBox=\"0 0 471 714\" preserveAspectRatio=\"xMinYMin\"><path d=\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\"/></svg></span></span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span></p>\n<p>in Euler representation. There are different math background of the two.</p>\n",
            "tags": [
                "Papers",
                "Fluid Simulation"
            ]
        },
        {
            "id": "https://sirenri2001.github.io/2023/12/08/2023-12-09-english-learning-notes/",
            "url": "https://sirenri2001.github.io/2023/12/08/2023-12-09-english-learning-notes/",
            "title": "English Learning Notes - Chinese Ver.",
            "date_published": "2023-12-08T16:00:00.000Z",
            "content_html": "<h1 id=\"1-单词记忆方法\"><a class=\"anchor\" href=\"#1-单词记忆方法\">#</a> 1. 单词（记忆方法）</h1>\n<h2 id=\"11-记忆锚点\"><a class=\"anchor\" href=\"#11-记忆锚点\">#</a> 1.1 记忆锚点</h2>\n<p>单词的记忆实质是一个建立单词字母&amp;发音与释义&amp;语境的一一对应过程。当我们看到单词、听到单词的时候，字母的拼写、发音（本文称之为<strong>源信息</strong>）本身是对记忆人的一个谜题，而单词的释义就是答案（本文称之为<strong>目标信息</strong>）。记忆锚点是指通过源信息获得一些关键的<strong>中间信息</strong>，使用中间信息可以使目标信息的得出更加容易，这类似于HashMap数据结构。</p>\n<p>实际上，记忆锚点的应用十分广泛：市场上出现的有故事法、记忆桩法等。作者使用的记忆锚点方式是：</p>\n<ul>\n<li>词根词缀法</li>\n<li>谐音法</li>\n<li>例句填空法</li>\n</ul>\n<p>而在记忆单词的过程中，作者把源信息定义为<strong>单词的字母拼写</strong>，而目标信息定义为单词的</p>\n<ul>\n<li>主要的汉语释义</li>\n<li>褒贬义</li>\n</ul>\n<p>即，如上方法可概括为：</p>\n<p>使用词根词缀法、谐音法，记忆单词的主要的汉语释义以及单词褒贬色彩。</p>\n<h2 id=\"12-词根词缀记忆法\"><a class=\"anchor\" href=\"#12-词根词缀记忆法\">#</a> 1.2 词根词缀记忆法</h2>\n<p>根据英语语言学，英语词汇的主要语源为：日耳曼语源（本族语源）、拉丁语源、希腊语源等。熟悉词根的语源有助于理解单词本身适用语境，以及大幅扩充词汇量。</p>\n<h3 id=\"推荐学习资源\"><a class=\"anchor\" href=\"#推荐学习资源\">#</a> 推荐学习资源</h3>\n<ul>\n<li>李平武《说文解字》词根+词缀两本书</li>\n<li>刘毅《英文字根字典》</li>\n<li><a href=\"http://dictionary.com\">dictionary.com</a> 查询IPA音标和词源信息</li>\n<li><a href=\"http://www.merriam-webster.com/\">merriam-webster.com</a> 查询详细释义和词源信息（此词典网站十分详细，GRE常考释义出处）</li>\n</ul>\n<p>有关词根词缀的具体内容在李平武书中有详细的阐述，本文恕不赘述。</p>\n<h3 id=\"实践方法\"><a class=\"anchor\" href=\"#实践方法\">#</a> 实践方法</h3>\n<p>请读者谨记以下原则：</p>\n<p><strong>不单独背词根，而是背整个单词</strong></p>\n<h3 id=\"实践情况1\"><a class=\"anchor\" href=\"#实践情况1\">#</a> 实践情况1</h3>\n<p>读者看到单词<strong>anthropogenic</strong>，（Bing词典）adj.人为的；人类起源的；人类发生的；人类的</p>\n<p>读者查询词根词缀词典，进行词根分析：anthrop(人类的)+o+gen（产生）+ic</p>\n<p>个别读者就在这一步开始死记硬背：</p>\n<p>anthrop，anthrop，人类的</p>\n<p>gen，gen，产生</p>\n<p>而这是<strong>错误的</strong>做法。</p>\n<p>正确做法应为：</p>\n<p>翻开词根词缀书，找到anthrop这个词根，找到熟悉的单词anthropology（n. 人类学），得知anthrop词根义为人类。找到gen这个词根，找到熟悉的单词generate（v. 产生）。这时将anthrop+gen写在单词表anthropogenic的旁边，作为记忆锚点提示记忆。</p>\n<h3 id=\"实践情况2\"><a class=\"anchor\" href=\"#实践情况2\">#</a> 实践情况2</h3>\n<p>读者看到单词<strong>patriarch</strong>，n.族长；德高望重的男性长者；宗主教</p>\n<p>分析词根：patri（父）+arch（统治者）</p>\n<p>读者翻看词根词缀词典，无法找到认识的单词，则大致浏览patri和arch的所有单词，对词根有一个大致的印象。并且将patri（父）+arch（统治者）写在单词表patriarch的旁边，对于之后所有遇到含有patri和arch词根的单词，都与此单词进行关联记忆。</p>\n<h3 id=\"实践情况3\"><a class=\"anchor\" href=\"#实践情况3\">#</a> 实践情况3</h3>\n<p>读者看到单词<strong>mediocre</strong>，adj. 平庸的；普通的；平常的。查询词根得知</p>\n<p>med（中间的）+i+ocre（山峰；点；针）</p>\n<p>当读者熟悉词根med而不熟悉词根ocre时，由于ocre在此单词中含义已弱化，可选择不进行记忆。</p>\n<h3 id=\"实践情况4\"><a class=\"anchor\" href=\"#实践情况4\">#</a> 实践情况4</h3>\n<p>有时不必按照完全正确的方式拆解单词，只要能帮助自己记忆，就可以随心所欲的合理拆解。</p>\n<p>histrionic</p>\n<p>h+istr（星星）+ionic（谐音ironic讽刺的）⇒（讽刺明星）⇒adj 表演的，矫揉造作的，装腔作势的</p>\n<h3 id=\"总结\"><a class=\"anchor\" href=\"#总结\">#</a> 总结</h3>\n<p>词根词缀作为与英语语源学结合最为紧密的方法，在记忆部分单词效果显著。不过值得注意的是，有些单词的词义已经经过屈折、褒贬升降变化等，甚至一些单词的词源、词根不可考，单凭词根词缀记忆所有单词是不可能的。这就需要结合下文所述的谐音法进行记忆了。</p>\n<h2 id=\"13-谐音记忆法\"><a class=\"anchor\" href=\"#13-谐音记忆法\">#</a> 1.3 谐音记忆法</h2>\n<p>谐音记忆法一直被大部人诟病，大部分人唾弃谐音法的原因无非以下几点：</p>\n<ul>\n<li>影响记忆人的单词发音</li>\n<li>谐音法产生的冗余信息过多</li>\n<li>看起来很业余，很不“cool”</li>\n</ul>\n<p>作者对于谐音法的态度是，在能找到一个可以适用于所有单词，鲁棒的记忆方法之前，谐音法还是不能被淘汰，而且必将存在很长一段时间。</p>\n<p>针对第一条“<strong>影响单词发音</strong>”，我认为单词发音不应该称为记忆的一部分。英语作为一种表音文字，单词发音仅凭单词拼写以及一些常识性规则，就可以推断出来。<strong>谐音不应该是记录单词发音的方式。</strong></p>\n<p>针对第二条，我采用的谐音方法作为一系列的改良，采用以下规则：</p>\n<ul>\n<li>针对每一条谐音，只用<strong>一句话</strong>表达</li>\n<li>表示的<strong>褒贬色彩</strong>和汉语大意与原词贴切</li>\n<li>谐音具有与单词关联的<strong>鲜明特征</strong>（读音等）</li>\n</ul>\n<p>例：</p>\n<p>chastise 踹死他孩子⇒严厉批评</p>\n<p>conundrum 谐音 可难整⇒n. 谜题</p>\n<p>didactic 谐音 喋喋（不休）⇒adj. 爱说教的</p>\n<p>有些单词，读音或者词形与其他英语单词相似，也可按照此类方法记忆。</p>\n<p>imminent immediate⇒adj.即将发生的；临近的</p>\n<p>plausible possible⇒貌似真实的，貌似可行的</p>\n<p>针对第三条，作者的意见是：只要你能考出理想的分数，考研英语90+，托福100+，GRE320+，没人会说你的学习方法酷不酷。只要放下身段，找到科学的方式，勤学苦练得到想要的结果，何必纠结于这些呢。</p>\n<p>总结来说，谐音法的最终目的就是不计一些寻找与记忆人有关的熟悉的事物。以便看到单词想到中间信息，从而得出目标信息的过程。</p>\n<h2 id=\"14-anki-例句记忆\"><a class=\"anchor\" href=\"#14-anki-例句记忆\">#</a> 1.4 Anki &amp; 例句记忆</h2>\n<p>Anki支持自定义学习卡片，调节字体大小，插入音频等。</p>\n<p>这里作者使用的模板如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-html\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h1</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">backfire</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h1</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h2</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> style</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">color:grey</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">[bæk'faɪə]</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h2</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">blockquote</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">The President's tactics could backfire.</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">blockquote</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">&#x3C;!--Separate question and answer here--></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h3</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">v. to have the reverse of the desired or expected effect 事与愿违</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">br</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">b</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> style</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">color: grey</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h3</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">blockquote</span><span style=\"color:#999999;--shiki-dark:#666666\">>&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">总统的策略可能会适得其反。</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">blockquote</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>可以将模板的html代码和单词分开插入到excel的不同列中，单词表、IPA音标、例句、中文释义、例句翻译插入到excel，再复制到txt文档，将Tab制表符替换，同时前后页分隔符替换为制表符。插入到anki桌面版，导出anki文件，即可完成anki的导入工作。</p>\n<p>作者建议使用手机上的anki，充分利用碎片化的时间。例句的朗读可以使用Azure神经语音批量生成，以达到强化记忆的目的。上述提供的模板没有音频字段，不同版本Anki插入音频的代码不同，需要修改模板才可以插入例句音频。</p>\n<h2 id=\"15-推荐流程\"><a class=\"anchor\" href=\"#15-推荐流程\">#</a> 1.5 推荐流程</h2>\n<p>以下是作者推荐的背单词流程：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>输入：Wordlist：单词表</span></span>\n<span class=\"line\"><span>定义：Workinglist：正在背的单词</span></span>\n<span class=\"line\"><span>lastWordsNumber：单词表内实在没办法定义记忆锚点的单词数量的阈</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>1. start</span></span>\n<span class=\"line\"><span>2. Workinglist = &#123;&#125;</span></span>\n<span class=\"line\"><span>3. for word in Wordlist</span></span>\n<span class=\"line\"><span>    1. if 找到合适的记忆锚点（词根词缀、谐音）</span></span>\n<span class=\"line\"><span>    2. then</span></span>\n<span class=\"line\"><span>        1. Workinglist = Workinglist ∪ &#123;word&#125;</span></span>\n<span class=\"line\"><span>        2. Wordlist = Wordlist - &#123;word&#125;</span></span>\n<span class=\"line\"><span>    3. endif</span></span>\n<span class=\"line\"><span>4. 将Workinglist添加到Anki中</span></span>\n<span class=\"line\"><span>5. 使用Anki进行一轮记忆</span></span>\n<span class=\"line\"><span>6. if Wordlist.length &#x3C; lastWordsNumber</span></span>\n<span class=\"line\"><span>7. then</span></span>\n<span class=\"line\"><span>    1. 将Wordlist添加到Anki中</span></span>\n<span class=\"line\"><span>8. else</span></span>\n<span class=\"line\"><span>    1. 跳转到第2.行</span></span>\n<span class=\"line\"><span>9. endif</span></span></code></pre>\n<h1 id=\"2-阅读\"><a class=\"anchor\" href=\"#2-阅读\">#</a> 2. 阅读</h1>\n<p>阅读主要训练受试者阅读长句的解析力、阅读英语长文章的耐力。</p>\n<h2 id=\"21-长句子\"><a class=\"anchor\" href=\"#21-长句子\">#</a> 2.1 长句子</h2>\n<p><strong>训练目的</strong></p>\n<p>迅速区分句子主干与其他句子成分，同时了解句子的主要描述对象的主要内容。</p>\n<p><strong>推荐教材</strong></p>\n<p>《微臣GRE/LSAT长难句》黄皮书，每天3-4个Unit即可。</p>\n<p><strong>使用方式</strong></p>\n<p>读者自己需要有一套标注的方法。比如：</p>\n<p>For a number of years the selection of music for each file program rested entirely in the hands of the conductor or leader of the orchestra, and very often the principal qualification for holding such a position was not skill or taste so much as the ownership of a large personal library of musical pieces.</p>\n<p>按照书中的要求，标注出句子中的主语、谓语、宾语（或者主系表）（使用“”），并列关系（在逗号‘，’和‘and’上画&amp;符号），成分省略，以及各种从句和插入语成分（使用「和」）：</p>\n<p>For a number of years <strong>“the selection of music”</strong> 「for each file program」 <strong>“rested entirely in the hands of the conductor or leader of the orchestra“</strong>, and very often <strong>”the principal qualification“</strong> 「for holding such a position」 <strong>”was not skill or taste so much as the ownership”</strong> 「of a large personal library of musical pieces」.</p>\n<p>so much as: but rather</p>\n<p><strong>误区</strong></p>\n<ul>\n<li>过于追求成分划分的准确性和复杂性，以至于过于纠结句子中每一个语素究竟是插入语还是状语从句。实际上，只要能迅速<strong>区分出句子主干和其他成分</strong>，就已经达到训练的目的了。</li>\n<li>使用符号过于复杂，比如，主语使用方框、宾语使用横线，谓语使用下划线等…这样的符号工作反而降低了训练效率。</li>\n<li>有同学把每一个长难句都背诵下来，在我看来这样很浪费时间。每天只要保证足够的阅读训练即可。对一些句子的理解实在有困难，可以出声多读几遍，体会语素之间的关系，但没必要背诵。</li>\n</ul>\n<h2 id=\"22-阅读耐力\"><a class=\"anchor\" href=\"#22-阅读耐力\">#</a> 2.2 阅读耐力</h2>\n<p>这一点是很多同学经常忽视的训练。尤其是考完四六级的同学，有阅读读不下去、过程中走神的现象。针对这个问题，作者针对不同阶段的同学，提出以下几个训练方法：</p>\n<h3 id=\"菜鸟类\"><a class=\"anchor\" href=\"#菜鸟类\">#</a> 菜鸟类</h3>\n<p>典型经历：阅读过程中句中含有关键信息的单词不认识，即使认识也需要花很长时间才想起来。一篇文章读了东忘了西，信息没有在头脑中留存有价值的印象。</p>\n<p>训练方法：这个阶段的同学主要是词汇量十分缺乏，以至于影响到了阅读。所以应该以<strong>增加词汇量</strong>为主，并且做<strong>大量的长难句训练</strong>。争取将词汇量扩充至目标考试的要求，以及长难句的训练达到了目标。读文章时，一定要用<strong>纸笔记录</strong>看到的关键信息，记录成<strong>树状的结构</strong>，做题时通过笔记结合原文。</p>\n<h3 id=\"入坑类\"><a class=\"anchor\" href=\"#入坑类\">#</a> 入坑类</h3>\n<p>典型经历：阅读中单词都可以读懂，但是连成句子就不知道句子的意思，一篇文章阅读速度慢，通常读了一半就读不下去了。或者句子可以读懂，每句话也知道在讲什么，但是在读文章的过程中，总是因为记不清前文所述的内容而出现回看、寻找等行为，导致时间上的浪费。</p>\n<p>训练方法：这个问题主要是由于在英文语境下同学缺少对信息的主动归纳和主动筛选导致的。可以采取<strong>重读训练</strong>。</p>\n<h3 id=\"重读训练\"><a class=\"anchor\" href=\"#重读训练\">#</a> 重读训练</h3>\n<ul>\n<li>先通读文章做题，然后把答案改好后，将原文中<strong>不认识的单词、词组标注出来</strong>，进行学习。</li>\n<li>当原文所有单词和词组都基本熟悉之后，<strong>计时重新阅读文章</strong>。初期需要达到每分钟80词的目标，而后期训练则需要达到每分钟120词。</li>\n</ul>\n<p>这样的“重读训练法”可以强迫读者在熟悉文章的大意的基础上，再次阅读文章，强化记忆文章的结构，以及英语句子的表达习惯。</p>\n<h1 id=\"3听力\"><a class=\"anchor\" href=\"#3听力\">#</a> 3.听力</h1>\n<p>听力在四六级考试和托福雅思考试中是重要的组成部分。初高中的听力材料通常达不到锻炼英语听力的要求，这些材料通常：语速偏慢，词汇简单，篇幅较短，内容逻辑浅显。而作者认为，有效的词汇和跟读练习，有助于同学短时间提高英语听力能力。</p>\n<h2 id=\"跟读练习\"><a class=\"anchor\" href=\"#跟读练习\">#</a> 跟读练习</h2>\n<p>跟读练习本质上是“<strong>模仿</strong>”，就是通过手眼口耳分析、学习并理解听力材料的练习。而关键则是保证练习质量的前提下逐渐加快速度。本质上与练习乐器的方式相同：对于同一个乐谱，先慢速练习，保证每个音符的节奏和音高准确，再逐渐提高速度。</p>\n<p>练习方法：</p>\n<ul>\n<li>将练习材料放慢到<strong>音节速度</strong>。音节速度：学习者可以听清楚每一个单词内的音节的发音和语调，并且能够按照相同的速度重复下来。注意：随着同一个练习材料的不断练习和英语听力口语发音水平的不断提高，学习者的音节速度应该不断提高。</li>\n<li>播放音频，并在你能够准确模仿原文（包括单词、音节的节奏、语调等）的最大长度暂停。</li>\n<li>尽可能的重复模仿朗读原文。</li>\n<li>重听上一段，找到自己与原文的差距。并再次模仿。</li>\n<li>跳转到第二步。</li>\n</ul>\n<p>练习效果：</p>\n<p>同一篇听力材料经过2-3遍的跟读练习后，再次按照原速听辩时，可以毫不费力的理解听力内容。</p>\n<p>推荐材料：</p>\n<ul>\n<li>Kurzgesagt(入门听力材料，泛听)</li>\n<li>Crash Course(进阶听力材料，跟读后反复听，掌握说话的语速和节奏)</li>\n<li>以及油管上你喜欢的游戏英语直播录屏。兴趣是最好的老师</li>\n</ul>\n<h1 id=\"4口语\"><a class=\"anchor\" href=\"#4口语\">#</a> 4.口语</h1>\n<p>口语主要考察语音面貌和内容。内容可以采用跟读练习的方式逐步积累。这里说一下语音面貌的改善方式。</p>\n<h2 id=\"语音面貌\"><a class=\"anchor\" href=\"#语音面貌\">#</a> 语音面貌</h2>\n<p>语音面貌通俗的定义就是英语是否说得地道。这里不要求读者达到与母语一样的水平，有口音是很正常的现象，但我们必须极大程度减少自己口音和发音不地道的地方给听者带来的影响。</p>\n<h3 id=\"音标学习训练\"><a class=\"anchor\" href=\"#音标学习训练\">#</a> 音标学习&amp;训练</h3>\n<p>辅音训练推荐视频：</p>\n<p>BV1dv411r7zb Paul Gruber老师辅音很详细</p>\n<p>元音训练推荐视频：</p>\n<p>BV1iV411z7Nj 英语兔的音标教程，英语兔研究的十分详细，尤其是对应元音图纠正中式发音</p>\n<h3 id=\"音节节奏和语调训练\"><a class=\"anchor\" href=\"#音节节奏和语调训练\">#</a> 音节节奏和语调训练</h3>\n<p>做录音的跟读训练，不过跟听力的跟读训练相比，口语的跟读训练选择的材料速度更慢，对于模仿的准确度要求更高。此处建议读者模仿跟读时，录音以便进行更详细的比对。</p>\n<h1 id=\"结语\"><a class=\"anchor\" href=\"#结语\">#</a> 结语</h1>\n<p>作者认为，英语学习不仅是为了考试，不仅是为了考研、出国等可以看见的目标，英语本身作为一种全世界通用的语言，是我们走向世界的一把钥匙。同时，英语中所蕴含的文化，以及英美的思考方式也是我们学习英语过程中可以深切体会到的。</p>\n<p>最后，希望所有有志于学习英语的读者可以在本文中得到启发，祝愿所有读者在英语学习中取得进步。本文作者才疏学浅，诸多理论仅为个人经验，未经科学实证。如有讨论交流或批评指正，请联系：Vlairrrrr@outlook.com。</p>\n",
            "tags": [
                "Tutorial",
                "English Learning"
            ]
        }
    ]
}