日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity 线程断点时卡机_Compute Shader在Unity和UE4中的应用

發布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。