当前位置: 首页 > news >正文

[ue4] 着色器绑定(Shader Binding)

        当我们在ue4中制作了一个美术材质之后,引擎本身会为我们做很多事情,它会把结点翻译为hlsl,生成多个shader变体,并在多个mesh pass中去选择性的调用所需的shader,其中一个重要的过程就是获取shader绑定的数据。

        本文将主要讨论ue4是如何处理来自材质的不同的输入,它们将以怎样的形式传递给shader,以怎样的频率更新,并在调用层做了怎样的优化处理。

输入类型

        我们在材质中能控制输入的地方有两处,一个是材质直接输入,另一个是材质参数集合:

        ① 材质直接输入。

        我们可以在母材质中开放给shader的参数,如美术纹理和参数。静态的参数我们使用静态材质,动态可运行时修改的参数我们使用动态材质。

        这种输入的特点是每个材质独享一份参数输入,因此它在底层设计为每个Material实例独立的Uniform Buffer,在ue4中使用FUniformExpressionCache数据结构来描述。

        ② 材质参数集合(MPC, Material Parameter Collection)

        我们还可以创建MPC资产,可以添加vector或scalar参数。

        这种输入的特点是参数可以在多个材质共享,比较适合一些全场景的效果控制,但一个材质支持输入的MPC数量是比较有限的。

        它在底层设计为场景中全局的Uniform Buffer集合,同时每个shader引用到的MPC索引由FUniformExpressionCache记录,可方便我们快速查找。

        材质会生成多个shader变体,其中可能包括prepass, shadowpass, basepass的vs和ps,根据顶点类型的不同可能还包括了不同的顶点工厂(Vertex Factory),比如staticmesh, instance或skeletal。这些shader是在代码中定义的,每个特定的shader还可以指定一些输入。

        ③ 顶点工厂的输入

        主要包括的是顶点属性(Vertex Attribute)的输入,包括位置、法线、顶点色、实例位置等。我们可以使用Vertex Buffer或Buffer传输这些数据。

        ④ 顶点或像素着色器的输入

        主要包括的是更加底层模块的一些输入,比如光照/阴影/大气等的输入。

        这部分的输入格式是由代码指定的,和材质中主要通过Uniform Buffer来绑定不一样,这里输入的格式更加灵活,一些共用的数据可能会放在Uniform Buffer中,而一些常量(Loose Data)可能直接绑定到shader中,我们还可以绑定一些资源类型的数据(SRV),比如Texture2D, Buffer, Structure Buffer等。

        ⑤ 全局输入

        在多个shader中共享的数据或者一些必需的数据会设计在全局的Uniform Buffer中。

        比如在basepass和defer pass中都可能会用到的各种LightUniformBuffer,存储灯光方向等信息;几乎在所有pass都会用到的ViewUniformBuffer,存储相机位置等信息。

        还设计了一些高频数据作为独立的Unform Buffer,比如逐物件的PrimitivieUniformBuffer等;

输入上传

        ue4在开始计算场景可见性(SceneVisibility)前,会先尽早地完成一些数据的上传,让GPU先开始忙碌起来,这样的话可以不阻碍后续的一些渲染工作,包括:

        ① 上传Primitive Uniform Buffer(静态物件初始化调用,动态物件多帧上传)

        ② 上传GPU Skin(蒙皮物件动画信息)

        ③ 上传Material Uniform Buffer(静态材质初始化调用,动态材质多帧上传)

        ④ 上传Material Parameter Collection(更新时上传)

        ⑤ 上传一些代码中定义的Uniform Buffer(如View等)

        还有一部分数据比如LightmapUniformBuffer一般都是静态的,所以不会频繁更新,我们也较难捕获到这方面的数据。

        单个ub数据上传的时间并不算太长,大概是us的量级。但如果场景中使用了大量的动态物件和动态材质,整体的上传时间还是比较可观的。

