0

この関数についてかなり混乱しています glslのコードでは、いつもこのようなものを見ます

uniform sampler2D source;
varying vec2 textureCordi;

void main()
{
    vec2 uv = textureCordi.xy;
    vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; //2
    float average = (t1.r + t1.b + t1.g) / 3.0;
    //.....
}

//2で、t1はソースのデータ(データだと思う)を保存するのですが、何個のデータをコピーするのでしょうか? テクスチャの座標は 0 ~ 1 の間です。テクスチャが画像で、画像のサイズが 1024 * 768 であると仮定すると、t1 は 1024 * 768 のピクセル数を節約できますか? このコマンドで gpu は何をしますか?

t1 が重いコピー ジョブを実行する場合、texture2D にソースの参照を t1 に返すように依頼できますか (C++ のように)。

4

2 に答える 2

4

この操作では、渡されたテクスチャ座標に対応する正確に 1 つのテクセルを検索します (フィルタリング、ミップマップなどを考慮に入れます)。テクスチャ座標は、取得するテクセルの正規化された座標です。

編集: t1 は、操作が要求した 1 つのテクセルの rgb 値を保持します (3 つのコンポーネントを持つベクトルとして)。正規化されたテクスチャ座標は への入力texture2Dです。次の行は、テクスチャ全体の平均ではなく、その 1 つのテクセルの 3 つのチャネルの平均強度を計算します。

于 2013-06-11T13:48:51.300 に答える
1

これは、フラグメントごとの操作であり、フラグメントごとに、texture2D単一のテクセルをサンプリングします。プリミティブ全体に対して gpu で多くの並列操作が実行されます。何らかの方法で、すべてのデータが最後に出力バッファーに「格納」されますが、各main()関数は現在のフラグメントに対してのみ実行されます。他のフラグメントで何が起こっているかを認識していないため、すべての操作はフラグメントごとです。

これをさらに明確にするために、これは役立つはずですが、やり過ぎかもしれません: GPGPU - http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html lighthouse3d.com/tutorials/glsl-tutorial/fragment-processor/

お役に立てれば。

于 2013-06-11T14:47:09.927 に答える