我正在编写一个GPGPU Fluid模拟,它使用C ++ / OpenGL / Cg运行。目前,图书馆要求用户指定着色器的路径,然后将从中读取。
我发现在我自己的项目和测试中必须指定它非常烦人,因此我想将着色器内容与其余内容链接起来。
理想情况下,我的.cg文件仍然可以单独浏览,但是构建后的步骤或预处理器指令会在需要时将其包含在源代码中。
为了让事情变得更加烦人,我有一个“utils”着色器文件,其中包含在事物之间共享的功能(例如将3d纹理坐标转换为等效的2d atlas)。
如果可能的话,我想要一个跨平台的解决方案,但这并不是什么大不了的事,因为它目前仅限于Windows。我的搜索只为linux发现了objcopy
,但是对于windows使用它并不理想。
如果有帮助,该项目可在http://code.google.com/p/fluidic
获得答案 0 :(得分:0)
您的意思是您希望在二进制文件中将着色器嵌入为字符串?我不知道有任何跨平台的工具/库可以做到这一点,这并不奇怪,因为二进制文件将是不同的格式。
对于Windows,听起来您希望将它们存储为string resource。然后,您可以使用LoadString()
读取字符串。 Here's how to add them,但看起来您不能将它们链接到文件。
一个特别hacky但跨平台的解决方案可能是编写一个脚本,将着色器转换为标头中的字符串常量。然后,您可以在代码中#include
。
即。你有文件myshader.shader
,其中包含:
int aFunction(int i, int j)
{
return i/j;
}
您有一个构建步骤,可以创建文件myshader.shader.h
,如下所示:
const char[] MYSHADER_SHADER =
"int aFunction(int i, int j)"
"{"
" return i/j;"
"}";
然后将#include "myshader.shader.h"
添加到您的代码中。
非常hacky,但我认为没有理由为什么它不起作用(除了字符串文字的长度/空间限制)。
更新:随着G ++ 4.5的发布,它支持C ++ 0x原始字符串文字。这些可以包含新行4。我没有测试过,但你应该可以这样做:
const char[] MY_SHADER = R"qazwsx[
#include "my_shader.c"
]qazwsx";
我还没有测试过它。