3 / 4 上限付きループの追跡
ループの開始・継続・終了を表で読みます。
反復ごとに何が変わるか
ループでは、番号を0から始め、番号が参照数より小さい間だけ値を読み、合計へ足して番号を1増やします。参照数3なら番号0、1、2で計算し、3で終わります。番号3の処理まで含めると4回になってしまいます。
合計はこの画素の計算を始めるときに0へ戻します。三回読んだ後に3で割ります。参照数0では平均を求められないため、基本では1以上の固定回数を使います。可変にする場合も、使ってよい最大数を決めます。
小さな表で確認する
値0.2、0.4、0.9を順に足すと、合計は0.2→0.6→1.5、平均は0.5です。GPUでは多くの画素がそれぞれこの計算を行います。一つの画素でループが9回なら、画面全体で9回だけ計算する意味ではありません。
三点を読む反復の表
中央UVをu、一Texel分の差をduとします。次の表は横方向の三点を読む例です。
| 番号i | Offset=i−1 | 読む位置 | 読んだ値の例 | 加算後の合計 |
|---|---|---|---|---|
| 0 | −1 | u−du | 0.2 | 0.2 |
| 1 | 0 | u | 0.4 | 0.6 |
| 2 | 1 | u+du | 0.9 | 1.5 |
計算部分をHLSLの形で読むと、次の順序になります。TextureとSamplerの宣言は第15回のものに対応します。
float4 total = 0;
for (int i = 0; i < 3; i++)
{
float2 offset = float2(i - 1, 0) * texelSize;
total += SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv + offset);
}
float4 average = total / 3.0;texelSizeは(1/幅,1/高さ)、uvは中央の参照座標です。ここでは独立したShaderファイルではなく、宣言した値を使う反復部分を読みます。初期化・条件・加算・番号更新・平均の順に、表と照合します。
条件を変えた確認
番号0〜2で左右と中心を読むループについて、各回のOffsetと合計を書きます。参照数を1へ変える場合は中央だけを読むように条件を作り直してください。
考え方の確認
三点の例ならOffsetは−1、0、1です。一点だけ読む場合はOffset=0とし、平均の除数も1にします。上限の数字だけを変えて左端を読む処理にしないことが要点です。
中央のUV、左右のOffset、反復数の対応を保存します。
- 三回の合計の変化を追い、ループの上限と参照数0の問題を説明できる。
- 変更した条件と、予測・計算した結果を対応付けて説明できる。