編集:これはスタックオーバーフローからの質問の複製です: 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標準はこの動作を必要としないため、これにも依存しないでください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です