11

GLSL 1.40 仕様を読む:

フラグメント出力は、float、浮動小数点ベクトル、符号付きまたは符号なしの整数または整数ベクトル、またはこれらの配列のみにすることができます。行列と構造体は出力できません。フラグメント出力は、次の例のように宣言されます。

vec4 FragmentColor を出力します。out uint 光度;

フラグメントの色は、gl_FragColor と記述して定義されています...そうですか? 誰かがこれらの出力に関する私の考えをクリアできますか? フラグメントの色を決める例の「FragmentColor」だけ書いてもいいですか?それらを読み返してもよろしいですか (「光度」など)?

4

3 に答える 3

17

グローバル出力変数 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 が関連情報を提供したようです。とにかく、あなたも私のテキストから何かを得たのかもしれません。

于 2011-07-25T23:23:15.470 に答える
4

あなたの例には2つの出力があります。それらには、GLSL プログラムのリンク後に関連付けられた、対応する FBO スロットがあります。を使用してリダイレクトできますglBindFragDataLocation

シェーダを有効にして FBO をバインドすると、すべては によって設定された描画マスクに依存しglDrawBuffersます。たとえば、GL_COLOR_ATTACHMENT0そこGL_COLOR_ATTACHMENT2に渡した場合、出力インデックス 0 はアタッチメント 0 に移動し、出力インデックス 1 はカラー アタッチメント 2 に移動することを意味します。

于 2011-02-25T12:26:35.910 に答える
0

私はいくつかの例を挙げたい:

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;
}
于 2009-11-16T14:07:44.723 に答える