我能以某种方式将HLSL放入.lib吗?

时间:2014-02-09 12:18:24

标签: c++ static-libraries hlsl

我使用DirectX和C ++创建了一个sprite渲染器,我想把它放到一个.lib文件中。

是否有可能以某种方式将两个(已编译的)着色器放入.lib中,以便我不必将它们包含在任何地方?现在我在运行时从磁盘读取它们当然意味着我必须将两个.cso文件放在某处以便可以读取它们。

我提出的解决方案是将它们作为字符串放入项目中,然后在运行时编译它们,但那不方便......

2 个答案:

答案 0 :(得分:1)

如何使用2个全局无符号字符数组创建C或C ++文件,并声明每个具有一个着色器文件的大小。然后用类似的东西初始化它们:

// let it start with a signature string not found anywhere else in the .obj file
// EXTRA is some extra bytes to account for alignment
unsigned char Shader1[SIZE_OF_SHADER_1+EXTRA] = "x2232323$$%**sswe";
unsigned char Shader2[SIZE_OF_SHADER_2+EXTRA] = "x2952378$@%**ssqw";

然后,在您的代码中使用这些数组,就好像它们实际上包含着色器的代码一样。 最后,在将它们编译成lib之后,使用十六进制编辑器查找起始字符串,并在其中粘贴整个着色器内容。如果找不到合适的十六进制编辑器,可以轻松编写一个小实用程序来读取文件,在另一个文件中找到签名字符串,然后将其读取的文件内容写入第二个签名位置。

然后,您的库中将包含着色器。如果您将此小实用程序编写为控制台应用程序,则可以在构建后步骤中调用它以在库中执行此“注入”。

答案 1 :(得分:0)

您使用的是哪个版本的Visual Studio? VS2012允许您将.hlsl文件编译为.cso,此时您可以将其作为数据或其他内容链接到您的可执行文件中:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb509633(v=vs.85).aspx