2012-01-20 11 views
2

頂点シェーダからジオメトリシェーダに、さらにフラグメントシェーダにvec4とfloatを渡す必要があります。 3つのシェーダはユニークなユニークを維持するために3つの異なるプログラムに属し、3つは、必要に応じてジオメトリシェーダを取り付けたり取り外したりして1つのプログラムパイプラインにまとめられます。プログラムパイプラインシェーダ変数交換

GL_ARB_separate_shader_object拡張子は言う:

GLSLシェーダは、後続の入力変数を変えるに変化する出力変数を接続するための「ランデブー名で」モデルを持っています。個別のシェーダでは、先行するシェーダがユーザー定義の入力可変変数を書き込むかどうかは保証されません。 HLSL9、Cg、およびOpenGLアセンブリ拡張プログラムは、この状況を「APIリソースによるランデブー」モデルによって処理します。 GLSLの用語では、ユーザ定義の可変変数ではなく、組み込みの可変変数によって別々のGLSLシェーダ/必須/通信を意味します。

細かいは、頂点とジオメトリシェーダでIはgl_FogFragCoordとGL_COLOR介し断片でそれらを読み取り、フロートためvec4ためgl_FrontColorを使用し、gl_FogFragCoord。

それはうまく動作しますが、私は.. cmon、本当ですか?

私はこれの背後にある論理的根拠を理解することができますが、実際は私にとっては愚かな回避策のようです。 実際には、異なるプログラムの異なるシェーダがすべて同じプログラムパイプラインで動作する場合、互いに通信する方法はありませんか?

答えて

4

まず最初にこの問題を解決しておきましょう。そこで読んだことは、その拡張機能/コア機能には当てはまりません。以下は、仕様に含まれていないとどうして真実ではないのか、その理由が間違っている理由についての説明です。

拡張仕様を読んだとき、それは次の違いに注意することが重要です:

  • 規範テキスト:これは拡張機能が実際にどのように動作するかを定義します。これはテキストの肉です。
  • 説明文:これは機能が何のためのものであるかについての拘束力のない概説を与える。これは拘束力がないため、実際の規範的なテキストがそれに反して実行される可能性があります。
  • メタテキス​​ト:これは、標準テキストの背後にある理由を説明します。また、ヘッダーとフッターの情報(エクステンションを書いた人、出版された日付など)も表します。

拡張の説明文は、「概要」というセクションで構成されています。

「新しい手順と機能」、「新しいトークン」、および「追加/変更」の各セクションで定義されています。 "

他のすべてはメタテキス​​トです。しかし、特にの「問題」セクション。このセクションでは、仕様で行われた決定の背後にある理由のいくつかについて説明します。あなたが引用したものは「Issues」セクションから来ています。これは拘束力がないため、実際の機能とは無関係です。

ここでは、決定の背後にある理由が間違っている可能性があります。問題セクションは、間違っている拡張機能の内容についてなぜ事実上主張するのですか?

これは、この拡張仕様に関する2つの事実に戻ります。

  1. GL_EXT_separate_shader_objectsという古い拡張子に基づいています。 には、の拡張で、上記のステートメントはtrueでした。分離可能なプログラムでは、ユーザー定義の変数を使用できませんでした。これは、その拡張機能がNVIDIAによって完全に書かれたものであり、実際には、ユーザーのニーズに応えるだけのナンセンスを組み合わせたものです。それは本当の解決策ではなく、より多くのストップ・ギャップでした。

  2. ARBはと驚くほどです。これは、いかに怠惰に構築されたのか、実際は不条理です。たとえば、問題2は、引用された部分がARBバージョンで絶対に間違っていても、verbatumをEXTバージョンからコピーしています。

    他のいくつかの問題を読むことは、精神分裂病の精神分裂病の精神を掘り起こすようなものです。彼らは他の非事実主張をし、すぐに自分自身と矛盾する。それは、ARBの会議や何かにリングサイドの座席を持つようなものです。機能は(ほとんど)上質です。これはジャンク品の拡張仕様そのものです。

私はあなたの欲求不満を理解しています。拡張機能からフィーチャーについて学習する私の一般的な方法は、概要を読み、次に課題にスキップすることです。概要は私にそれが何をすべきかについての良いアイデアを与え、問題セクションは実装がどのように見えるかを私に知らせる。 「仕様言語」を解析する必要はありません。

お客様できませんこの拡張子でこれを行います。問題のセクションは無益なものより悪いです。それは積極的に誤解を招く。仕様言語を読んでください。

+0

ああ、それは本当に興味深いとにかく、いつものように普通のイン/アウトを使ってみましたが、シェイダーはそれを読んでいませんでした(それぞれが 'ゼロ'で表示されます)。または、プログラムパイプラインのシェーダー間でのやりとりに欠けているものがありますか? – user815129

+1

@ user815129:それは新しい質問です。これは「私は動作しないコードを持っています」という質問です。「この仕様はどういう意味ですか?」質問。あなたはその質問をして、シェーダコードだけでなく、シェーダの*読み込み*コードも投稿する必要があります。別々のプログラムでは、読み込み時に特別な処理が必要です。 –

+0

@ user815129:また、何か新しいことを試してみるときは、簡単で実用的な例から始めるべきです。そうすれば、制御された環境でアプリケーションを使用することができます。 –