Unity 3D : ComputeShader 全面詳解

https://blog.csdn.net/weixin_38884324/article/details/80570160

前言:

會寫一些簡單的 ComputeShader, 但還是很多人可能還搞不懂

  1. Dispatch (x, y, z)
  2. [numthreads (x, y, z)]
  3. SV_GroupID
  4. SV_GroupThreadID
  5. SV_GroupIndex
  6. SV_DispatchThreadID

這些是啥,今天我來為大家做一個比較全面的說明,畢竟 ComputeShader 的資源還算是比較少的。

另外我當大家已經運行過一些簡單的 ComputeShader 代碼了,只是不了解其中的奧秘。

如果你沒運行過,那可以先到這邊爽一下:https://blog.csdn.net/weixin_38884324/article/details/79285371

※ 需要注意的是,本篇文章是用圖片的方式來說明,並非使用矩陣的方式來講解,因為我覺得圖片的方式會比較好理解。而且輸入(Texture2D)與輸出(RWTexture2D) 的圖片是同一個解析度。


第一節:

Dispatch (x, y, z) 與 numthreads (x, y, z) 的關係

很多人把 ComputeShader 代碼 Run 起來了,但或多或少會產生一個疑問,就是在 C# 中的 DispatchComputeShader 中的 numthreads 是啥關係,感覺其中數字設定有一些奧妙所在 ? 試著亂調其中的數字圖片還會有部分會無法顯示….WTF?

假設你輸入(Texture2D)與輸出(RWTexture2D) 的圖片是同一個解析度,你只是要做一些單像素的計算 (例如轉成灰階),那麼 Dispatch 與 numthreads 要如何設置才能顯示完整的圖片? 而不會缺一角?

其實很簡單,假設圖片解析度是 256 x 128,那麼以下幾種設置都能完整顯示圖片:

Dispatch (k, 256, 128, 1)         [numthreads (1, 1, 1)]
Dispatch (k, 32, 16, 1)           [numthreads (8, 8, 1)]
Dispatch (k, 256/8, 128/8, 1)     [numthreads (8, 8, 1)]
Dispatch (k, 8, 4, 1)             [numthreads (32, 32, 1)]
  • 1
  • 2
  • 3
  • 4

哇靠,這麼多種 ? 那有甚麼規律呢 ?

有的,你會發現 Dispatch.x * numthreads.x = 256 ( 圖片寬度 ),Dispatch.y * numthreads.y = 128 ( 圖片高度 )。只要 Dispatch * numthreads 是圖片大小,那麼圖片就能完全顯示,不會少漏一個像素。

But ! But ! But !

但是非常重要的事情是,numthreads 使用上是有限制的,numthreads.x * numthreads.y * numthreads.z 必須小於等於 1024

以下是錯誤例子,乖孩子別學:

[numthreads (64, 32, 1)]
[numthreads (16, 16, 16)]
[numthreads (256, 128, 1)]
  • 1
  • 2
  • 3

好了,現在你已經能夠完美顯示圖片了,但是並不瞭解其中的原理,所以下一章開始會更詳細的說明。


第二節:

更深入的了解 Group 與 Thread 的關係

我們第一節使用 Dispatch(x, y, z),其實這就是在設定 Group 數量;而 numthreads(x, y, z) 就是在設定 Thread 數量。

假設我們有一張 4X4的圖像,使用參數 Dispatch(k, 2, 2, 1) 與 [numthreads(2, 2, 1)] 。那麼在 GPU 中劃分就如同下圖 ( 四個 Group, 每個 Group 中又包四個 Thread ):

Group 的 長、寬、高 是由 numthreads 所設定的,同理一個Group的大小是不能超過 1024 ( 見第一節 )。

同理 [numthreads(32, 32, 1)] 的 Group 大小就是 32 * 32 * 1 ( 也許你可以理解 32 * 32 像素 )

然而如果你的 GPU 有 64 核心,而你的 Group 也有 64 個,那麼每個核心將能處理一個 Group。

假設 ThreadSize = ( numthreads.x * numthreads.y * numthreads.z )

那麼不同的 ThreadSize 在不同硬件廠下分配的資源是不同的

建議:
AMD:ThreadSize 使用 64 的倍數 ( wavefront 架構 )
NVIDIA:ThreadSize 使用 32 的倍數 ( SIMD32 (Warp) 架構 )

另外使用 Group 有個好處,就是可以等待所有 Thread 同步。不過不同的 Group 是無法同步的。

如果你要在一個 Group 中同步所有 Thread,你可以用下面這語法

GroupMemoryBarrierWithGroupSync(); 
  • 1

第三節:

SV_GroupID、SV_GroupThreadID、SV_GroupIndex 關係

由上圖可知,我們在 ComputeShader 函式中可以放入四個值,分別是

