とりあえず、動くようにはなった。マテリアルとかは未実装だけど。
取調室じみてきたな……
端の処理はしてないので、幅を太くすると(or拡大すると)破綻してくる。
(ポリゴンの輪郭の描画方法を変えたのでバグが見えなくなった……)
頂点ベクトルを与えていないので、ポリゴン面から頂点ベクトルが再構成される。ポリゴン面は立体的じゃなくて、スクリーン座標に変換した線分の頂点を動かしてからグローバルに戻してキューに入れてるから、正しくない陰影が出てしまう。
視線ベクトルを頂点ベクトルに与えてやれば、陰影が視線に連動するので、光源側から見れば明るく、反対側から見れば暗く見える。用途によっては陰影が変化しない線分がほしい気もするけど、それを実現するには「このピクセルには陰影を反映しないでね」というフラグと、それをチェックするifが必要になるので、ちょっと面倒。
真面目にライティング扱うの面倒なのよ。。。
***
ローポリのマグカップも作ってみた。
頂点ベクトルを適切に設定してやれば、少なくとも陰影はなめらかに出るんだけど、そういう処理はしてない。ある程度は機械的に頂点ベクトルを生成できるはずなので、モデルをロードしたときに生成すればいいんだろうけど。
「この頂点に接続されたポリゴンの法線の平均値」みたいなアルゴリズムで行けそうな気もする。とはいえ、場所によっては破綻するだろうし、そもそもSTLはポリゴンごとに独自に頂点を持つので、総当たりで3次元の距離を計算して同じ頂点を共有してるポリゴンを探さなきゃいけない。ロード時だけとはいえ、素晴らしくリソースを喰いそう。。。
ゲームのロードにイライラしているそこの君!根気よく待つんだぞ!!ゲーム機は必死に計算をしているんだ!!!アルゴリズム改善しろって?そんな事を言うなら君が開発元に就職して最適化作業を受け持つんだ!プログラミングを覚えろ!!アルゴリズムを考えろ!!!半導体メーカーに就職して爆速CPUを作る手もあるぞ!!!!
単純に接続ポリゴンの平均を取ると、マグカップの外側と上面の平均が取られて、ドーナツみたいな膨らんだ形状になりそう。となると、何らかの基準によって一部のベクトルを除外するような処理が必要になる。
マグカップの例でいうと、一つの頂点に対して、上面ポリゴンは同じ向きが2枚、壁面ポリゴンは異なる向きが2枚、だから、全体のベクトルの平均から遠いベクトルを除外する、みたいなアルゴリズムは使えない。
自分のポリゴンの向きとの内積が0.5以上のポリゴンとの平均を取る、みたいな感じだろうか。
パイプライン後方にあるラスタライザの入力が、グローバル座標の頂点3個なので、ビルボードとか線分みたいな、一旦スクリーン座標に持ってくるやつは、スクリーン座標をグローバルに戻してまたスクリーンに戻すので、無駄がある。もっとも、キャラクターみたいな数万ポリに比べれば大した計算負荷ではないが。
0 件のコメント:
コメントを投稿