2010-03-21 61 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