输入绑定

        当我们向shader传入特定输入的时候,意味着shader中应该有对应的变量。材质中的变量是由ue4自动生成的,而代码中则是程序指定的变量。

        在整个绘制工作流中,我们会首先完成shader的编译,并且去收集这些shader中存在的绑定信息。当我们在C++中收集绑定输入的实际值时,会先去校验shader中对应的绑定点和slot id。

        绑定类型

        ue4的Mesh Draw管线中,我们使用Shader Binding来完成这一点,它是一种延迟的设计,因为它会先去收集所有可用的绑定实参,提交前再调用实际的RHI层的绑定。

        它支持的类型包括Uniform Buffer,Sampler,SRV(texture, buffer),Loose Data,顶点的输入则由Input Stream负责,不包含在Shader Binding负责的范畴中。所有的绑定信息我们可以认为是一个Input Layout,它可编码为缓冲区。

        其中,Uniform Buffer, Sampler, SRV记录的是实际分配的引用,是一种分离式的设计;而Loose Data是我们直接绑定在shader上的参数,存储了实际的数据,可以理解为一个内联的常量数据。

        API映射

        我们在API中完成一次drawcall,通常会设置首先去各种状态量和绑定量,包括:

        ● SetPipelineState

        ● SetVertexBuffer/ SetIndexBuffer

        ● SetShaderBinding

        对于CPU端来说,消耗主要体现在数据的准备和调用上;实际指令执行的过程中,GPU也会产生状态切换的消耗。

        在API底层,如在Vulkan中,Shader Binding的调用会被映射为vkCmdBindDescriptorSets;dx12则相对复杂,它可能会映射到SetGraphicsRootConstantBufferView或SetGraphicsRootDescriptorTable等。

        Vulkan的设计可能会产生更少的调用,而DX12的设计会更加适合输入排列的复用,但大多数的游戏引擎并不会优化到这么细致。

输入调用

        在输入调用上,Shader Binding之所以要设计为延迟调用,是为了尽可能缓存一些绑定命令,减少CPU端渲染指令调用的次数。缓存的可复用性依赖于绘制对象的排序,我们应该尽可能把共享相同状态的对象合并到一起。

        在缓存机制上,我们可以去缓存的内容包括PipelineState,它包含的最重要内容就是Shader,如果Shader Code完全一致仅仅是输入不同我们是可以缓存的。其次是一些输入,比如Uniform Buffer, SRV等,这些数据的缓存会对一些图形API产生收益。

        Vertex Buffer和Index Buffer是比较特殊的阶段,我们没有办法去缓存这些数据。

        实际实现中,Shader Binding会去维护一个缓存的状态,只有在绑定发生变化的时候,才去实际调用RHI层的设置接口,当我们把具有相同状态的对象排列在一起时,尤其是使用相同Shader的物体,缓存优化会得到较好的收益。

相关文章:

[ue4] 着色器绑定(Shader Binding)

当我们在ue4中制作了一个美术材质之后,引擎本身会为我们做很多事情,它会把结点翻译为hlsl,生成多个shader变体,并在多个mesh pass中去选择性的调用所需的shader,其中一个重要的过程就是获取shader绑定的数据。 本文将主…...

Rust语言之迭代器

文章目录Rust迭代器Rust迭代器的实现Iterator特型IntoIterator特型for循环与迭代器迭代器类型再看for循环实现自定义迭代器方式一方式二相关参考Rust迭代器 Rust语言内置了迭代器模式,用于实现对一个项的序列进行特定的处理,通常配合for循环使用。当我们…...

TreeSet 与 TreeMap And HashSet 与 HashMap

目录 Map TreeMap put()方法 : get()方法 : Set> entrySet() (重) : foreach遍历 : Set 哈希表 哈希冲突 : 冲突避免 : 冲突解决 ---- > 比散列(开放地址法) : 开散列 (链地址法 . 开链法) 简介 : 在Java中 , TreeSet 与 TreeMap 利用搜索树实现 Ma…...

Java围棋游戏的设计与实现

技术:Java等摘要:围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为S…...

第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat

文章目录第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat使用选项运行 irisstatirisstat Options第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat 使用选项运行 irisstat 不带选项运行 irisstat 会生成基本报告。通常,…...

【博客619】PromQL如何实现Left joins以及不同metrics之间的复杂联合查询

