「ゲームプログラミング/3Dグラフィック」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
2,538 行
 
 
==== 「深度」GPU的んとか法 ====
原理的には、下記の方法でも輪郭を検出できるが、画素ごとの計算が必要なのハズなで、メモリ負担が大きい。
[[File:立方体の等角図.svg|thumb|等角図での立方体]]
 
エッジ検出方式の欠点として、ややメモリなどへの計算の負担が重いことである。ゲームとして使う場合、携帯モバイル機器ではエッジ、画素ごとに計算する方法は利用が難しいだろう。
他の手法もある。
 
また、(非ゲームの)テレビ番組や映画などのアニメ作品などでは、メモリ負担は製作側が負担するので、エッジ画素ごとに計算する方法も有効だろう。
 
 
比較のため、掲載しておく。
 
 
===== 「深度」なんとか法 =====
[[File:立方体の等角図.svg|thumb|等角図での立方体]]
 
ようする輪郭線の発生場所とは、幾何学的、奥行き方向(z方向)に段差のある場所で輪郭線が発生しているわけである。なので、元画像の各画素ごとに、その画素の対応するz座標を記録しておいて、そして隣の画素とのz数値との差によって、輪郭の点を描画するかどうかを決める方法である。
 
この方法は、カメラから見た深度をもとに計算しているので、「深度」なんとか法などとも言われる。「なんとか」とか言ってるのは、新しい分野なので名前があまり統一しておらず、業界や会社によって微妙に用語が違い、「深度法」とか「深度バッファ法」とか用語にバラツキがあるので、とりあえず「深度なんとか」と言ってる。
 
 
欠点として、たとえば等角図のような図の、外側輪郭いがいの部分を描けな検出しづらい。
 
また、ほかの欠点として、画素ごとに計算するので、計算の手間や、メモリなどへの計算量の負担が増える。
 
 
===== 法線なんとか法 =====
[[画像:Koch_curve.svg|250px|thumb|right|フラクタル図形のひとつ、コッホ曲線]]
さらに他の方法もある。
2,575 ⟶ 2,584行目:
 
もっとも、通常の市販の3D-CGモデリングソフトでは、フラクタルの描画ができないので、めったにその事態に遭遇することは無いだろう。
 
 
 
 
なお、等角図の描写について、もし単に、カメラ向きと法線とを比較した場合には、「法線」なんとか法では描けない。
 
===== エッジなんとか法 =====
「法線」なんとか法を改良した方式のエッジ検出方式では、等角図も描ける。
 
「エッジ検出方式」とは、各画素とその周囲の画素との法線を比較する方式である。「エッジ抽出方式」ともいう。
 
 
エッジ検出方式の欠点として、ややメモリなどへの計算の負担が重いことである。ゲームとして使う場合、携帯モバイル機器ではエッジ法は利用が難しいだろう。
 
 
GPUをつめる筐体(プレステやデスクトップパソコン)などでは、エッジ法も便利だろう。
 
また、(非ゲームの)テレビ番組や映画などのアニメ作品などでは、メモリ負担は製作側が負担するので、エッジ法も有効だろう。
 
 
2,598 行
 
 
エッジ法の弱点としては、フラクタル的な図形が「法線」なんとか方式と同様に苦手だろうが、しかしそもそも手書き風3Dアニメでフラクタル図形を描画することは普通は無いので(SFとかの例外は考えないでおく)、あまり気にしなくていいだろう。
 
 
エッジ法やその関連技術はこのように便利であるが、メモリ負担が大きいのがゲーム的には残念である。
 
 
===== 「材質」による方法 =====
市販の3Dモデリングソフトでは、各部分の「材質」(『マテリアル』ともいう)をパーツごとに登録できる。なので、エッジ法や深度法などでの、各部の画素どうしの法線の比較のついでに、材質の比較をすることで、材質の変化をした部分に輪郭線を引くこともできる。このため、たとえば材質「服」と材質「肌」との境目の画素のぶぶんに輪郭線を引くこともできる。
 
2,625 ⟶ 2,622行目:
[[File:Fillet emphasise japanese.svg|thumb|400px|フィレット]]
 
裏ポリゴン法やエッジ法にかぎらず、上述のすべての方式の弱点として、カドっこを丸めるフィレット処理などの処理をされると、とたんに輪郭の検出が描画が難しくなる。
 
背景と外輪郭線の検出はフィレットされても上述のどの方法でも検出は容易だが、しかし、等角図の内部の輪郭線のような線の検出は、上述の方式では、どれも検出が困難・ほぼ不可能である。
2,640 ⟶ 2,637行目:
 
 
フィレットがあってもどうしても輪郭を検出したい場合、後述のいくつかの方法がある。
# テクスチャ的に、輪郭線として検出したい場所を最初から輪郭線の色でモデル表面に塗っておく方法。
 
2,663 ⟶ 2,660行目:
 
 
==== 明暗差を使う方法 ====
レイ・トレーシングなどのあとで、明暗差を使う方法もある。明暗差の大きい場所を輪郭として認識する方式である。
 
ただし、レイトレーシング自体が、計算量が多いので、メモリ負担がキツイ。
 
また、明暗差が無ければ輪郭線として認識しないので、光源の位置によっては、輪郭線として表現したい場所に、かならずしも輪郭線を検出するとはかぎらない。