光を当てる — 法線と陰影
面の明度を、向きと光から決める。法線と光源方向の内積を明るさにすると、光のほうを向いた面が明るく、背いた面が暗い。固定の明度でなく、面の角度から物理的に明度が出る。
ランバートの余弦則では、拡散面の明るさは法線 n と光源方向 l の内積 max(0, n · l) に比例する。面が光に正対するとき最大、垂直になると 0。拡散反射(ディフューズ)で、面ごとに一つの明度を与えるのがフラットシェーディング。頂点ごとに法線を持って面内で補間するとなめらかになり(グーローシェーディング)、画素ごとに法線を補間するとさらに質が上がる(フォンシェーディング)。ここでは面ごと一定のフラットシェーディングで、立体の各面がくっきり分かれる。環境光の最小値を足しておくと、影の側が真っ黒に潰れない。
画家のソートに、法線と光の内積による陰影を足す。光は左上・手前に固定。面ごとの固定明度が、向きから決まる本物の陰影に変わる。
lit = max(0.14, n · l) が明るさで、法線をカメラ向き(nz < 0)に揃えてから光ベクトルとの内積を取る。0.14 の下限が環境光で、光に背いた面が真っ黒にならない。光の向き lx/ly/lz を回すと、明るい面が移る。エッジの stroke を外したので、面と面の境は明度差だけで分かれる——同じ立方体でも、向きから決まる陰影が乗ると、固定明度のときよりずっと立体に見える。
work は立方体と八面体を別々の軸で回し、面を画家のアルゴリズムで奥から塗って、法線と光の内積で sky 単色 LUT に陰影をつけている。三角の面(八面体)でも四角の面(立方体)でも、法線は外積一発で出るので、同じコードで陰影が乗る。