2011-08-02 3 views
5

は、include-fileオプションを持っていないファイルは、私が「含まに#pragma」パーサを使用してこれを追加しようとしています。 (私は一度だけ実装したいが、Ken Perlinの滑らかなステップのような多くの異なるシェーダで使用するいくつかの一般的なメソッドを持っているので、これが必要です)のOpenGL/GLSL - サポートするために、複数のソースでglShaderSourceを使用してはGLSL以来

インクルードファイルを取得するためにシェーダファイルを解析すると問題ありません。 しかし、複数のソースファイルを使ってShaderSourceを設定すると、私はいつも問題にぶつかります。私の主なシェーダは通常 "#version 330"で始まり、#バージョンラインは常にシェーダの最初のラインでなければならないので、glShadersourceに渡された文字列の配列の最初のものとしてメインファイルを追加することができますそれはすべてのインクルードファイルです。 しかし、コンパイラは、それは私のメインのファイルが使用している機能を知らないと文句を言いよう、彼らは基本的に後の私のメインのファイルを連結することがありますので、その後、私のメインのファイルは、これらの含まれるファイルで実装任意の機能を使用することはできません。仕事にそれを得るために私は考えることができる

唯一の方法は、再帰的に適用する(ファイルのファイル内容でプラグマ行が含まれることをを交換、メインファイルを読み込むインクルードは、プラグマが含ま解析し、その後、することです他のファイルそのものを含む可能性のあるインクルードされたすべてのファイルと同じ方法ですが)、コンパイルエラーの行番号はもはやメインファイルの実際の行番号と一致しません。

は、誰もが働き、linenumbersを保つGLSLための機能「を含む」のいくつかの並べ替えを設定していますか?もしそうなら - どう?

答えて

2

#versionタグに解析し、この別々の(そして最初の)ソース文字列を作るでしょうか?この方法では、(関数の必要条件に応じて)インクルードに異なるバージョンのタグを持たせ、それらを1つのバージョンタグ(バージョン番号が最も高いもの)だけに減らすこともできます。

+0

あなた、先生は、天才です!なぜ私はそれについて考えなかったのか分かりませんが、これが私のために行く方法になると思います。 \ o/ – Pygmy

1

まず、コンパイラエラーメッセージで報告された現在のソース行を設定し#lineプリプロセッサディレクティブがあります。このプリプロセッサディレクティブを使用すると、外部ソース行を簡単に含めることができます。これはあなたの問題を解決するはずです。

また、私はあなたがサポートする機能「を含める」に支援する必要がありshading_language_include拡張子を、読みました。ドライバが実装していない場合でも、拡張機能が導入する構文をサポートすることができます。拡張機能が必要なシェーダを正常にサポートできます。

-1

あなたのシェーダがファイルにある場合、あなたは、OpenGLに渡す前にそれらを処理(および任意の#include指令を扱う)ために、CPP(またはGCC -E)を使用することができます。あなたもすることができます読んで、あなたのシェーダを前処理するpopen("cpp -P main.glsl", "r")ような何か...

+0

このテクニックは、glslフレームワーク(__VERSION__など)で定義されたプリプロセッサシンボルをセットアップするために必要です。 – Luca

関連する問題