fxc.exe 生成的已编译像素和顶点着色器对象文件的格式是否正式或非正式地记录在任何地方?
我希望能够读取常量名称以从着色器文件中注册分配。我知道 D3DX 中的效果框架可以做到这一点,但我需要避免使用 D3DX,因为它可能没有安装在用户的机器上,而且我不需要它来做其他任何事情,所以我想避免他们不得不运行 directx 更新.
如果效果框架可以做到这一点,那么如果我可以找出文件格式但我似乎无法在任何地方找到它的文档,我也可以做到。
(这是用于directx9)
fxc.exe 生成的已编译像素和顶点着色器对象文件的格式是否正式或非正式地记录在任何地方?
我希望能够读取常量名称以从着色器文件中注册分配。我知道 D3DX 中的效果框架可以做到这一点,但我需要避免使用 D3DX,因为它可能没有安装在用户的机器上,而且我不需要它来做其他任何事情,所以我想避免他们不得不运行 directx 更新.
如果效果框架可以做到这一点,那么如果我可以找出文件格式但我似乎无法在任何地方找到它的文档,我也可以做到。
(这是用于directx9)
来自 MSDN:
着色器二进制格式
着色器指令流的按位布局在 D3d9types.h 中定义。如果您想设计自己的着色器编译器或构造工具,并且想了解有关着色器令牌流的更多信息,请参阅 Direct3D 9 驱动程序开发工具包 (DDK)。
因此,您可以查看“D3d9type.h”并尝试以这种方式弄清楚(快速浏览并可以看到您应该需要的枚举/类型,但看不到它的结构),或者下载 DDK 并阅读官方文档。
可以在此处找到更多信息:Direct3D 着色器代码(展开屏幕左侧的树以获取所有信息)。
Microsoft 故意将这些信息远离您。当您使用 DirectX 9 时,它相对容易对格式进行反向工程。如果您编写一个简单的着色器程序集,您可以查看他在另一端返回的编译代码是什么。通过对汇编程序进行修改,您可以看到它们的字节码是如何变化的。您将开始看到寄存器处理方式和指令编码位置的模式。因此,您可以缓慢而可靠地计算出字节码。不过也不会太快!
Microsoft 已在此处在线发布格式规范:Direct3D 着色器代码。
但是,它通过名称引用常量(例如D3DSIO_DCL
),因此您可能仍然需要 Windows DDK 才能使用它。