2014-02-09 81 views
0

我做了一个使用DirectX和C++的精灵渲染器,我想把它放到一个.lib文件中。可以将HLSL以某种方式放入.lib中吗?

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

,我想出了是把它们转化项目为字符串,然后在运行时编译它们,但是这不是很方便的解决方案......

回答

1

如何创建一个C或C++文件以2个全局数组无符号字符,并声明每个着色器文件的大小。然后用像对它们进行初始化:

// 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] = "[email protected]%**ssqw"; 

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

您的图书馆将包含其中的着色器。如果您将这个小工具编写为控制台应用程序,那么您可以在构建后步骤中调用它以在库中执行此“注入”。

+0

这是我想到的唯一的事情。这在我看来有点难看,但我想它必须这样做! 我喜欢你的想法与十六进制编辑 – Semicolon

+0

事实上,它实际上是一个黑客:P。然而,它提供了一种将任何类型的资源合并到二进制文件中的独立便携式(具有资格)方式。 – DNT

0

您使用的是什么版本的Visual Studio? VS2012允许您将文件编译成.hlsl .cso,此时您可以链接到你的可执行文件数据,或者诸如此类的东西:

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

+0

更容易将它们编译为头文件,只是#include它们,我发现。 –

+0

也有。无论哪种方式,VS2012都可以创建.cso文件,而不必仅在运行时编译,而且如何将这些.csos文件导入到您的可执行文件中是您的业务。 :) –

相关问题