首页 > 解决方案 > 如果我使用顶点着色器对对象进行所有操作,那么常量缓冲区可以为空吗?

问题描述

程序周期为

Update();
UpdatePipeline();

Update()每个对象的常量缓冲区中,经过转换后,将此对象世界矩阵复制到 GPU 上传堆。在 中UpdatePipeline(),除其他外,还调用了已安装的着色器。因为我们使用 CPU 进行所有矩阵变换,顶点着色器只返回位置,对吗?如果是 - 性能会提高吗?

现在我想使用 GPU 进行所有转换,即通过顶点着色器。这意味着Update()我应该memcpy()用一个空的常量缓冲区作为源来调用吗?

标签: directxhlslvertex-shader

解决方案


  1. 常量缓冲区只是将数据从 CPU 移动到 GPU 的缓冲区。无论您使用一个,还是使用多少,以及您使用它们的目的,都取决于您。
  2. 常量缓冲区最常见和最简单的用例是将变换矩阵移动到 GPU。该矩阵确实是由 CPU 计算的,顶点着色器使用该矩阵将顶点缓冲区中的位置从本地空间转换为屏幕空间。这允许 CPU 在不需要更新(通常相当大的)顶点缓冲区的情况下移动对象。
  3. 性能是否提高取决于您的硬件、您的代码,以及最重要的是您将性能与什么进行比较。由于我不知道您当前的代码,也不知道您打算做什么确切的更改,我什至无法猜测它是否会增加。
  4. 此外,即使我不知道您的代码,只是按照您提出问题的方式,我会假设您绝对不想使用常量缓冲区作为CPU 上任何操作的源。

推荐阅读