さらに、事前定義されたgl_FragColorがあります。
これから始めましょう。いいえ、事前定義されたはありませんgl_FragColor
。これはコアOpenGL3.1以降から削除されました。互換性を使用している場合を除いて(この場合、3.30シェーダーは#version 330 compatibility
上部に表示されます)、これを使用しないでください。
ここで、ユーザー定義のフラグメントシェーダー出力に戻ります。しかし、最初に、簡単な例えです。
頂点シェーダーで入力があることを覚えていますか?そして、これらの入力は、頂点属性のインデックス、あなたがに渡す番号を表すglVertexAttribPointer
とglEnableVertexAttribArray
などとは?どの入力がどの属性からプルするかを設定します。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
。
明示的な割り当てを行わない場合、実装は通常、出力変数の1つを場所0に割り当てます。ただし、OpenGL標準では必要ありません。あなたはどちらかそれに依存するべきではありませんので、この動作を。
公平を期すために、異なる出力位置を取得しなかった2つの出力を使用した場合、プログラムはリンクに失敗するはずです。おそらく起こったことは、あなたのコンパイラがあなたが書き出さなかったものを最適化したことでした、それでリンカーエラーをチェックする時が来たときそれはちょっとそれを忘れていました。