質問
GLSL 1.40明細書を読んだ:
フラグメントの出力は、唯一のフロートすることができ、 署名された浮動小数点のベクトル、または 符号なし整数または整数ベクトル、 または任意のこれらの配列。行列と 構造は出力できません。断片 出力は、のように宣言されています 例を次に示します。
FragmentColor vec4アウト。 アウトUINT光度;
フラグメントの色がgl_FragColorを書いて定義されている...それは正しいでしょうか?誰かがこれらの出力についての私の考えをクリアするだろうか?私は、フラグメントの色を決定するために例の唯一の「FragmentColor」を書くことはできますか?私は(例えば「明度」)それらを読み返すことはできますか?
解決
あなたの例では、2つの出力を有しています。彼らは、GLSLプログラムのリンク後に関連したFBOスロットに対応しています。あなたはglBindFragDataLocation
を使用してそれらをリダイレクトすることができます。
、それはすべてglDrawBuffers
によって設定されたドローマスクに依存します。たとえば、場合は、色の添付ファイル2に行くだろうGL_COLOR_ATTACHMENT0
とそこGL_COLOR_ATTACHMENT2
、0が添付ファイル0に行きますその出力インデックスを意味するだろう、と出力インデックス1を通過します。
他のヒント
グローバル出力変数gl_FragColorはGLSLバージョン120の後に推奨されていません。 今、あなたはあなたの例のように、自分でそれを名前とタイプを与える必要があります。 複数の出力については、 このリンクはあなたのマッピングに関する情報を提供します: http://www.opengl.org/wiki/GLSL_Objects# Program_linkingする
(そして、私はその時リンクが見つかりました:のhttp:// WWWを。 opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999する)
この情報がお役に立てば幸い! :D
をメールで送信私はkvarkは、関連する情報を与えていることがわかります。とにかく、多分あなたはあまりにも私のテキストから何かを得た。の
私はいくつかの例を与えたいます:
void add(in float a, in float b, out float c)
{
//you can not use c here. only set value
//changing values of a and b does not change anything.
c = a + b;
}
void getColor(out float r, out float g, out float b)
{
//you can not use r, g, b here. only set value
r = gl_FragColor.r;
g = gl_FragColor.g;
b = gl_FragColor.b;
}
void amplify(inout vec4 pixelColor, in value)
{
//inout is like a reference
pixelColor = pixelColor * value;
}