Skip to content

改訂前の参考解説

このページは改訂前の教材です。現在の授業の回番号・内容は、後期の授業計画で確認してください。

第18回 複数回のサンプリングとループ

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とします。次の表は横方向の三点を読む例です。

番号iOffset=i−1読む位置読んだ値の例加算後の合計
0−1u−du0.20.2
10u0.40.6
21u+du0.91.5

計算部分をHLSLの形で読むと、次の順序になります。TextureとSamplerの宣言は第15回のものに対応します。

hlsl
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の問題を説明できる。
  • 変更した条件と、予測・計算した結果を対応付けて説明できる。