2015-10-15 29 views
5

これは哲学的な質問のようなものです。シェーダコードはどこに保存する必要がありますか?

標準的なQtCreatorプロジェクトにシェーダコードを含めるためのエレガントな方法があるかどうかは疑問でした。私が知っている唯一の2つの方法は以下の通りです。

  1. シェーダコードは、別のファイルにあります。 "fragmentshader.frag"、このファイルは実行時に読み込まれ、シェーダコードがコンパイルされ、リンクされます。

  2. シェーダコードは、プロジェクトに含まれるソースファイルの1つにハードコードされた文字列です。

どちらの方法も私にとっては迷惑に見えます。最初の可能性は、実行可能ファイルと同じディレクトリになければならないハードドライブ上のファイルを必要とします(したがって、それらを各デバッグ/リリースディレクトリに入れて、シェーダファイルのいくつかの複製で終わらせる必要があります)私のドライブ上のディレクトリ、移植性に悪いようです。

\nのようなものをシェーダコードに含める必要があるため、2番目の可能性があります。これはフォーマットの種類が醜いものにします。

これを行うには「正しい」方法はありますか?それが重要であれば、私はc/C++、OpenGL、およびGLSLでコーディングしています。

編集: 私はこのことについてGoogleで続けました...たとえば、アイコンファイルをプロジェクトの特別なリソースフォルダに保存することができます。これはファイルであり、そのように編集することができますが、実行時にはロードされません。シェイダーでそれを行う方法はありますか?

答えて

5

もう一つは、あなたが持っている場合は、生の文字列リテラルを使用しているC++ 11:

const char shaderSource[] = R"glsl(
#version 450 core 

...  

void main() { 
    ... 
} 
)glsl"; 

光景:)

+0

これはinteristingさんの\n!私は間違いなくそれを試みます! –

+0

すべての行頭に '' 'を追加する必要がありますか?ちょうど私のproファイルがC++ 11を使ってchar配列の中に設定されていれば、Enterを押すと自動的に引用符が付けられます。 –

+0

これは 'glsl()'と各行の前後に引用符がついていなくても動作しました –

1

私はそれが適切な答えではないと感じますが、コメントには長すぎます。

大まかに言えば、シェーダをコンパイル時に使用でき、ハードコード化されているか、実行時にロードされているかのどちらかです。私はあなたがこれを達成することができる様々な方法を詳しく説明します。上記のすべては、プログラムが実行する必要のある他の種類のデータリソースにも適用できます。

ハードコーディングは、リソースを別々のファイルに保存してください。ただし、は、ハードコードされたリソースを持つソースファイルを自動的に生成します(スタティックまたはダイナミックアレイstd::uint8_tまたはcharなど)を生成し、生成したファイルをプログラムにコンパイルします。ここではおそらく、バイナリデータからC++ソースファイルを生成するユーティリティが必要になるでしょう。私はこのような優れた特集番組を知らない。私が必要なときには、とてもシンプルなので、私は自分自身で書きました。

ランタイムロードの移植性を高めるために、あなたはオプションの負荷を使用することができますが、最も重要なのは、ファイル・システム上のリソースの場所が設定可能にするようです。実行時またはコンパイル時に、それはあなた次第です。これはコンパイルフラグ(f。マクロRUNTIME_RESOURCE_PATH、ビルドシステムによって設定されます)です。適切なデフォルト値を持つコマンドラインオプションにすることができます。

私は道がrightされている何の答えを持っていません。ユースケースを考慮して1つを選択する必要があります。

ハードコーディングされたデータを別ファイル内のリソースは、ユーザーによる変更を含め、プログラム自体に触れずにそれらを更新することができますしながら、展開(少ないファイル、あまり明確なIO、以下のエラー)を簡素化します。あなたが行うことができます

関連する問題