unity 线程断点时卡机_Compute Shader在Unity和UE4中的应用
該文檔為學習文檔,如有錯誤歡迎指正。
1. D3D11 Compute Shader概述
Compute Shader 是一個通用計算 Stage。它利用了GPU的并行處理器,實現大量線程并發執行。它可以獨立于渲染管線之外,計算完成的數據可以在CPU回讀;也可以結合到渲染管線中,利用GPU Buffer與其他Stage進行通信。
HLSL中的Compute Shader的編寫:其main(參數:線程id)函數,實際上是單個線程的執行代碼;main函數的參數,是線程的id標識,即用來定位該線程,以便于在Buffer中定位數據。
D3D11中Compute Shader 的執行:->Dispatch(線程組數量),即通知GPU執行多少線程組,并且執行完返回。
2. Unity和UE4 的Compute Shader 概述
(1) Unity
Unity 在編輯器中暴露了 *.shader(vertex shader、pixel shader)和*.compute(compute shader) ,可以直接在編輯器中創建并使用。其中Shader 在 Material被引用;而Compute Shader 獨立使用。 Compute Shader 在Unity中2種類型的應用方式:
① 創建“*.compute”。編寫hlsl代碼。若需要與其他Shader通信,則編寫C#代碼實現通信,實際上就用公用Buffer。
② 隱含在VFX中被創建。Visual FX (Unity 的GPU 粒子的可視化編輯器),定義了一類新的資源*.vfx。這是一個gpu粒子資源。該資源可以包含若干個*.shader和若干個*.compute,并且這些隱含資源是unity根據編輯好的節點邏輯自動生成的。
(2) UE4
UE4在編輯器中沒有暴露 Shader的概念,只有材質節點編輯器。Compute shader 與其他Stage的Shader一起被封裝在了底層,各類Shader(VS、HS、DS、PS、GS、CS)用一個枚舉來進行區別。而Compute Shader在UE4引擎代碼中 主要被分成3類來使用
① MaterialShader:需要從材質中獲取信息的Compute Shader。目前UE4.19里只有一個這樣的Compute Shader;其他MaterailShader都為VS、HS、DS、PS、GS
② GlobalShader:全局的ComputeShader。這類ComputeShader有一百多個實例。(應用范圍,摘錄自UE使用到的一些文件名: ParticleBound、ParticleSort、GPUSkinCache、GPUSort、Morph、PostProcess、Shadow、DistanceFieldAO、DistanceFieldGI、DistanceFieldShadow等等)
③ NiagaraShader: Niagara是一個UE4自己的插件,一個粒子編輯器。與MaterialShader類似,它應該也是可以根據不同的粒子,生成不同的Shader。實際上它只有一個對應的shader文件,但是可以根據粒子編輯器的編輯,生成一個hlsl的函數,插入到這個shader文件已有的代碼模板中,從而產生不同的compute shader。(在代碼中有看到插入函數的代碼拼接過程;產生不同的cs則暫為個人推測)
3. Compute Shader
(1) D3D11相關接口和相關Flag參數
(2) HLSL語法
① Buffer聲明
Buffer類型:StructuredBuffer、RWStructuredBuffer、ByteAddressBuffer、RWByteAddressBuffer、AppendStructuredBuffer、ConsumeStructuredBuffer、IncrementCounter、DecrementCounter、TextureXD(應該還沒列全)。其中“RW”前綴表示可讀寫
關鍵字groupshared:線程組內共享的buffer。
② 線程組內線程數量聲明
[numthreads(x,,y,,z,)]
線程組的數量由D3D的接口Dispatch的參數來決定。
而一個線程組內線程的數量則在hlsl里確定,關鍵字為numthreads。組內線程數量 = x,*y,*z,
③ Main函數
為單個線程的執行代碼
參數可以選取以下:
1) SV_GroupThreadID:(x,y,z)線程組內線程id
2) SV_GroupID:(x,y,z)線程組id
3) SV_DispatchThreadID:(x,y,z)在所有線程中的線程id
4) SV_GroupID:計算出來的線程組id(一個int)
4. Unity 的 Compute Shader
(1) Unity Compute Shader 文件內容
Unity關鍵字:Kernel(對應一個compute shader main 函數)
文件后綴:*.compute
語法:hlsl
(2) Unity C#ScriptingAPI 內Compute Shader相關
① 類ComputeShader
② 類ComputeBuffer
5. UE4 的Compute Shader
Compute Shader 被封裝到了UE4的RHI(Render Hardware Interface)的各模塊中;它的使用主要被封裝在了UE4的Renderer模塊中。
(1) RHI(Render Hardware Interface)
外部使用圖形硬件的接口
① IRHIComputeContext:包含compute shader 執行時用到的接口
② IRHICommandContext:繼承IRHIComputeContext。具體化為D3D11的話,包含了D3D11DeviceContext的內容
③ FDynamicRHI:具體化為D3D11的話,包含了D3D11Device的內容。可用于創建Buffer,創建Shader等等
(2) D3D11RHI
① FD3D11DynamicRHI。實現了接口IRHICommandContext和接口FDynamicRHI。
② FD3D11StateCacheBase
這是對D3D11中StateCache的封裝。State包含了 VS、HS、DS、GS、PS、CS.
在渲染時,可以同時設置VS、HS、DS、GS、PS. 在使用CS時,可單獨設置CS。
(3) Renderer模塊中
① FShader
② FShaderReouseces:包含了Shader在RHI的指針
③ FMaterialShader:需要獲取材質信息的Shader
④ FNiagaraShader:Niagara中使用的Shader;Niagara是一個粒子插件。
⑤ FGlobalShader:全局Shader
⑥ FMaterial:只能包含FMaterialShader。
總結
以上是生活随笔為你收集整理的unity 线程断点时卡机_Compute Shader在Unity和UE4中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 禁止更改计算机名_【复习收藏】计算机操作
- 下一篇: 触发器是不是不能喝外键同时存在_数字电路