################
# 輪郭描画デモ #
################

P/ECE上で、ポリゴンモデルの輪郭描画を行うデモです。

================
インストール方法
================

「edge.pex」を、P/ECEに転送してください。

========
操作方法
========

Ａボタン　　　　　　　輪郭描画のON/OFFを切り替えます。
Ｂボタン　　　　　　　描画するポリゴンモデルの数を変化します。
ＳＥＬＥＣＴボタン　　プログラムを終了します。

========
あとがき
========

「輪郭描画」は、ポリゴンモデルの端の部分に黒い線を描いて、背景や他のモデルとの境界をくっきり見せる技法です。
「エッジ描画」や、「エッジレンダリング」等と呼ばれることもあります。
二階調で陰影を付ける「セルシェーディング」と組み合わせて、アニメ的な映像を作成するために使われることが多いです。
ドリームキャストの「ジェットセットラジオ」や、PS2の「大神」等が代表的です。

「輪郭描画」を使うと、色数の少ない画面でもポリゴンモデルを強調して見せられるので、P/ECEにはぴったりの技法です。
P/ECEのプログラムで使ってみたいと考えていたのですが、これまで、なかなか上手く実装できませんでした。
処理速度と、メモリ消費量の問題のためです。

輪郭描画の実装には、いくつかの方法があります。
代表的なのは、以下のような方法です。

	1. ポリゴンモデルを少し大きくして、裏返して、黒で描く方法。
	   元のポリゴンモデルからはみ出した部分が、輪郭に見えます。

	2. 視線との角度が平行に近いポリゴンを、黒いテクスチャで描く方法。
	   セルシェーディングと併用して、実装されることが多いみたいです。

	3. ピクセル単位でポリゴンモデルを識別し、境界を判定する方法。
	   ポリゴンモデルの描画時に、ステンシルバッファに固有の番号を書き込んでおきます。

上記の方法を、そのままP/ECEに適用しづらいのは、それぞれ以下のような理由です。

	1. ポリゴンモデルの描画回数が、二倍になります。
	   また、“少し大きく”したポリゴンモデルを実行時に生成するなら、さらに時間がかかります。
	   →処理速度の問題

	2. ある程度なめらかな、ポリゴン数の多いモデルが必要です。
	   ローポリだと、どのポリゴンも“視線との角度が平行に近く”ならない場合が多いからです。
	   →処理速度の問題、メモリ消費量の問題

	3. ステンシルバッファが必要で、メモリ消費量が増えます。
	   そもそも、僕のP/ECE用3D描画ルーチンには、ステンシルバッファの機能がありません・・・(^^;
	   →メモリ消費量の問題(+12KB程度なのでさほどでもない?)、3D描画ルーチンの機能不足の問題

1.〜3.の方法を、そのまま適用するのは難しそうです。
今回は、3.の応用で、ステンシルバッファの代わりにZバッファを参照し、ポリゴンモデルの境界を判定する方法を採ってみました。

シーン全体の描画が完了したときに、Zバッファには、投影面からの距離に対応する値が入っています。
隣り合ったピクセル間で、投影面からの距離が一定以上異なる場合、そこがポリゴンモデルの境界である可能性が高いと判断します。
Zバッファは既に使っているので、メモリ消費量は増えません。
描画したポリゴン数にかかわらず、シーン全体の描画完了後に、全体を一回走査すれば良いので、処理速度への負荷も許容範囲です。

ちょっと注意が必要だった点として、Zバッファの値をそのまま比較すると、上手く輪郭描画できません。
Zバッファの値は、投影面からの距離に“対応する値”ではありますが、“比例する値”ではないからです。
Zバッファの値は、投影面に近い場所ほど精度を高めるために、少しの距離の違いでも大きく値が変化します。
そのまま比較してしまうと、投影面に近い場所で、少し斜めなだけのポリゴン表面に、誤って輪郭を描いてしまうおそれがあります。
そこで今回は、変換テーブルを使って、Zバッファの値を、距離に比例する値に変換してから、比較しました。
変換テーブルのメモリ消費量と、テーブル変換処理の負荷が気になるところですが、
僕のP/ECE用3D描画ルーチンは、Zバッファの精度が8ビット(^^;しか無いので、変換テーブルのメモリは256バイトで済みました。
テーブル変換処理の負荷も、シーン描画全体の負荷に較べれば、影響は少ない範囲に収まったようです。

今回のデモプログラムは、Aボタンで、輪郭描画有りと無しを切り替えられるように作ってみました。
P/ECEの画面は色数が少ないため、輪郭描画無しでは、ポリゴンモデルの色が背景に溶け込んでしまっています。
一方、輪郭描画有りでは、ポリゴンモデルがくっきりと目立っています。
上述のような単純(手抜き?)な方法でも、輪郭を付けると、なかなか見栄えには効果が有るようです。

====
謝辞
====

ポリゴンモデルに、「<a href='http://sakura.hippy.jp/meta/'>メタセコ素材！</a>」さんの、『無料3D素材』を使わせていただきました。
ありがとうございます。

==================
Sat May 2009
Naoyuki Sawa
nsawa@piece-me.org
==================
