多个包含简单数据的常量缓冲区 DirectX 11

More then one constant buffer containing simple data, DirectX 11

本文关键字:常量 缓冲区 DirectX 数据 包含 简单      更新时间:2023-10-16

>我尽量简短 - 我现在正在使用 directx 11 2D 并创建绘制几何基元的功能,如矩形、线条、文本输出、圆圈,包括不同的重载,如填充颜色等 - 我有 1 个包含世界和投影矩阵的常量缓冲区,1 个用于原始颜色的颜色XMFLOAT4和一个用于透明度的 FLOAT 变量。工作得很好,直到我创建了一个带有 2 种颜色的圆圈 - 边框和文件。我的第一个想法是创建第二个常量缓冲区,在那里添加第二个颜色并删除透明度索引,因为我不计划它用于填充圆。但是它增加了更多的常量缓冲区旋转和更新,我的意思是以前我只有 1 个用于所有着色器的主常量缓冲区,但现在我需要在每次原始调用中改变它们。此外,我在 nvidia 读到增加常量缓冲区量会影响性能,但我的知识不足以得出一个好的结论 - 我是否应该为所有基元(矩阵、两种颜色、透明度、以后添加的任何其他内容)提供通用常量缓冲区并像以前一样更新它,这是一个很好的举措, 或者我需要为单独的着色器保留具有不同数据的单独缓冲区?我看到了着色器的例子,例如,矩阵常量缓冲区和光源常量缓冲区是分开的,这就是为什么我感到有点困惑。总而言之:一个包含所有预期数据的常量缓冲区是否比一些分离的数据更好,用于交换调用?谢谢,这不是很短的:)

早在 Direct3D 9 中,只有一个着色器常量块。通常,如果您更新了块的任何部分,则必须将所有数据重新发送到 GPU。

对于 Direct3D 10,创建了常量缓冲区的概念来解决此问题。建议是使用多个常量缓冲区并按"更新频率"组织它们。查看古老的演示文稿 Windows to Reality:充分利用游戏中的 Direct3D 10 图形。早期 Direct3D 10 游戏的大部分初始性能问题都是试图只使用一个大的常量缓冲区。

此建议仍然适用于 Direct3D 11。对于 Windows 8 或更高版本,驱动程序可能会也可能不会实现可选功能"常量缓冲区偏移"和"常量缓冲区部分更新"。