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