web-dev-qa-db-ja.com

GLSLのprintf?

Cでは、次のようなコードをデバッグできます。

fprintf(stderr, "blah: %f", some_var);

gLSLでは...とにかく、頂点またはフラグメントシェーダーの値をダンプするだけですか?遅くてもかまいません。値をダンプしたいだけです。理想的には、次のような設定が必要です。

  • 通常の状態= GLSLシェーダーを通常どおり実行
  • キーを押す 'd' =次のフレームは[〜#〜] ultra [〜#〜]低速モードで生成されます。このモードでは、頂点/フラグメントシェーダーの「printfs」が実行され、ダンプされます。

これは実現可能ですか? (パフォーマンスは気にしません。1つのフレームでこれを実行したいだけです)。

ありがとう!

36
anon

残念ながら、それは直接不可能です。しかし、可能な解決策の1つは、最終的に多くを使用することになります(ただし、GLSL開発者の間ではかなり一般的です)、意図した最終結果の代わりに値を色として「印刷」することです。

もちろん、これには多くの制限があります。 1つは、値が(0,1.0) 範囲。 modfractなどの関数は、これらの場合に役立ちます。しかし、一般的に、これはGLSLで「printf」に相当すると私が見ているものです。

23
UncleZeiv

値を出力する代わりに、GLSLデバッガーを試すことを考えましたか?

たとえば、 glslDevil を使用すると、シェーダーの実行をステップ実行し、各ステップで変数を調べることができます。

21
John Flatness

AMD CodeXLをチェックしてください。フレームごとにステップ実行して、opengl状態の値、シェーダーコード、およびテクスチャーメモリを検査できます。

http://developer.AMD.com/tools-and-sdks/heterogeneous-computing/codexl/

3
Aaron Hagan