PromQL如何实现Left joins以及不同metrics之间的复杂联合查询 1、场景 我们需要在PromQL中实现类似SQL中的连接查询: SELECT a.value*b.value, * FROM a, b2、不同metrics之间的复杂联合查询 瞬时向量与瞬时向量之间进行数学运算: 例如:根…...

Win11自定义电脑右下角时间显示格式

Win11自定义电脑右下角时间显示格式 一、进入附加设置菜单 1、进入控制面板,选择日期和时间 2、选择修改日期和时间 3、选择修改日历设置 4、选择附加设置 二、自定义时间显示出秒 1、在选项卡中,选时间选项卡 2、在Short time的输入框中输入H:m…...

TrueNas篇-trueNas Scale安装

安装TrueNAS Scale 在尝试trueNas core时发下可以成功安装,但是一直无法成功启动,而且国内对我遇见的错误几乎没有案例,所以舍弃掉了,而且trueNas core是基于Linux的,对Linux的生态好了很多,还可以可以在t…...

element表单搜索框与表格高度自适应

一般在后台管理系统中,表单搜索框和表格的搭配是非常常见的,如下所示: 在该图中,搜索框有五个,分为了两行排列。但根据大多数的UI标准,搜索框默认只显示一行,多余的需要进行隐藏。此时的页面被…...

MySQL使用技巧整理

title: MySQL使用技巧整理 date: 2021-04-11 00:00:00 tags: MySQL categories:数据库 重建索引 索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面…...

七大设计原则之里氏替换原则应用

目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P…...

1行Python代码去除图片水印,网友:一干二净

大家好,这里是程序员晚枫。 最近小明在开淘宝店(店名:爱吃火锅的少女),需要给自己的原创图片加水印,于是我上次给她开发了增加水印的功能:图片加水印,保护原创图片,一行…...

Connext DDS属性配置参考大全(2)

DDSSecure安全com.rti.servcom.rti.serv.load_plugin...

一起Talk Android吧(第四百九十二回:精简版动画)

文章目录概念介绍使用方法示例代码经验总结各位看官们大家好,上一回中咱们说的例子是"动画集合:AnimatorSetBuilder",这一回中咱们说的例子是" 精简版动画"。闲话休提,言归正转,让我们一起Talk Android吧&…...

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时,服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中,有说到过,事务发起者在发现分支事务执行异常之后,会提交全局事务回滚的请求到netty服务端,这里是发…...

【Vue3源码】第一章 effect和reactive

文章目录【Vue3源码】第一章 effect和reactive前言1、实现effect函数2、封装track函数(依赖收集)3、封装reactive函数4、封装trigger函数(依赖触发)5、单元测试【Vue3源码】第一章 effect和reactive 前言 今天就正式开始Vue3源码…...

C函数指针

函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、数组或字符型等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明:typedef int (*fun_ptr)(int,int); // 声明一个指…...

2023同等学力申请硕士计算机综合国考

