该文档为学习文档,如有错误欢迎指正。

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中的应用相关推荐

  1. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  2. [Unity脚本运行时更新]C#6新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第4篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  3. [Unity脚本运行时更新]C#5新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第3篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  4. Unity线程与协程

    文章目录 前言 一.unity真的不支持多线程吗? 1.unity中使用多线程 2.unity中多线程的停止 3.unity中使用多线程的问题 二.协同程序 1.协程的使用 2.协程的原理 总结 前言 ...

  5. Unity从零开始实现一个全息效果Shader

    Unity从零开始实现一个全息效果Shader 前言 开始捣鼓 一.准备阶段 二.先从透明效果开始 三.顶点故障效果 四.扫描线效果 五.菲尼尔反射效果 六.颗粒效果 七.颜色故障效果 CustomE ...

  6. 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    <入门精要>中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是GrabPass,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabP ...

  7. 案例学习——Unity基于体绘制的大气散射shader

    本案例学习资料来源 Volumetric Atmospheric Scattering 案例学习--Unity基于体绘制的大气散射shader 0 效果展示 1 引入 1.0 介绍 1.1 单次散射( ...

  8. 【Unity Shader】Unity Chan的卡通材质

    写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...

  9. 使用线程池时一定要注意的五个点

    一.使用线程池在流量突发期间能够平滑地服务降级 很多场景下应用程序必须能够处理一系列传入请求,简单的处理方式是通过一个线程顺序的处理这些请求,如下图: 单线程策略的优势和劣势都非常明显: 优势:设计和 ...

最新文章

  1. 入口文件到控制器 php,workerman的入口文件_PHP开发框架教程
  2. oracle解密des乱码,Oracle中des等算法的加解密
  3. Visual Studio 2017强制更新方法
  4. Linux内核设计基础(一)之中断处理
  5. HarmonyOS之AI能力·实体识别
  6. 第 39 章 ThinkPHP--CURD 操作
  7. SAP 免费赠与客户货物的销项税处理
  8. Nginx+php+mysql+wordpress搭建自己的博客站点
  9. html颜色转换rgba,16进制颜色怎么转换为rgba,怎么获取16进制颜色值rgba的值
  10. 主成分分析(PCA)及其可视化——python
  11. 计算机网络 子网掩码
  12. python 格林威治时间转换为标准时间格式
  13. My深度学习的总结记录
  14. updater-script 刷机脚本语法
  15. 大规模敏捷导入工具实践
  16. python用PIL给图片反转颜色
  17. 基于MATLAB实现电磁场的动画演示
  18. ListView字母快速索引 自动搜索
  19. Bridge 模式(转)
  20. 08 Mac系统实现搭建Sinatra系统

热门文章

  1. 机器学习理论《统计学习方法》学习笔记:第二章 感知机
  2. KMP字符串搜索算法
  3. java出现errors是什么错误_java中错误(error)和异常(exception)有什么主要区别?
  4. LeetCode 两数之和
  5. Linux中的cp命令和mv命令
  6. Spring Boot——Druid在application.yml文件中配置【spring.datasource.druid.aop-patterns】无效解决方案
  7. Typora——恢复未保存文件解决方案
  8. idea(一)使用详解
  9. Spring-学习笔记02【程序间耦合】
  10. 软件工程概论 课堂练习 第3次作业3【画出“工资处理”子系统的结构图】