我试着做空 - 我现在正在使用directx 11 2D并创建绘制几何图元的功能,如矩形,线条,文本输出,包括不同重载的圆圈,如填充颜色等等 - 我有1个常量缓冲区包含世界和投影矩阵,1个颜色XMFLOAT4用于原始颜色,FLOAT变量用于透明度。工作得很好,直到我创建了一个有2种颜色的圆圈 - 边框和文件。我的第一个想法是创建第二个常量缓冲区,添加第二个颜色并删除透明度索引,因为我不计划填充圆。但是它增加了更多的常量缓冲区旋转和更新,我的意思是在我为所有着色器只有一个主常量缓冲区之前,但现在我需要在每个原始调用中改变它们。另外我在nvidia读到,增加恒定缓冲量会影响性能,但是我的知识还不足以形成一个好的决策 - 我应该为所有基元(矩阵,颜色,透明度,其他任何东西)都有通用的常量缓冲区。稍后补充)并且像以前一样更新它并且这是一个很好的举动,或者我需要为不同的着色器保留具有不同数据的单独缓冲区?我看到着色器的例子,例如,矩阵常量缓冲区和灯常量缓冲区被分开,这就是为什么我感到有点困惑。总结一下:是一个大的常量缓冲区,所有预期的数据比一些分离的数据更好,被用于evey交换调用?谢谢你,这不是很短暂。)
答案 0 :(得分:0)
回到Direct3D 9,有一个着色器常量块。通常,如果您更新了块的任何部分,则必须将所有数据重新发送到GPU。
对于Direct3D 10,创建了常量缓冲区的概念来解决此问题。建议是使用多个常量缓冲区并按“更新频率”进行组织。查看令人尊敬的演示文稿Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games。早期Direct3D 10游戏中的许多初始性能问题都是试图使用一个大的常量缓冲区。
此建议仍适用于Direct3D 11.对于Windows 8或更高版本,驱动程序可能会也可能不会实现可选功能“常量缓冲区偏移”和“常量缓冲区部分更新”。