DirectX11设置着色器常量

时间:2012-03-03 02:21:52

标签: constants hlsl directx-11

拥有XNA背景,我尝试创建一个简单的DirectX11应用程序。现在我试着弄清楚如何设置着色器常量,例如投影矩阵等。我正在阅读有关常量缓冲区的信息 - 但是在渲染之前没有简单的方法来设置一些常量,而不使用缓冲区吗?

2 个答案:

答案 0 :(得分:7)

我采取了同样的道路,这也是我一直在努力的事情。 由于DirectX10对界面进行了很多更改,因此可以进行更全面的控制。

迟早你会习惯缓冲区并发现它们实际上非常整洁。

以下是一些优点和提示:

  • 现在有一种统一的方法可以将顶点,索引和常量数据绑定到管道,即Buffer类。

  • 缓冲区不关心数据的布局。你可以写任何浮点数组合,而不仅仅是矩阵和向量。我通常将float[]中的一个缓冲区的所有常量组合在一起,然后使用循环将其写入流中。

  • 常量被打包在寄存器中,每个寄存器最多可容纳四个32位组件。

  • 您可以pack the constants manually使用packoffset() HLSL功能。您需要考虑some rules

  • 由于您可以将多个常量缓冲区绑定到单个阶段,因此建议separate your constants更新其频率。例如,视图和投影矩阵通常每帧更新一次,而世界矩阵将针对每个网格更改。为获得最佳性能,您将创建两个缓冲区,一个包含每帧数据,另一个包含每个网格数据。

  • 最后,constant buffers的限制:

  

每个常量缓冲区最多可容纳4096个向量;每个向量包含最多四个32位值。每个管道阶段最多可以绑定14个常量缓冲区(另外2个插槽保留供内部使用)。

答案 1 :(得分:4)

在DirectX11中,为着色器设置常量缓冲区。您当时不能只设置一个常量。您可以只设置整个缓冲区。使用常量缓冲区,或者查看Effects11框架,这将使您更容易使用着色器常量的API(类似于D3D9效果)。

这是创建常量缓冲区并将其应用于顶点着色器的示例:http://msdn.microsoft.com/en-us/library/ff476896.aspx