在C ++ GPGPU库中嵌入cg着色器

时间:2010-03-21 01:41:23

标签: c++ embed shader cg

我正在编写一个GPGPU Fluid模拟,它使用C ++ / OpenGL / Cg运行。目前,图书馆要求用户指定着色器的路径,然后将从中读取。

我发现在我自己的项目和测试中必须指定它非常烦人,因此我想将着色器内容与其余内容链接起来。

理想情况下,我的.cg文件仍然可以单独浏览,但是构建后的步骤或预处理器指令会在需要时将其包含在源代码中。

为了让事情变得更加烦人,我有一个“utils”着色器文件,其中包含在事物之间共享的功能(例如将3d纹理坐标转换为等效的2d atlas)。

如果可能的话,我想要一个跨平台的解决方案,但这并不是什么大不了的事,因为它目前仅限于Windows。我的搜索只为linux发现了objcopy,但是对于windows使用它并不理想。

如果有帮助,该项目可在http://code.google.com/p/fluidic

获得

1 个答案:

答案 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";

我还没有测试过它。