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