シェーディング

シェーディング（）は、3次元コンピュータグラフィックスやイラストレーションなどで明暗のコントラストで立体感を与える技法である。絵画では陰影画法と呼ぶ。単に立体に影を付ける、付影処理 (シャドーイング、) とは異なる。


 絵画技法 

紙上に絵を描く際のシェーディング（陰影画法）とは、暗い部分にはより濃く画材を使用し、明るい部分には軽く画材を使用することで、立体的に描く手法である。シェーディング技法には、直角に交わる線を間隔を変えながら多数描いて影を表すクロスハッチングなどがある。線の間隔が狭い部分は影が濃い部分となる。同様に線の間隔が広い部分は明るい部分となる。

対象物への光の当たり方を考慮してシェーディングを施すことで、紙上に奥行きがあるかのように感じられる絵を描くことができる。

 シェーディング (コンピュータグラフィックス) 

コンピュータグラフィックスにおけるシェーディング（）は、光の角度と光源からの距離を考慮して色を変化させ、実写のような効果を得る処理である。レンダリング処理の一部である。

 光源 
シェーディングでは光の振る舞いをシミュレートする（ライティング、）。そのために光の発生源である光源が設定される。  
光源はその面積・指向性・減衰・色などから以下のように分類できる：

サムネイル|300x300ピクセル|左上から順に点光源、スポットライト、平行光源、環境光、天空光、IBL。

 アンビエントライト（環境光） - シーン内の全てのオブジェクトを等しく照らす。特に光源の位置を定めず、全体が等しい明るさになるため、シェーディングは施さない。
 ディレクショナルライト（平行光源） - 設定した方向から平行で均一な光線を当てる。太陽光線のような非常に遠い光源を想定したもので、シェーディングは行われるが、後述する距離減衰は発生しない。
 ポイントライト（点光源） - ある1点から光が発生し、そこから全ての方向に光線が広がっていく。
 スポットライト - ある1点から光が発生し、設定した円錐状に光線が広がっていく。
 エリアライト（面光源） - ある平面を設定し、そこから指定した方向に光線が広がっていく。
 ボリュームライト - 空間内で設定した距離の範囲内だけ届く光源。
 イメージベースドライティング - 空間の光情報を記録した画像に基づく全周光源

シェーディングは、これら光源とオブジェクトの表面の角度に基づいた内挿である。もちろん、1つのシーンに複数の光源を設定することができ、実際そのように制作することが多い。レンダラーは複数の光源からの光線の合成を内挿し、それにしたがって2次元の画像を生成する。

 距離減衰 
理論的には、平行な2つの面があったとき、太陽光線のような遠距離の光源からの光の照度は等しい。たとえ一方の面がずっと離れていても照度は一定である。

下の図では、2つの直方体を異なる光源で照らしたときのシェーディングを示している。左の画像ではどちらの直方体も正面の面は同じ色になっている。右の画像では前の直方体の正面の方が若干明るい。また、床が近い部分ほど明るくなっている。右の画像の光源は光源からの距離が遠いほど光線が減衰する設定になっている。これを「距離減衰 (distance falloffあるいはdistance attenuation)」と呼び、光源を増やすことなく、より写実的な画像が得られる。

300px|center|thumb|OpenGLレンダラーで描画した2つの箱。視点からの距離が異なるが全く同じ色で描画している。300px|center|thumb|「距離減衰」を実装した ARRIS CAD で同じモデルを描画したもの。視点に近い表面をより明るく描いている。

距離減衰の計算方法はいくつかある。
 線形（1次） - 光源との距離を x としたとき、そこに届く光の量を x に比例して減らす。
 2次 - 実世界での光の性質に近い。光源からの距離が2倍になると、届く光の量は4分の1になる。
 n次 - 光源との距離を x としたとき、そこに届く光の量を 1/xn とする。
 これら以外の関数を使うこともできる。

 反射 
光源から物体方向へ進む光は物体表面で反射（鏡面反射）・散乱（拡散反射（透過・屈折））・吸収され、その光がカメラへ到達することで物体は描画される。物理的忠実度と計算負荷を考慮した様々な物体表面の反射モデルが存在する。以下はその一例である：

 ランバート反射モデル: 拡散反射
 ハーフ・ランバート照明: 拡散反射
 オーレン・ネイヤー反射モデル: 拡散反射
 Phongの反射モデル: 経験則モデル。拡散反射+鏡面反射。軽量

 双方向反射率分布関数 (BRDF): エネルギー保存モデル。物理的な忠実度が高い。物理ベースシェーディングに用いられる
 双方向散乱分布関数 (BSDF)
 (参考) 

各反射モデルは固有のパラメータをもつ。例えばPhongモデルは拡散反射と鏡面反射の強さを制御するパラメータをもつ。実際のレンダリングエンジンではこれを直感的に理解できるよう、物体の「材質 / マテリアル」という形でアーティストに見せる場合が多い。

具体的な採用例としては、Unity URP Simple Lit シェーダーは Blinn-Phong モデルを採用している"The Shaders do not conserve energy. This shading model is based on the Blinn-Phong model." 以下より引用。URP8.2 documents。URP Lit シェーダーはBRDF系のモデルを採用している。

 補間 
3次元コンピュータグラフィックスではポリゴンモデルが主に利用されるため、曲面は平面の連続で近似的に表現される。この結果、単純にシェーディングをおこなうと面ごとに陰影の強さが変わり近似していることが目立ってしまう。そのため様々な補間手法が提案されている。以下はその一例である：

 グーローシェーディング
 フォンシェーディング
 （各種トゥーンシェーディング）

 フラットシェーディング 
300px|thumb|フラットシェーディング補間の例
フラットシェーディング（）は面を面としてシェーディングする手法である。すなわち補間をおこなわないシェーディングである。

オブジェクトを構成するポリゴンの法線ベクトルと光源の方向との角度に基づいて面単位でのシェーディングを施す。色はそのポリゴン（面）を照らす光の強さにしたがって決定される。

リアルタイム処理系など、高速なレンダリングが必要で、より高度なシェーディング技法が使えない場合に利用される。しかしグラフィックスチップ上でのハードウェアT&Lおよびプログラマブルシェーダーが一般化して以降は、すでにローエンド品やモバイル向けであっても非常に高速に滑らかなリアルタイムシェーディングが可能であり、性能的な理由でフラットシェーディングを使うことは少なくなっている。

フラットシェーディングの欠点は、滑らかな曲面を表現したい場合でも小さな平面が並んでいるような見た目になる点である。滑らかさを得るにはポリゴン数を上げるしかないが、これは利点である軽量さを犠牲にする。

逆に角ばった物体を描きたいなら、そのような見た目が好ましい場合もある。ソリッドモデル製作中はフラットシェーディングの方が形状が見やすいので、よく利用される。

 脚注 

 出典 

 関連項目 
 3次元コンピュータグラフィックス
 シェーダー
 プログラマブルシェーダー
 シェーディング言語
 ランバート反射

 外部リンク 

Category:コンピュータグラフィックス
Category:3DCG
Category:仮想世界