SV_GroupID : 線程組 ID
SV_GroupThreadID : 線程組內的線程 ID (三維,你可以理解為 Group 內的座標)
SV_GroupIndex : 線程組內的線程 ID (一維)
SV_DispatchThreadID : 唯一ID (你可以理解成整張圖片座標)
  • 1
  • 2
  • 3
  • 4

用下圖可以知道他們的座標關係:

看不懂 ? 好吧,我實際 Run 結果應該就明白啦 ! 如下圖:

Group ID 一看就懂 :

來看一下索米 :

Group Thread ID 一看就懂 :

Group Index 一看就懂 :


第四節:

DispatchThreadID

公式:DispatchThreadID = GroupID * numthreads + GroupThreadID

// 敬請期待…


第五節:

性能優化

// 敬請期待…


第六節

原子鎖

// 敬請期待…

=第七節

共享內存

// 敬請期待…

groupshared float4 gCache[256]
最大空间为32kb
用 Group Thread ID 索引


結語:

好累哈,花了一整天總算寫完 一 ~ 三節 ( 後面節數慢慢補充 ),也算是自己思緒地整理,雖然一些地方表達得不是很好,但我盡量用最簡單的方式說明,如果你覺得有更好的建議或不完美的地方,歡迎在下面留言。如果你喜歡本文章就按讚吧,如果你要轉載請註明出處吧。

參考

參考:https://blog.csdn.net/YgritteSnow/article/details/54988931

Unity 3D : ComputeShader 全面詳解相关推荐

  1. Unity 3D 菜单栏快捷键详解

    nity 3D菜单栏及快捷键详解 File 菜单 Edit 菜单 Assets 菜单 GameObject 菜单 Component 菜单 Window 菜单 Help 菜单 其他快捷键 Unity ...

  2. [Unity 3D] 簡單瞭解「Collision碰撞」與「Trigger觸發」

    Unity 3D是套非常好用的遊戲開發引擎, 內建的物理系統讓使用者不需寫長長的程式碼, 就能夠迅速設定好所有物件之間的碰撞關係, 做出讓角色走不過去的牆.或是可以射穿牆壁的子彈等等. 不過它的設定相 ...

  3. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  4. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  5. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  6. 雨松MOMO《Unity 3D游戏开发》源码公布

    原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...

  7. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  8. Unity 3D 博客汇总

    附录 X4.作业优秀博客汇总 目录 文章目录 附录 X4.作业优秀博客汇总 1.最有价值个人博客(Valuable Person Blogs) 2.博客表达技巧与游戏创新 2.1 写读者欢迎的游戏博客 ...

  9. 【Unity 3D】常用插件DOTween、Haste、Exploder、KGFMapSystem介绍(图文解释)

    Unity 3D最好的地方就是有各种强大的插件.其中一些插件的功能稳定强大,可以让大家事半功倍,值得学习和入手 下面对它们进行详细介绍 1:DOTween插件 DOWween是一款对象动画类插件,前身 ...

最新文章

  1. android.os.NetWorkOnMainThreadExcetion
  2. 超市账单管理系统设计思路
  3. 【STM32】跑马灯实验主要程序代码分析
  4. kettle使用数据库来生成序列_Python办公自动化:使用python来自动生成word文档
  5. 恢复联想键盘F1-F12标准模式
  6. 【SQLAlchemy】MySQL server has gone away 原因分析、解决方法
  7. KMP字符串比对算法理解
  8. 脚本制作Minilinux
  9. 亲民地理第39期-佛山(3)千灯湖
  10. 微信支付开通流程,及微信支付商户号申请详细流程介绍
  11. 2021-03-29
  12. 免费站群系统cm-SEO需要多长时间?
  13. spring事务传播级别
  14. 运维审计是什么意思?有什么作用?用什么软件好?
  15. My Java 总结
  16. 浅谈云原生的“前世今生”
  17. 过河问题(贪心算法)(python)
  18. 广州、深圳NPDP认证考试取消通知
  19. 安科瑞Acrel-BUS智能照明控制系统在医院的应用
  20. 【Fluent Meshing】04:计算域提取

热门文章

  1. 通过一张模糊的照片,判断拍摄的具体位置
  2. 基于概率距离削减法、蒙特卡洛削减法的风光场景不确定性削减(Matlab代码实现)
  3. tgp无法显示服务器,tgp设置游戏服务器未响应
  4. 怎么合适地使用Vim保存文件?
  5. 2016校招内推 -- 腾讯SNG前端 -- 面试经历
  6. 九索数据程鹏飞:打造城市精细化管理的“西安蓝本”
  7. Win11删除的东西没有进入回收站
  8. QT-通用TCP客户端使用工具
  9. PyTorch给句子加所谓的mask
  10. 七、完善:飞机生命值和子弹杀伤力(雷霆战机)