代码之家  ›  专栏  ›  技术社区  ›  XwipeoutX

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

  •  1
  • XwipeoutX  · 技术社区  · 16 年前

    我正在编写一个GPGPU流体模拟,它使用C++/OpenGL/CG运行。目前,库要求用户指定一个到明暗器的路径,然后从中读取该路径。

    我发现在我自己的项目和测试中必须指定这一点非常令人恼火,所以我想使着色内容与其他内容链接在一起。

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

    为了让事情稍微更烦人,我有一个“utils”明暗器文件,其中包含在事物之间共享的函数(例如将3D纹理坐标转换为二维地图集等效物)。

    如果可能的话,我想要一个跨平台的解决方案,但这没什么大不了的,因为它目前只适用于Windows。我的搜索结果才真正出现 objcopy 对于Linux,但是在Windows中使用它并不理想。

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

    1 回复  |  直到 16 年前
        1
  •  0
  •   Timmmm    16 年前

    你的意思是你想让着色程序作为字符串嵌入到你的二进制文件中?我不知道有什么跨平台工具/库可以做到这一点,这并不奇怪,因为二进制文件将是不同的格式。

    对于Windows,您似乎希望将它们存储为 string resource . 然后可以使用 LoadString() . Here's how to add them ,但看起来您不能将它们链接到文件。

    一个特别简单但跨平台的解决方案可能是编写一个脚本,将您的着色器转换为头中的字符串常量。然后你就可以 #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" 您的代码。

    非常简单,但我看不出它为什么不起作用(除了字符串文字的长度/空间限制)。

    更新:随着G++ 4.5的发布,它支持C++ 0x原始字符串文字。这些可以包含新行 4 . 我没有测试过,但是你应该可以这样做:

    const char[] MY_SHADER = R"qazwsx[
    #include "my_shader.c"
    ]qazwsx";
    

    不过我还没有测试过。