拥有 XNA 背景后,我尝试创建一个简单的 DirectX11 应用程序。现在我尝试弄清楚如何设置着色器常量,例如投影矩阵等。我正在阅读有关常量缓冲区的内容 - 但是没有简单的方法可以在渲染之前设置一些常量,而不使用缓冲区?
2 回答
我走了同样的路,这也是我一直在努力解决的问题。自 DirectX10 以来,界面发生了很多变化,允许进行更全面的控制。
迟早你会习惯缓冲区并发现它们实际上非常整洁。
以下是一些优点和提示:
现在有一种将顶点、索引和常量数据绑定到管道的统一方式,即
Buffer
类。常量封装在寄存器中,每个寄存器最多保存四个 32 位组件。
由于您可以将多个常量缓冲区绑定到单个阶段,因此建议您按更新频率分隔常量。例如,视图和投影矩阵通常每帧更新一次,而世界矩阵会随着每个网格而改变。为了获得最佳性能,您将创建两个缓冲区,一个包含每帧数据,另一个包含每个网格数据。
最后,常量缓冲区的限制:
每个常量缓冲区最多可以容纳 4096 个向量;每个向量最多包含四个 32 位值。每个流水线阶段最多可以绑定 14 个常量缓冲区(保留 2 个额外的插槽供内部使用)。
在 DirectX11 中,您为着色器设置常量缓冲区。一次不能只设置一个常数。您一次只能设置整个缓冲区。要么使用常量缓冲区,要么查看 Effects11 框架,这将使您更容易使用 API 来处理着色器常量(类似于 D3D9 效果)。
这是创建常量缓冲区并将其应用于顶点着色器的示例:http: //msdn.microsoft.com/en-us/library/ff476896.aspx