23

GLSL には完全な C スタイルのプリプロセッサがあります。機能しないのは #include だけです。優れた機能の 1 つは、#ifdef を使用して関数をコメント アウトし、特定の機能が使用されていない場合に間引くことができる 1 つのシェーダーを作成できることです。

私の質問は:

C コードからマクロを定義する方法はありますか?

openGL インターフェイスでそれを行う方法はないようです。簡単なハックは、コードがフォーム ファイルをロードする前に #define FOO を数行追加することです。しかし、それは一種の後退のようです。

4

2 に答える 2

25

ロードしたコードの先頭に追加する必要はありません。そのため、glShaderSourceARB API には複数の文字列があります。

次のようなものは、あなたが探していることを行います:

char *sources[2] = { "#define FOO\n", sourceFromFile };
glShaderSourceARB(shader, 2, sources, NULL);
于 2010-03-04T10:53:56.277 に答える
7

#versionトラブルを回避するために私が使用しているものは次のとおりです。これは Java であり、perfo 用に最適化されていませんが、完全に機能します。

// extract shader sourcecode from file
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url);

// apply defined values
int versionIndex = shaderSource.indexOf("#version");
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name());
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1;

for (int i = defined.size() - 1; i >= 0; --i)
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n");
于 2013-10-23T12:21:12.690 に答える