directx - 如果我使用顶点着色器对对象进行所有操作,那么常量缓冲区可以为空吗?
问题描述
程序周期为
Update();
UpdatePipeline();
在Update()
每个对象的常量缓冲区中,经过转换后,将此对象世界矩阵复制到 GPU 上传堆。在 中UpdatePipeline()
,除其他外,还调用了已安装的着色器。因为我们使用 CPU 进行所有矩阵变换,顶点着色器只返回位置,对吗?如果是 - 性能会提高吗?
现在我想使用 GPU 进行所有转换,即通过顶点着色器。这意味着Update()
我应该memcpy()
用一个空的常量缓冲区作为源来调用吗?
解决方案
- 常量缓冲区只是将数据从 CPU 移动到 GPU 的缓冲区。无论您使用一个,还是使用多少,以及您使用它们的目的,都取决于您。
- 常量缓冲区最常见和最简单的用例是将变换矩阵移动到 GPU。该矩阵确实是由 CPU 计算的,顶点着色器使用该矩阵将顶点缓冲区中的位置从本地空间转换为屏幕空间。这允许 CPU 在不需要更新(通常相当大的)顶点缓冲区的情况下移动对象。
- 性能是否提高取决于您的硬件、您的代码,以及最重要的是您将性能与什么进行比较。由于我不知道您当前的代码,也不知道您打算做什么确切的更改,我什至无法猜测它是否会增加。
- 此外,即使我不知道您的代码,只是按照您提出问题的方式,我会假设您绝对不想使用常量缓冲区作为CPU 上任何操作的源。
推荐阅读
- python - 试图找到具有最大第一个元素的数组?
- sql - 为过程 PLSQL 创建自己的异常
- c# - 在 C# 中更新矩阵类实例的值
- javascript - 在 React 中为视频元素设置音量
- python - Seaborn 分裂小提琴情节未正确分裂
- python - 具有多个特征的递归神经网络中的错误
- javascript - 即使我使用的是 :not 选择器,也会触发事件侦听器
- c# - BigInteger 上的十六进制
- ios - 初始化程序 'init(_:)' 要求 '(UITextRange) -> String?' 符合 'BinaryInteger'
- reactjs - Typescript中泛型格式的歧义