課題08:映り込み処理

個々の物体に映り込みの反射率 Kr を与えて,これが 0 でないものは,周囲の物体が映り込むようにしてください. Kr は,構造体 Material の要素に r を追加し, この構造体の変数のそれぞれの要素に格納するものとします.

struct Material {
  float a[3];  /* 環境光に対する反射係数 Ka */
  float d[3];  /* 物体表面の拡散反射係数 Kd */
  float s[3];  /* 物体表面の鏡面反射係数 Ks */
  float e;     /* ハイライトの広がり */
  float r;     /* 映り込みの反射率 */
};

struct Material red = {
  { 0.5, 0.1, 0.1 },
  { 0.5, 0.1, 0.1 },
  { 0.4, 0.4, 0.4 },
  40.0,
  1.0,
};

struct Material green = {
  { 0.1, 0.5, 0.1 },
  { 0.1, 0.5, 0.1 },
  { 0.4, 0.4, 0.4 },
  40.0,
  1.0,
};

struct Material blue = {
  { 0.1, 0.1, 0.5 },
  { 0.1, 0.1, 0.5 },
  { 0.4, 0.4, 0.4 },
  40.0,
  1.0,
};

現在の可視点 P における視線ベクトル V の反射ベクトル F を求めます.

視線の反射ベクトル

どうしても分からなければ…

そして P を新たな視点,F を新たな視線に用いて,この視線と交差する物体を求め, その点の陰影を計算して,現在の可視点における陰影と合成します.

どうしても分からなければ…

映り込みを起こす物体が複数あると, それらの間で繰り返して反射が起こり, 計算が終わらなくなることがあります. そこで,反射の回数の上限を指定して, 一定回数反射したら処理を打ち切るようにしてください.

【次:課題09】