2011-06-10 90 views
3

我一直在寻找无处不在,我可以找到的所有关于着色器的教程。他们没有向我展示如何将它们融入我的场景。加载和使用HLSL着色器?

所以基本上:

给定一个HLSL着色,如果我有一个名为drawTexturedQuad()函数,我想着色器被应用到的结果,到底我怎么能做到这一点?

感谢

回答

3

ID3DXEffect提供Begin()BeginPass()方法。在此期间,请致电drawQuad()。任何有关着色器的基本教程都应该显示这样的示例。

只是附加注释 - 如有疑问,请询问MSDN

1

这个问题的答案非常复杂,而且越来越困难,因为GPU硬件越来越强大。 D3DX FX系统是需要完成的所有工作的一个例子,所以使用这个工具是为短期使用而工作的一个很好的步骤。

着色器是代码,但它们位于CPU的另一台机器上,因此需要整理其所有数据。固定部分:基本渲染状态,如深度状态,模板状态,混合模式,绘图命令;非常容易实现。困难的部分是为可编程部件搭建桥梁:着色器,缓冲区,采样器和纹理。

索引缓冲区正常工作,因为在渲染未索引的几何体的情况下,只能有一个,或者没有。

顶点缓冲区或多或少相当容易处理,因为硬件可以被编程为程序性地读取顶点缓冲区。您的顶点缓冲区只需提供至少与顶点着色器想要访问的信息相同的信息。修改着色器的顶点输入,或者需要同时编辑双方的顶点格式,所以相当容易处理。

取样器和纹理是硬件的下一个'更容易',它们有一个变量名称和一个相当刚性的类型。例如,在编译着色器'foo',纹理'myNormalMap'时,会分配纹理槽3.您需要查看(通过反射API)纹理分配到哪个槽,并将引擎认为是'myNormalMap'的纹理设置为在运行时插入到插槽3中,当然也可以使用API​​确定是否首先需要纹理。这是开始为着色器变量命名约定开始关注的地方,因此可以使多个着色器与相同的C++代码兼容。

常量缓冲区(或D3D9中的原始着色器常量)非常复杂,特别是在像Unreal这样的引擎中可以找到可编程着色器框架时。任何给定着色器使用的常量都是完整列表的一个子集,但通常必须将C++端写入,就好像它们都是需要的。需要再次使用反射API来确定哪些变量实际上在着色器中被引用,以及它们的位置。这在D3D10中变得更容易管理,因为cbuffers是结构体而且比D3D9系统更加流畅,而这个系统受寄存器数量的严格限制,但它也增加了也需要使用反射API来确定cbuffer的顺序的步骤绑定(以及哪些缓冲区本身也被引用)。

到底有一个设计,使这一切工作:

使驱动特定着色器原型的类。对于这个类暴露给着色器(无论是纹理,常量缓冲区等)的每个变量,在反射信息中查找是否使用了它,并找出它的位置并进行设置。保持这种快速,灵活和可扩展性是一项艰巨的挑战。

+0

“,但它也增加了也需要使用反射API来确定cbuffer绑定顺序(以及哪些cbuffers本身也被引用)的步骤。” - 为什么不使用相关的缓冲区偏移量,例如,如果您已经使用相关的t0,t1等加载了ShaderResourceView,则会按照您将资源设置为着色器的顺序引用它们。 – Jay 2011-06-28 10:01:52