同等学力国考报名要开始了 2023年2月15日,中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”(https://tdxl.chsi.com.cn,联系服务电话:010-67410388)公布报名工作通知。考生须按照通知要求进行注册或…...

英语基础-并列句概述

什么是并列句?并列句就是用连词把独立的句子连接起来,使得句子之间产生并列的逻辑。 1. 并列句中的逻辑 1. 小明步行上学,小红骑自行车上班。 Ming goes to school on foot,and Hong goes to work by bike. 平行逻辑 2. 小红经常玩手机…...

大数据框架之Hadoop:HDFS(一)HDFS概述

1.1HDFS产出背景及定义 HDFS 产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件…...

20230210组会论文总结

目录 【Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method】 【ShuffleMixer: An Efficient ConvNet for Image Super-Resolution】 【A Close Look at Spatial Modeling: From Attention to Convolution 】 【DEA-Net: Single i…...

Python - 数据容器dict(字典)

目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{},不过存储的元素是一个个的:键值对&#…...

傻白探索Chiplet,文献阅读笔记汇总(十二)

Summary(方便分类管理) Article(文献出处) 方便再次搜索 Data(文献数据) 总结归纳,方便理解 Comments(对文献的想法)/Why(为什么看这篇文献)强…...

#电子电气架构——Vector工具常见问题解决三板斧

我是穿拖鞋的汉子,魔都中一位坚持长期主义的工科男。 今天在与母亲聊天时,得到老家隔壁邻居一位大姐年初去世的消息,挺让自己感到伤感!岁月如流水,想抓都抓不住。想起平时自己加班的那个程度,可能后续也要自己注意身体啦。 老规矩,分享一段喜欢的文字,避免自己成为高知…...

文本三剑客之grep

Grep是Linux用户用来搜索文本字符串的命令行工具。您可以使用它在文件中搜索某个单词或单词的组合,也可以将其他Linux命令的输出通过管道传输到grep,因此grep可以仅显示您需要查看的输出。grep的命令格式如下:grep 选项 查找条件 目标文件…...

pwn手记录题1

fuzzerinstrospector(首届数字空间安全攻防大赛) 主体流程(相对比较简单,GLibc为常见的2.27版本, Allocate申请函数(其中有两个输入函数Read_8Int、Read_context; 还存在着后门函数; 关键点在于如何利用…...

自动驾驶规划 - Apollo Lattice Planner算法【1】

文章目录Lattice Planner简介Lattice Planner 算法思路1. 离散化参考线的点2. 在参考线上计算匹配点3. 根据匹配点,计算Frenet坐标系的S-L值4. parse the decision and get the planning target5. 生成横纵向采样路径6. 轨迹cost值计算,进行碰撞检测7. 优…...

以太坊数据开发-Web3.py-安装连接以太坊数据

Web3.py是连接以太坊的python库,它的API从web3.js中派生而来。如果你用过web3.js,你会对它的API很熟悉。但惭愧的是,作为一个以太坊上Dapp的开发者,我几乎没有直接使用过web3.js,也没有看过它的API。 官网&#xff1a…...

【触摸屏功能测试】MQTT_STD本地调试说明-测试记录

1、MQTT简介 MQTT是一种基于发布/订阅模式的“轻量级”通讯协议。它是针对受限的、低带宽的、高延迟的、网络不可靠的环境下的网络通讯设备设计的。 发布是指客户端将消息传递给服务器,订阅是指客户端接收服务器推送的消息。每个消息有一个主题,包含若干…...

六十分之十三——黎明前

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地,对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.吴军系列硅谷来信1听书、香帅的北大金融…...

坪山网站建设哪家效益快/深圳百度总部

1 概述目前,火电机组正向着大容量、高参数的方向发展,其运行安全性和经济性在一定程度上依赖于运行控制水平的高低,因此对运行人员的熟练操作及处理事故的能力有了更高的要求,同时随着机组的自动化控制水平的提高,运行…...

做西点网站/社群运营的经典案例

1 制定目的按照项目组所有成员的贡献度,为“项目阶段奖金”的合理分配提供依据。2 奖金池金额及其运作方法奖金总额按月度发放,月奖金总额为:;根据项目运作的进度及客户反馈进行评估,奖罚并施;细则如下。2.…...

有做网站代理运营的吗/品牌咨询

我们的疑问是:iPad充电器可以给iPhone充电吗,iPad充电器不能为iPhone充电吗?使用iPad给iPhone充电的危害?用iPhone充电器会损害iPad吗?iPad充电器可以给iPhone快充吗?iPhone用iPad充电器是不是可以的呢&…...

2008 iis 配置 asp网站/网站建设需要多少钱

本人在开发机器软件的时候,以为一个工程生成一个文件,其他的文件不影响。所以在生成目录不同的时候,会造成只拷贝单个文件程序运行不正常的现象。 描述如下:有一个WPF工程A,引用了3个动态库B.C.D,编译时输出…...

郯城做网站/资源网

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>> 真实场景篡改图像检测挑战赛 比赛链接传送门 PaddleSeg传送门 背景 目前各类社交平台中视频、图像、文本内容的截图内容恶意篡改的情况日益加剧,截屏图像的原始性和…...

网站怎样做银联支付/如何注册域名网站

网易云音乐常用API浅析 转载于:https://www.cnblogs.com/goodboy-heyang/p/5170190.html...