編集:これはスタックオーバーフローからの質問の複製です: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel
頂点シェーダーからフラグメントシェーダーに値を送信する場合、頂点シェーダーは1つの変数をout
として宣言し、フラグメントシェーダーは他の変数を次のように宣言する必要があります。 in
であり、両方の変数の名前とタイプは同じである必要があります。ただし、フラグメントシェーダーからカラー値を送信する場合、これは発生しません。実際、必要に応じて出力変数を呼び出すことができます。なぜですか?古いバージョンでは、gl_FragColor
プログラムは出力フラグメント変数をgl_FragColorとどのようにリンクしますか?
コメント
- クロスサイトの重複とそれらが問題であるかどうかについてのメタに関する議論
- 追加の質問がある場合は、既存の質問に編集するのではなく、新しい質問として投稿してください。個別の質問に対する回答を個別に比較する方法。質問が関連している場合は、質問間にリンクを含めることができます。
回答
頂点シェーダー入力とほぼ同じように機能します。
頂点シェーダーには入力があります。これらの入力は、頂点属性インデックス、つまりおよび
など。どの入力がどの属性からプルするかを設定します。 GLSL 3.30では、次の構文を使用します。
layout(location = 2) in color;
これにより、color
頂点シェーダー入力が属性から取得されるように設定されます。場所2.3.30より前(またはARB_explicit_attrib_locationなし)では、前に glBindAttrbLocation
を使用して明示的に設定する必要があります。 glGetAttribLocation
を使用して、プログラムに属性インデックスをリンクまたはクエリします。属性の場所を明示的に指定しない場合、GLSLは場所を任意に割り当てます(つまり、実装で定義された方法で)。
シェーダーでの設定はほとんどの場合です。
いずれの場合も、フラグメントシェーダーの出力はほぼ同じように機能します。フラグメントシェーダーは複数の出力カラーに書き込むことができます。これ自体がフレームバッファ内の複数のバッファにマップされます。したがって、どの出力がどのフラグメント出力カラーに送られるかを示す必要があります。
これプロセスはフラグメントの出力場所の値から始まります。これは、頂点シェーダーの入力場所と非常によく似て設定されます。
layout(location = 1) out secColor;
API関数 glBindFragDataLocation
および glGetFragDataLocation
、これはglBindAttribLocation
およびglGetAttribLocation
に類似しています。
明示的な支援を行わない場合gnments、実装は通常、出力変数の1つを場所0に割り当てます。ただし、OpenGL標準はこの動作を必要としないため、これにも依存しないでください。