【发布时间】:2014-10-23 22:49:00
【问题描述】:
我正在调用D3DReflect() 来推断编译着色器使用的常量缓冲区的布局,我注意到它们通常包含未使用的变量。
我已经在使用D3DStripShader() 去除调试信息,我想知道在调用D3DReflect() 之前是否有类似的方法可以从常量缓冲区中去除那些未使用的变量?
这通常是一个好习惯吗?
由于这意味着大多数时候每个原始 cbuffer/stage/program 都有一个 cbuffer,我不知道剥离未使用变量的收益是否优于失去更多(更小)cbuffer 的损失?
【问题讨论】:
-
确定没有使用?大多数 GPU 会非常乐意优化任何真正未使用的变量...无论如何我都会保留它们,因为几乎可以肯定,如果它们加载数据一次,就会进行字节对齐和极少的优化...跨度>
-
它们未被使用,因为编译后的代码不读取它们(使用
D3D_SVF_USED检测),但它们仍在 cbuffers 中,我想创建一个没有它们的新粗 cbuffer(或打包原文)。 -
如何编译着色器?
-
我正在使用
D3DCompile()和标志D3DCOMPILE_OPTIMIZATION_LEVEL3。 -
你的常量缓冲区是如何声明的?您可能会看到填充,或者当前编译的着色器未引用某个变量,但同一文件中的不同着色器引用了该变量。我也会非常谨慎地删除常量缓冲区中未使用的变量,因为编译的字节码将向量偏移量引用到该缓冲区中。如果其中一个变量存在于中间,则您刚刚使所有引用您删除的变量之后的任何变量的代码无效。
标签: c++ directx directx-11