2010-03-21 46 views
1

我在写一个GPGPU Fluid simulation,它使用C++/OpenGL/Cg运行。目前,该库要求用户指定着色器的路径,然后将其读取。在C++ GPGPU库中嵌入cg shaders

我发现它非常烦人,不得不在我自己的项目和测试中指定,所以我想让着色器内容与其他内容链接。

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

为了让事情变得更加恼人,我有一个“utils”着色器文件,其中包含在各种事物之间共享的函数(如将3d纹理坐标转换为与2D等效图相同的函数)。

如果可能的话,我想要一个跨平台的解决方案,但它并不是什么大事,因为它目前只有Windows。我的搜索只针对linux真的变成了objcopy,但在windows上使用它并不理想。

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

回答

0

你的意思是你想嵌入在你的二进制字符串的着色器?我不知道有任何跨平台的工具/库可以做到这一点,这并不令人惊讶,因为二进制文件将是不同的格式。

对于Windows,您听起来像要将它们存储为string resource。然后您可以使用LoadString()来读取字符串。 Here's how to add them,但它看起来并不像你可以将它们链接到一个文件。

一个特别黑客但是跨平台的解决方案可能是编写一个脚本将标题中的字符串常量转换为字符串常量。那么你可以在你的代码中使用#include

I.e.您有一个包含文件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"; 

我还没有测试过它。

+0

是的,我希望有一个比头文件生成方法更简单的解决方案。 将shaders作为字符串资源是一件非常痛苦的事情,因为我失去了我所有的语法,以及使用'cgc'检查编译错误的能力(当然,没有复制/粘贴到另一个文件中)。 可能不得不接受没有办法做到这一点很好,并与破解。 – XwipeoutX 2010-03-23 13:32:53