まこりそ裏日記
4/16日すいようび
今日は会社説明会で某会社のプログラマーの貴重な話が聞けました。某車ゲームでは原作の関係上夜間走行が
メインになるため、ヘッドライトの表現にを頑張ったのだそうです。曰く、路面を照らすライトはライトマップ。
左右サイドの壁や障害物を照らすのには、通常の頂点ライティングを下から掛けているのだそうです。
確かに言われてみれば左右の壁の明るさにチョット線形補完臭が出ていますが、路面は綺麗に表現できているので
気にならないぐらいに表現できてはいると思いました。壁にライトマップを使わなかったのは処理速度の問題
らしいです。範囲内の壁を列挙してライトマップを貼るのは厳しいかもしれないとは思いましたが、
たしかQuake2辺りでは既に実装され現実的な速度で動いてたような・・・。
それと更に他の某レースゲームでは車の上げる白煙の表現を頑張ったとか。
曰く通常のゲームは白煙を複数のビルボードを並べて表現しているから煙が繋がってないのでつなげたテクスチャを
一枚だけ書くことでよりリアリティを出したとか。確かにゲームシーンの煙の表現は
かなりリアルになっていると思いますが、説明によるとまずレンダブルテクスチャに白煙を書き、
ソレをビルボードとしてシーンにレンダリングするらしいです。それって結局テクスチャに煙を沢山描いてるんじゃ・・・。
なんか問題点と解決法との間が微妙に飛んでるような気がしたので、おいらが勝手に脳内補完した見解では
煙が途切れる問題は途切れないぐらいに連続して描けばいいので大した問題ではなく、途切れないほど
密集して半透明で描くと煙同士の重なった部分の色合いが1枚の所より濃く出てしまって不自然になるので、
「一度テクスチャに飽和する強度で煙を複数回レンダリングして、それを弱めに半透明合成することで実現した」
といいたかったのではないかと妄想してみました。まあ何となく受かりそうな気がしないので
面接に行ったら玉砕覚悟で聞いてみようかな。(爆)
4/10日もくようび
今日はオイラが2年ぐらいやってるMMORPG、リネージュのファイナルエピソード(?)「アデン」が追加されました。
事前にUpdateパッチを入れておいたにも関らず、激しくPHSファイルのダウンロードを余儀なくされ激しく鬱ですが、
まあ毎回Upの度に不具合が出るのはいつものことなので気にしてもしょうがないのですが(爆)。
このリネージュというゲームはむかーしっからあるので、今見ると妙にプログラムがヘボく、
半透明はソフトウェア処理なので激しく重いし、そもそも通常時のフレームレートは10フレームぐらい
しか出てないんじゃないかと思うほどアレなゲームです。商用プログラムなんだからいい加減3次元ラスタライザ
を使えと言いたくなる今日この頃です。
4/9日すいようび
前からDualCPUの文句をタラタラ書いていたが、あるとき後輩がMSDNに真相を発見。DualCPUでは高分解能パフォーマンスカウンタ
の値が使うCPUによって違うというのは仕様らしい。また、使用するCPUを選べる便利API(SetProcessAffinityMask)も
同時に発見してくれた。コレでバッチリ高分解能パフォーマンスカウンタを使用するゲームが動くに違いない。
みんな、高分解能パフォーマンスカウンタを使うときは使うCPUを指定しろYO(ぉ)。
そんな訳で東京での面接が終わった後、帰りの電車の中で使用するCPUを選択できるランチャーを作ってみた。
製作時間30分の優れものだ(爆)。というかこの日記も密かに電車の中で書いているわけだが、そろそろ電池が切れそうだ。
早く家に帰って試して見たいぜ。
4/5日どようび
今日は昨日に引き続き平行光源のサポートを行った。今日は主にマップコンパイラを改造した。
どう改造するかというと、マップに空を定義し、ライトマップを作る時に該当ピクセルから平行ライトの
RayをPicして空へ抜ける場合にライトが当たっているとして計算する事で実現した。原理は簡単なんだけど
実際に実装するのは結構めんどくさくて、今日○一日かかった。
あとゲーム本体のほうも同じような処理を行って、キャラクターが陰に入った時にちゃんと暗くなるようにした。
4/4日きんようび
最近は学校も始まって忙しくなってまいりました。そんな事はとは関係なくへっどしょっとの改造をしていました。(爆) 今回の変更は野外で空が見えるマップを作れるようにしたいとの事だったので、空を表示できる
ようにしようとしました。空を表現するにはいくつかの問題があります。
1:視点位置が変化しても空模様が変化しないようにする必要がある。
2:空から降り注ぐ光(平行光源)による影(ライトマップ)を表現する。
3:それに伴って平行光源のRayPicを行い、影に入った時のキャラクターへのカゲリを表現する。
まず空模様を表現するにはいくつか方法がある。と思うw。
まずひとつは背景とは別に内側向きの四角やら球やらで空を描画して、その後ジオメトリを上書きする方法。
もうひとつは該当するポリゴンのUV操作で空を表現する方法。前者は上書きが発生するためロスが大きいが
実装が簡単。後者は普通にジオメトリを描画するのと同じなのでロスは頂点操作分のみ。そんな訳で後者を選んだ。
当初は視点からのUVスフィアマップで実現できると思っていたのだが、現実はそう上手くいかなかった。
複数のポリゴンのつぎはぎで一枚の絵を表現するのにを球体マップを使うと、適応する面に対して適切な
UVを割り当ててもUVが線形補完されるため継ぎ目がズレてしまい、上手くいかないのでとりあえず今のところは
面マップで我慢している。近いうちになんとかしようと思う。つづく(笑)