加载和使用HLSL着色器?

| 我到处都在寻找,我所能找到的都是有关编写着色器的教程。他们都没有向我展示如何将它们整合到我的场景中。 所以本质上: 给定hlsl着色器,如果我要使用一个名为drawTexturedQuad()的函数,并且希望将该着色器应用于结果,我该怎么做呢? 谢谢     
已邀请:
        ID3DXEffect提供
Begin()
BeginPass()
方法。在此期间只需致电
drawQuad()
。有关着色器的任何基础教程都应显示此类示例。 只是一个补充说明-如果有疑问,请询问MSDN。     
        答案非常复杂,并且随着GPU硬件变得越来越强大而变得越来越困难。 D3DX FX系统是所有需要完成的工作的一个示例,因此使用它是使工作在短期内可以正常使用的好步骤。 着色器是代码,但是它们位于CPU的另一台计算机上,因此需要将所有数据整理在一起。固定部分:基本的渲染状态,例如深度状态,模具状态,混合模式,绘制命令;非常容易实现。困难的部分是为可编程部分搭建桥梁:着色器,缓冲区,采样器和纹理。 索引缓冲区可以正常工作,因为在呈现未索引的几何图形时只能有一个,也可能只有一个。 顶点缓冲区或多或少相当容易处理,因为可以对硬件进行编程以按程序读取顶点缓冲区。您的顶点缓冲区仅需要提供至少与顶点着色器要访问的信息一样多的信息。修改着色器的顶点输入,或需要同时编辑两侧的顶点格式,因此相当容易使用。 采样器和纹理是较难处理的下一个“更轻松”的部分:它们具有变量名和相当固定的类型。例如,在编译着色器\'foo \',纹理\'myNormalMap \'时,为其分配了纹理插槽3。您需要(通过反射API)查找分配了纹理的插槽,并设置引擎考虑的纹理\'myNormalMap \'在运行时位于插槽3中,当然还使用API​​确定是否首先需要纹理。在这里,开始对着色器变量使用命名约定就变得很重要,因此可以使多个着色器与同一C ++代码兼容。 常量缓冲区(或D3D9中的原始着色器常量)非常棘手,尤其是在可编程着色器框架(例如您可以在虚幻引擎中找到的)中。任何给定的着色器使用的常量都是完整列表的子集,但通常必须将C ++编写为好像需要所有常量一样。再次需要反射API来确定着色器中实际引用的变量,以及它们的位置。这在D3D10中变得更易于管理,因为cbuffers是结构且流动性比D3D9系统要小得多,后者受寄存器数量的严重限制,但是它也增加了使用反射API确定cbuffer顺序的步骤。绑定(以及哪些cbuffer本身也被引用)。 最后,有一种设计可以使其全部工作: 创建一个驱动特定着色器原型的类。对于此类的每个变量,此类都将其暴露给着色器(例如纹理,常量缓冲区等),如果使用了反射信息,则在反射信息中查找,并找出其位置并进行设置。保持这种快速,灵活和可扩展性是一个艰巨的挑战。     

要回复问题请先登录注册