2

C ++ / OpenGL/Cgを使用して実行されるGPGPU流体シミュレーションを作成しています。現時点では、ライブラリでは、ユーザーがシェーダーへのパスを指定する必要があります。シェーダーからのパスがシェーダーから読み取られます。

自分のプロジェクトやテストでそれを指定しなければならないのは非常に面倒なので、シェーダーのコンテンツを他のコンテンツとリンクさせたいと思います。

理想的には、私の.cgファイルは引き続き個別に参照できますが、ビルド後の手順またはプリプロセッサディレクティブは、必要に応じてソースに含めます。

物事をもう少し面倒にするために、私は「utils」シェーダーファイルを持っています。これには、物事間で共有される関数が含まれています(3Dテクスチャ座標を2Dアトラスに相当するものに変換するなど)。

可能であればクロスプラットフォームのソリューションが欲しいのですが、現在はWindowsのみであるため、それほど大きな問題ではありません。私の検索は実際にobjcopyはLinuxでしか見られませんでしたが、それをWindowsで使用するのは理想的とは言えません。

それが役立つ場合は、プロジェクトはhttp://code.google.com/p/fluidicで入手できます。

4

1 に答える 1

1

シェーダーを文字列としてバイナリに埋め込むということですか?私はそれを行うためのクロスプラットフォームのツール/ライブラリを知りません。バイナリは異なる形式になるので、それほど驚くことではありません。

Windowsの場合、それらを文字列リソースとして保存したいようです。その後、を使用して文字列を読み取ることができますLoadString()追加する方法は次のとおりですが、ファイルにリンクできるようには見えません。

特にハッキーですがクロスプラットフォームのソリューションは、シェーダーをヘッダーの文字列定数に変換するスクリプトを作成することです。次に、コードでそれを実行でき#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";

私はそれをテストしていません。

于 2010-03-22T12:30:04.213 に答える