radium.png
HOME | ARCHIVE | PRODUCTS | ABOUT | RSS

淡々とプログラミングする日

2001-10-01

今日から10月が始まる。この10月は,たぶん,僕にとって修羅の月。近年まれにみる多忙なスケジュールが差し迫ってきている。まあ,その後にも地獄のような進行が待っているわけで,特にいまテンション上げるってわけもなく,いつものように淡々とプログラミングする日。せめて明日は晴れるといいなとか,朴訥におもってた。


職場で定期購読している CG World を閲覧。いままでは他のCG雑誌といっしょくたに,ぞんざいに扱ってたんだけど,よくみてみるとかなり白眉であるような気がしてきた。うーむ,DAKINI先生が毎月話題にしてるんで,あやしいとはおもってたんだけど(早く気づけ)。んなもんだから,これからは少し真面目にチェックしてみようかとおもった。

とくに倉地紀子さんの連載コラム(名前わすれた……)とか,かなりおいしいんではないかとおもった。最新の技術を多彩な図表を交えて概念的に説明しようとしているんではないかと。もちろん,技術者としてはこれでは不十分で,ここから元の文献をたどって勉強するところが重要なんだろうけど,そのきっかけとなる窓口が低くて入りやすいところにあるってのは,きっと悪いことではないはずだとおもう。


なにげに開いたAlt−RのML5で,スタパ斎藤さんのこんなポストが。

http://home.planet.nl/~mourits/koelkast/

こーゆー冷蔵庫が売っていたら即買ってしまいますな。
ガワ商売になるかも!! とか。

ぬぬ! そうだこれだ! まさにこれだ! これからの21世紀を生き抜く僕らにはまさにこういう素敵ハックこそが必要なわけで……。ところで,某飲みの席では,SGIマシンはもはや温風機ってことで結論づいてたんだけど(byかわち先生),それがまさか冷蔵庫になるとはなあ。ジムクラークも本望だろうに。

http://home.planet.nl/~mourits/koelkast/


GCCとか

2001-10-02

職場のひとと世間話。そのうち,会社の「もと」有名人,ディルこと Dylan Cuthbert の話題になった。どうやら,彼の個人ホームページがあるってことらしい。こんなときは,さっそく google だ。

http://www.geocities.com/dylan_cuthbert/

このひとは,いわゆるウィザードっていうか,なんでもできるパワープログラマってやつで,みんなに信頼されるカリスマ的存在でもあった。

PS2の発表のときにつかわれた「アヒルと風呂」のデモとか,彼の手によるものだ(彼はそのことをあまり嬉しくおもってないようだけど)。のちに,EE用GCCに彼独自の拡張機能を付けくわえたりして,みんなをおどろかせていた。ちなみにこのパッチは,海外のデベロッパのあいだではわりとメジャーな存在となっているらしい(社内ではNDA的な扱いだったんだけどなあ)。

まあそんなかんじの,僕から見たら神がかったような人物だったんだけど,このページでは,そんな彼のちょっとナイーブな一面や,苦労話なんかが見れたりして,おもしろかった。


気分転換がてら,ひさしぶりに cygwin をバージョンアップ。最近の cygwin は setup.exe を実行するだけで,パッケージのダウンロードやらインストールやらをほとんど自動でやってくれる。なかなか便利。そろそろ cygwin も gcc3.0 にならんのかしら。

そういえば,GCCの拡張機能で,ちょっと見極めかねていることがある。

わりと最近のGCCでは,ネストした無名構造体/共用体の中身を参照するばあいに,省略した記述ってのが許されるようになっている。たとえば,

struct
{
  union
  {
    struct { float x,y,z,w; };
    struct { int ix,iy,iz,iw; };
  };
}
foo;

などとしたばあいに,

bar = foo.x;

というような参照方法が許される,というものだ。ちょっといんちきくさい記述法だけど,構造体と共用体をくみあわせて使う場面なんかでは,それなりに役にたつ。

ところが,この機能はGCCのマニュアルには載っていない。GCCの開発者むけMLのログをさぐってみると,この機能に関する討議をわずかながら見つけることができる。どうやら,VC++の拡張機能と互換をとる意図で付け加えられたようだ。

つまりこれは,プラットフォーム間の移植において簡便性を高めるためのおまけ機能であって,正式な機能としては認められていないってことなのかなあ,とかおもった。

わりと使いたい機能だったりするんだけど,正式にドキュメンテーションされてないとなると,将来のバージョンでふいに取り除かれる可能性とかもあるわけで,あまり積極的に使う気にはなれない。


ローギア気味に運転中

2001-10-03

仕事のほうが本格的に忙しくなってきたんだけど,ちょっと風邪っぽい気分なので,ローギア気味に運転中。

期日が詰まってくるにしたがって,仕事の内容もだんだん変わってきた。いままでは,どちらかといえば設計方面の作業が多かったんだけど,最近では実装作業が増えてきている。ちょっと楽しげになってきた気がする。

設計の段階では,机に向かってあーでもないこーでもないと考え詰めていることが多い。どうしても考えがまとまらない場合は,とりあえずコードを書いてみて,元のコードが残らないくらいリファクタリングを繰り返す。こういう試行錯誤はそれなりに楽しいとおもうんだけど,最後は妥協と諦めでしめくくられることが多いので,後味が悪い。100%満足な設計なんて,なかなか味わえないもんだとおもう。

それに対して実装のプロセスってのは,設計段階で生み出された抽象的な部品たちを組み上げ,実体へと変換する作業。たとうなら,半分くみあがったジグソーパズルを完成に持っていくときの,すいすいとピースがはまっていって実像が見えてくるときのような,そんなスピード感とカタルシスがある。


XBOXのマイクロソフト発タイトルについての発表会があったようだ。

http://www.watch.impress.co.jp/game/docs/20011003/xbox.htm

うーん,いまいち画像が小さすぎるなあ。やはり,実機で動作しているところを間近で見てみたい。たぶん,これらのタイトルは今月のゲームショーで大々的に披露されるんだろうけど,いま自分の前に積みあがってるタスクの量を考えると,とてもゲームショーに行ける気がしない。むむ,こんなときにかぎって……。


Impress PC Watch の「後藤弘茂のWeekly海外ニュース」,ゲームキューブ特集第3回目。

http://www.watch.impress.co.jp/pc/docs/article/20011003/kaig...

前の2回はあまりまじめに読んでないんだけど,今回の記事にはちょっと興味を引かれた。「グラフィクスデータ圧縮」とか「ディスプレイリスト圧縮」とか呼ばれている機能についての具体的な解説が載っているのだ。

まず,すべてのデータを32bit浮動小数点で持つ必要はない,ってのが根本にある主張だ。データの種類と,それに必要とされる精度について,次のように挙げられている。

Position : 16 bits
Surface normal : 8 bits
Weighting coefficient : 8 bits
Transformation matrix : 24 bits

法線は正規化されているんだから8bit程度のダイナミックレンジがあればなんとかなるかもしれないし,ポジションについても,極端に広大なモデルや,ダイナミックにスケールが変化するようなモデルでなければ,16bitでもなんとかなるような気がする。変換行列が24bitってのはちょっと危うげな気もするけど……。

Gekkoでは,これらの変換がロード/ストア命令内で行えるようになっているらしい。これはたしかに便利そうだ。帯域の節約に貢献するところは大きいだろうし,メモリ容量的にも助けられる場面が多いんじゃないかとおもう。

PS2とか,一見,大量のDMAがぶっといバスのなかをびゅんびゅん飛びまわってるような気がするんだけど,GCと比べたら,なんとスカスカなパケットが飛び回っていることか。むなしいなあ。


秋特有の粒子

2001-10-04

涼しくていい天気。やわらかな日差しと涼しげな秋風が心地よい朝(世間的には昼)。なぜか風に秋の香りを感じるのは,気のせいなんだろうか。なんかの話で,秋の風の香りっていうのは,植物類の出す秋特有の粒子成分ってのが大気中にただよっていて,それを嗅いで秋を感じるんだとかいうような理屈があったような気がするんだけど,現代に舞い降りたクリミナルシティこと溝ノ口駅周辺なんて,じっさいには排気ガスとスモッグぐらいしか大気中にはないわけで,やっぱそんなの気のせいだよなあ,とかおもうのだった。


先日,在庫切れのために買いそびれたフォトンマップ本をふたたび検索してみると,在庫が補充されたとある。1週間程度で届くそうだ。んじゃあ買いますか,とおもむろに "1-Click Order" ボタンを押す。次の瞬間には注文が終了していた。やや唖然。すげー。

amazon の1クリックオーダーは初体験だったんだけど,ほんとうに1クリックで購買に関するすべての作業が終了してしまうことに,いまさらながらおどろいた。この経験はかなりショッキング。買い手にはもはや,購入意欲を失うだけの時間は,わずかながらも与えられない。脊髄で通販してしまうようなノリのひとにとっては,すでに死刑宣告といえよう。いやまじ怖いっすよこれは。

http://www.amazon.co.jp/exec/obidos/tg/detail/glance/-/engli...


string hashing

2001-10-05

GDA−MLで,文字列のハッシングについての話題がでていた。

http://www.geocrawler.com/mail/thread.php3?subject=%5BAlgori...

僕も,文字列をキーとした連想配列(STLのmapみたいなやつ)とかよく使うんだけど,そういうときに文字列のハッシングは必須だ。ちなみに,文字列をまんまキーとしてつかうことは少なくて,たいてい,

typedef union {
  int i[4];
  char c[16];
} Identifier;

こんな感じの構造体を使って管理する。これだと文字列は16文字に制限されるけど, Identifier どうしの比較は

static inline cmpid( const Identifier *id1, const Identifier *id2 )
{
return id1.i[0]==id2.i[0] &&
       id1.i[1]==id2.i[1] &&
       id1.i[2]==id2.i[2] &&
       id1.i[3]==id2.i[3];
}

こんな感じで済むので便利だ。ちなみに,EEなら128ビット比較命令があるんで,1命令でこの比較を行うことができる。


で,ハッシュ関数なんだけど,ドラゴン法を使えとか,CRC32を使えとか,いろんな意見が出ている。でも,このドラゴン法やらCRC32やらでできることは,長い文字列をint値にマッピングすることで,そこからは,その値をキーとしてバイナリツリーなんかを作って管理しましょう,ってノリだ。

僕(と質問者)がやりたいのは,いわゆるハッシュテーブルってやつなので,この方法は目的と合致していない。テーブルインデクスに変換する段階でmodしてしまうので,わざわざ重い処理をかけて衝突しにくいintキーを生成する必要はないのだ。ハッシュテーブルは,僕の場合,小さいものでは64個ぐらいしかエントリを用意していないし,大きいものでも512個ぐらいだから,その範囲でてきとうにバラけるハッシュ関数が欲しいのだ。


でまあけっきょく,こういう用途には単純なやつで十分,って結論がついている。例としてSTLのハッシュ関数があげられている。

unsigned long stl_hash(const char *s)
{
  unsigned long h=0;
  for (;*s;s++) h = 5*h + *s;
  return h;
}

こんな感じだ。ところで,僕がいま使っているのは,文字列のすべてのキャラクタを単純に総和しているだけの簡単な関数。そういう関数なら,マルチメディア命令をつかって加算処理を平行させ,高速にキーを求めることができるからだ。上のようなフィードバック的な処理だと,どうしてもループにせざるをえない。

気休めに,両者の特性を比較してみた。

from sys import *
import re,math

DEPTH = 64

table = []
for i in range(DEPTH): table.append([])

dict = {}
words = []
for line in stdin.readlines():
    for w in re.sub('¥W',' ',line).split():
        if not dict.has_key(w):
            dict[w] = 1
            words.append(w)

print 'wordcount:',len(words)

for w in words:
    i = 0
    for c in w:
        i = (i*5 + ord(c)) & 0xfffffff
        #i = i + 65*ord(c)
    table[i&(DEPTH-1)].append(w)

lt = map( lambda x:float(len(x)), table )
avg = 1.0/DEPTH * reduce( lambda x,y:x+y, lt )
sd = 1.0/DEPTH * reduce( lambda x,y:x+pow(avg-y,2), lt )

print 'avg=%f, sd=%f' % (avg,math.sqrt(sd))

for line in table: print len(line),line

テストデータにはGCCのマニュアルの第3章(4603単語)を使った。 DEPTH=64 の場合は,

フィードバック系: SD=8.59
総和系:           SD=8.17

といった具合で,むしろ総和系のほうがいい結果になってしまった(まぐれだとおもうけど)。 DEPTH=512にしてみると,

フィードバック系: SD=3.00
総和系:           SD=4.79

とまあ,やはりフィードバックのほうがバラけてくれるみたいだった。


当初は,そろそろちゃんとしたハッシュ関数を作らなきゃなー,とおもって読みはじめたんだけど,結論としては,今ので十分かもなあ,ってことになってしまった。うーん,つまらん。


Mesa3.5

2001-10-06

昼起床。夕方出動。今月は忙しいから,土日月出動体制で行くつもり。

んで,ぽちぽちとプログラミング。いまいち眠くて気合が入んない。わりと睡眠はとったつもりなんだけどなあ。寝だめってのは,やっぱり効果がないみたいだ。


気分転換にと, Mesa3.5 をサーバマシンにインストール。今は Mesa3.4 が入れてあって,それほど不自由もしていないんだけど, 3.5 ではかなりの数のエクステンションが追加されているので,入れておいて損はないはず。おもに OpenGL1.2 仕様を中心にサポートが追加されているようだ。

最初はライブラリアーカイブだけダウンロードして make したんだけど,なんだかうまくいかない。どうやら,デモアーカイブも同時に展開しておく必要があるらしい。んでもって "./configure; make" 。今度は問題なし。

とりあえず自前のプログラムをリンクしてみるも,うまく動いてくれない。シェアードライブラリが見つからなくて失敗しているようだ。 /usr/local にインストールしたんだけど, /usr/local/lib はパスが通ってないのかな。うーん……。

ちょっと調べまわってみると,シェアードライブラリのパス設定は /etc/ld.so.conf にあるらしい,ってことがわかった。さっそく /usr/local/lib を追加して, /sbin/ldconfig を実行。 ldconfig をかけておかないとサーチキャッシュが更新されないので,変更した内容が反映されないようだ。落とし穴っぽいなあ。


以上でインストールは無事終了。 3.5 で追加されたエクステンションのなかに ARB_texture_env_combine とか ARB_texture_env_dot3 があるので, per-pixel っぽい実験とかできるかもしれない。できれば EXT_vertex_shader も欲しいところだけど,こちらはエクステンションとして登録されたばかりなんで,サポートされるとしてもまだそれなりに時間がかかるだろう。だいいち,サポートする気があるかどうかもわからないし。

しかしながら, Mesa は意外とあなどれないなあ,とおもった。エクステンションがやたら充実しているのだ。気合の抜けたメーカーの気合の抜けたICDよりも,よっぽど多くのエクステンションをサポートしているとおもう。3Dボリュームテクスチャなんかもしっかりサポートしていたりして,驚かされる。それでいて動作も安定しているから,用途によっちゃあこっちの方が有利かもしれない。


finalRender

2001-10-07

昨日から泊り。土日連続はひさしぶりだなあ。んで,マックで昼食。マックは輸入牛だっけ。まあ,そこらへんはあまり気にしないことに。マックだし。


昼食ついでに本屋で CG World を購入。なにげにぱらぱらと目をとおしていると, finalRender という製品の紹介記事に目がとまった。

http://www.finalrender.com

finalrender は,フォトンマッピング+モンテカルロ・レイトレーシングを使った,いわゆるグローバルイルミネーションをサポートしたレンダラーだ。フォトンマップ+MCRTってところが,もろ Jensen 先生っぽいけど,なんか絡んでたりするのかな,と勘ぐってみたりする。このレンダラ, Subsurface Scattering もサポートしているそうで,ますますあやしい。

照明のリアリティもさることながら,コークティクスや屈折の表現もすごいし(実写との比較画像がおもしろい), Subsurface Scattering による独特の透明感もおもしろいなあ,とおもった。

こんだけ凝ったレンダラだと,レンダリングに時間がかかりそうだけど,下の fr_klemme.jpg の画像とかで,だいたい10分ぐらいの時間がかかっているそうだ。僕は,相場がよくわかんないんで,これで10分が速いのか遅いのかはよくわからないけど,まあとりあえず実用的な速度ではあるんでないかなあ,とおもう。

フォトンマップの前処理によってかなり高速化されているそうで,速度対画質比については,競合製品に対してかなりのアドバンテージがあるようだ。

http://www.finalrender.com/finalrender/images/the_room_web_o...

http://www.hollywoodcg.com/frgallery/brio.jpg

http://www.freelance3d.de/finalrender/fr_klemme.jpg


ひさしぶりに gnu recordings のページを訪問。

http://www.gnu-recordings.de/

旧アドレスではアクセスできなかったんで,ちょっとサーチしてしまった。

規模が縮小していて,少し残念。でもまあ,復活してよかった。もう戻ってこないかとおもってたんで。新曲は,なんていうか,アシッド・ボサってんですか。そんな感じ。渋いなあ。

旧曲にも良曲が多いんで,ぜひ完全復活してほしいなあ,と勝手におもってみたりした。


gmax

2001-10-08

夕方に起きて,夜に出動した。軽い雨がしとしとと降っていて,ちょっと肌寒い。おもわず忘れてしまうんだけど,今日は月曜日。たしか体育の日だったわけで,今日運動会をやってたところとかあるはずだ。どうだったんだろう。こんな微妙な空模様で。


国内のゲーム業界には SoftImage 神話みたいなのがあって,いまだに旧 SI を使っているところも少なくない。次世代版 SI こと XSI ( "Sumatra" のほうがかっこよかったんだけどなあ)に移行するところもあれば,この機会に Maya に乗り換える動きもあるようだ。スクェアなんかはむかしから Alias 系だから,ずっと Maya なんだっけな。ナムコもいまは Maya 中心になったと聞くんだけど,どうなんだろ。まあとにかく,国内大手デベロッパについては, XSI と Maya の2極化された状態になりつつあるんだとおもう。

ところで,雑誌記事や,社外のひとの話なんかを聞いていると,最近では 3D Studio MAX の勢力もだいぶ強まってきているような気がする。特に海外での 3DS の人気は高いようで,デベロッパ向けの雑誌やウェブの記事では,かならずと言っていいほど 3DS の名が出てくる。プラグインなんかも 3DS 向けのものが用意されていることが多い。

そんなわけで, 3DS についてちょっと探りを入れてみようかとおもって,開発元の Discreet 社のウェブをのぞいていたんだけど,そのうち本題から外れてこんなのを調べていた。

http://www.discreet.com/products/gmax

gmax と呼ばれる3Dツール環境で,内容的には 3D Studio MAX 4.0 のサブセット版に当たるようだ。これが,かわったことに,フリーで配布されている。


ざっと調べてみた感じ,どうやらこれは,ゲームのコンストラクションツールを構築するための統合環境,って位置付けの製品らしい。

海外のPCゲームでは,なんらかの形でコンストラクションツールが用意されていることが多い。ソフトに内蔵されている場合もあれば,おまけ(保証無し)として添付されてたり,ウェブでフリーソフトとして配布されていることもある。共通するのは,たいていフリーで手に入って,作成したデータは自由に配布できるってところだ。

こういうのは, Quake が元祖だとおもうんだけど,ユーザが自作のステージデータやキャラデータを交換することによって,ファンによる自主的なコミュニティが構築され,それによって製品寿命が延びる,って効果を狙っているようだ。

でも,出来のいいコンストラクションツールを0から作り上げるのは,とても骨の折れる作業だ。専業のプログラマを割り当てることも少なくない。0から作るのはたいへんなんで,既存のCGツールのプラグインとしてコンストラクションツールを作ることも多いんだけど,これだと,ユーザにもそのCGツールを用意してもらう必要が出てくる。CGツールはたいてい安くないから,ちょっと無理のある話だ。

そこのジレンマを狙ったのが gmax で,デベロッパは gmax をベースとしてツールを作成することにより工程を大幅に減らすことができ,なおかつ,それをユーザ向けのツールとしてそのまま配布することもできる,というシナリオを描いているようだ。

んで, Discreet はどこから金を吸い上げるのかというと,企業向けにはデベロッパ版 gmax というのが用意されていて,これがようするに MAX 4.0 と gmax プラグインの組み合わせらしいんだけど,企業さまにはこれを買っていただこうということらしい。


コンシューマゲームなんかだと,こういったかたちでコンストラクションツールを配布することは稀というか,むしろ見たことがないんだけど,プランナー向けのツールとしてこういうのを応用するのは,わりといい作戦なんじゃないかなとおもう。

たとえばステージレイアウタなんかをSIプラグインとして作ったとすると,プランナーの分までSIを買わなきゃいけなくて,なんか納得いかなかったりするんだけど, gmax だったら,デザイナは MAX 4.0 ,プログラマは gmax for developer ,プランナは gmax for consumer ,みたいな住み分けができて節約できるんじゃないかと。


しかしまあ,いくら機材費をけちったところで,人件費の数%ぐらいじゃんそれ,とか言われると身もふたもないんだけど……。


GTS, domelight

2001-10-09

気がつくと目覚ましを止めたままの体勢で固まっていた。あぶないあぶない,2度寝してしまうところだったよ。寝袋からもそもそと這い出て椅子に座る。うーん,そろそろこの寝袋,買い換えようかな……。


いつものように flipcode を閲覧。 Doxygen が 1.2.11.1 になってる……。まあいっか。ぱらぱらとヘッドラインを読みすすめていると, GTS (GNU Triangulated Surface Library) の 0.5.0 がリリースとある。なんだろ,これ。

GTS は,その名前の通り,三角形によって構成されたモデルを扱うためのライブラリらしい。概要を見ると,デローニ分割による三角分割や,ブリーアン演算,リダクションにリファインメント, Kd-tree の構築や,トライアングルストリップ化など,けっこういろんな機能が含まれているようだ。しかも,これらの処理を高速に行うってのを売りにしているらしい。

どれも基本的な処理なんだけど,いざ自分で組んでたりするとなかなか手間のかかるもんで,こういうライブラリがあると便利かもしれない。いずれ試してみようとおもう。

http://gts.sourceforge.net/


CG World をなんとなく読んでいて,こんなのを見つけた。

http://www.chuggnut.demon.co.uk/script/domelight/domeligh.ht...

ドーム状の環境マップ画像を入力すると,それからてきとうに光源を割り出し,間接反射っぽい照明効果を作り出す,ってものらしい。

以前,はなげ先生に教えてもらった技にバウンスライトってのがあるんだけど,ようするに,強い照明が壁に当たっている場合に,その壁に弱い照明を置いてやることによって,手作業かつ擬似的に間接反射を表現してしまおう,ってものだった。

この domelight もそういうフェイク技のひとつなんだけど,それなりにラジオシティや大域照明みたいな間接反射が表現できてしまっているところがおもしろい。

ラジオシティや大域照明をリアルタイムで実行するのは,そうとう先の話になりそうだけど,こういったフェイク技だったら,それほど遠くも無い将来に実現できるんじゃないかって気がする。この場合,光源の限界数が増えることと,あとはソフトシャドウが使えるようになることが条件かな。それだけで,それなりの表現ができるようになるとおもう。


統計的にみて晴れ

2001-10-10

011010.png

今日は10月10日。本来なら今日が体育の日なんだな。外ではバケツをひっくりかえしたような強烈な雨が降っていて,しまいには雷まで鳴りだす始末。たしか10月10日ってのは,統計的にみて晴れの確率が高いから体育の日として選ばれた,ってはなしだったとおもうんだけど,どうしたもんだろうね,とおもった。


キューブマップの応用のひとつに,正規化キューブマップってのがある。

(r,g,b,a) = (s,t,r,1) / |(s,t,r)|

となるような画像をキューブマップで張りつければ,フラグメントごとに正規化された法線ベクトルがカラー値として得られる,ってものだ。この値をもとに register combiner や texture shader を使ってライティングを行えば,フォンシェーディングっぽいことができる,ってことになっている。

詳しいところはわかんないんだけど,どうやら,キューブマップの (s,t,r) は同次座標系上で線形補間されるらしい。んだから,とりあえずパースの正しい補間ではあるらしい。でも線形補間である以上,変化のはげしい部分では補間にムラができるはずだ。

これがどんくらいまで耐えられるもんなのか興味があったんで,なんとなく実験してみた。上の画像がそれで,左から6*12分割,9*18分割,24*48分割のトーラスとなっている。いちばん右のが理想なんだけど,まんなかのは,んまあギリギリですかな,ってレベル。いちばん左のは問題外。ムラっていうか,あからさまに誤差がでている。

まんなかのも実は微妙なレベルで,よく見ると対角線方向にスジがでてるし,キワのあたりはかなり残念な感じになっている。まあ,面積が小さければ許せるレベルかな……。あとは,これをもとにスペキュラの演算なんかをやった場合に,どんだけ誤差が浮き出てくるかってところなんだけど,これもまあいつか試してみたいな,とおもった。


ちなみにこのプログラムは, Linux マシンで Mesa 3.5 + PyOpenGL を使って作ったんだけど,Mesaのキューブマップはフィルタに手抜きがあるようで,画像の切れ目のあたりで黒い線が出る現象が起きた。画像をまたいだ補間ってのができてないのかな。近傍サンプリングでは同様の現象は起きなかったので。


Maya Builder, blender

2001-10-11

今日は昨日とうってかわっていい天気。最高気温27度だって。あちー。あまりにも暑いので,おもわず寝坊してしまった。それにしても,会社に泊まりながらにして遅刻とはどういう料簡ですか。


くだんのソフトこと gmax のことを職場のひとと話題にしていると, Maya にも "Maya Builder" というサブセット版があるよと教えてもらう。いやあ,そんなもんあるならはやく教えてくださいよー,といいつつウェブで調べてみる。

http://www.alias-wavefront.co.jp/new_web/product/maya/ma_bui...

Maya からレンダリング関連の機能をそっくり削ったようなもので,モデリング,アニメーション編集についてはもちろんのこと, MEL や Maya API による拡張も可能とのこと。んで,お値段のほうは……,39万円ぽっきり! とのこと。ううーむ。 MAX 4.0 のコンプリートがまんま買えますよ,ってに。

んあー,どうしてくれようか。やはり blender しかないんだろうか。


というわけで blender なんだけど, blender はノルウェーの NaN (Not a Number) 社が開発している統合的なCGツールだ。独自のライセンスにより,無料で配布されている。 API は OpenGL ,フレームワークは Python によって構築されているという,ちょっと変り種のソフトで,マルチプラットフォームに開発が展開されている。ベジェ, NURBS ,サブディビなどの各種曲面表現や, IK によるボーンアニメーション,ラジオシティによるレンダリングなど,機能的にはわりと充実していて,本気になればかなりいけるんじゃないんかこれ,って感じにさせてくれる。

http://www.blender.nl

インタフェースにクセがあることがよく指摘されるんだけど, Python によって統合されているところなんかも,なかなか独特の味わいを感じさせてくれる。各種データ構造やファンクション, GUI なんかが,すべて Python からシームレスにアクセスできるので, Python に慣れているひとにとっては,かなり拡張しやすい構造になっているとおもう。僕もあんま使い込んでるわけじゃないんで,深いところはわかんないけど……。

そんな blender なんだけど,ソフトは無料で手に入るもののマニュアル類はなにも付属されてなくて,習得しようとおもったら,ウェブから少ない情報をかき集めるか,有料の製本されたマニュアルを購入する必要がある。このマニュアルが amazon から購入できるようになったらしいので,さっそく amazon.co.jp に行ってみたんだけど……, amazon.co.jp が落ちてる! なんでこんなときに限ってなー。

いま amazon.co.jp は無料配達サービスをやってるんで,ぜひとも amazon.co.jp から購入したいところ。 amazon.com だと送料だけでばかになんないからね。しかし,なんで落ちてるんだろ。めずらしいこともあるもんだな,とおもった。


TGS'01

2001-10-12

011012.png

今日は東京ゲームショーのビジネス公開日。なんだか妙に天気が良くて,ゲームショーってよりかは,むしろ,幕張公園のベンチで昼寝するのに適しているって感じ。ところで,いちおう入場券は確保しておいたものの,仕事の方がかなり詰まってるんで,おとなしく職場で留守番プログラミング。本当は XBOX の動いてるとこが見たかったんだけど……。


おととい作ったテストプログラムに致命的なミスを発見。キューブマップを法線の正規化に使うには NORMAL_MAP_ARB でもって TexGen してやんなきゃいけないんだけど,間違えて REFLECTION_MAP_ARB でマッピングしていた。ぐはあ,これじゃあぜんぜんだめだって。なんかおかしいなあとはおもってたんだけど。

んで,正しい結果は上の図のような感じ。まったりとした感じになりました。


ゲームショーから帰還してきたひとたちにおみやげを見せてもらう。今年は大手メーカーがこぞってプロモDVDを配っていたようだ。プロモビデオを配ってるところなんかいままで見たことなかったけど,時代も変わったもんですなあ。

んで,XBOX(電撃王)とセガ,SCEのプロモDVDを閲覧。うーん,まあ,どこも特に隠し球はなかったんで,どっかで見たことのあるような画像ばっかだったような気がする。XBOXタイトルについては,はじめてみるのがちょこっとあったけど。

「格闘超人」は,うーん,30fpsなのか。僕は実のところ30fps支持者だったりするんで,そこらへんあんま気にしないんだけど,世間的に許されるかどうかは微妙なところ。非難の的になりそうな気がする。まあ,伊能さんのキャラデザが妙に渋くてかっこいいんで,それでOKってことで。


おみやげのなかに入っていた "Jak and Daxter" の体験版をプレイしてみた。美麗でいて物量感の高いステージモデリングや,ダイナミックかつ滑らかなキャラクタアニメーションなど,CG的な質の高さはさすがは Naughty Dog といった感じで,あいかわらずハイレベルだなあ,とおもった。ちょっと格ゲー的な Jak の動きとか,新機軸でいいんじゃないでしょうか。あと,Jak の呼吸音(「はぁ,はぁ」とか「んはっ!」ってやつ)がいい味出してるなあとおもった。洋ゲーっぽくてさ。

ワールド同士がシームレスに連結されているところとか,ちょっと目立ちにくいけど,なにげに頑張っているんではないかとおもった。こういうのは,非同期なデータ読み込みとか,動的なリソース割り当て,あと座標系の問題なんかもあったりして,技術的には意外と難しかったりする。こういうのをなにげにやってのけてしまうところが,大域的な技術力の高さっていうか,一芸ではない安定した技術力ってのを感じる。

しかし,唯一気がかりなのがインターレスレンダリングを使ってるってとこ。もはやPS2では,よっぽどの理由がないかぎり全ライン(448ライン)レンダリングが当然となっているとおもうんだけど, Jak and Daxter ではインターレス224ラインを使っているようだ。なんかへんなフィルタをかましてごまかしてるっぽいんだけど,やっぱりちらつくのは否めない。慣れてくるとそれほどでもないんだけどね。


いちおう per-pixel

2001-10-13

011013.png

先日,キューブマップを使って正規化された法線を張りつける,ってのをやったんだけど,これと ARB_TEXTURE_ENV_DOT3 と ARB_TEXTURE_ENV_COMBINE を使ってディフューズライティング,ってネタを,こんどはやってみた。

機能的なことを言えば, ARB の渋い拡張よりも, nVidia 拡張の NV_REGISTER_COMBINERS とか使ったほうが派手でいいのは違いないんだけど,せっかく ARB 拡張として ENV_DOT3 と ENV_COMBINE がコミットされたんだから,こっちを使ってみることにした。 ARB 拡張なら Mesa とかでもサポートしてるしね。

で,上の画像が実行結果。いちばん左のが正規化キューブマップと DOT3 を使った「いちおう per-pixel 」なライティングによるもの。真ん中のが普通のグーロシェーディングによるもの。右のは理想的な出力(分割数を上げたもの)だ。

ぱっと見てわかるのが, per-pixel と per-vertex で最終画像がほとんど変わりないってとこだ。ここまでそっくりだと,なにか根本的に間違えてるんじゃないかと不安になるんだけど……,どうなんだろ。

たぶん, DOT3 による per-pixel ディフューズと,頂点ライティング+グーロシェーディングでは,数式的には違うものになるとおもうんだけど,実際にはなにがどう違うのか,深く考えてみたことはない。結果から言えば「たいした差はない」ってことになるんだけど,なんかちょっと納得いかないなあ。

たぶん,スペキュラを求めるときにはグーロより有利になりそうな気がするんだけど,この場合は,演算精度の問題が表面化するんではないかとおもう。しょせんはダイナミックレンジ8ビット(符号付きで7ビット)の演算だから,何度も乗算していると誤差で暗くなってきてしまうはずだ。まあ,実際のところ,そんな累乗できるわけじゃないらしいんで,そんな心配も余計かもしれないけど。


そろそろバーテクスオペレーションに手を出してみたい感じなんだけど,いまいちスタンダードが見えてこないのがいやな感じだ。 EXT_VERTEX_SHADER の登場で, NV_VERTEX_PROGRAM の位置付けもあやしくなってきたし,何を信じればいいのかちょっと判断しかねる状況だ。はやいところ ARB 仕様を出してもらいたいところだけど,どうせまた何年もかかったりするんだろうなあ,とおもってしまうあたりが, OpenGL の唯一の弱点だったりする。


ひさしぶりに sketch のサイトをチェック。ミュージシャン系のサイトは半年に1回ぐらいチェックすると,新しい曲がアップされてたりして,いい感じだ。

http://artists.mp3s.com/artists/3/sketch.html

「癒し系」って言ってしまうと,妙に安っぽい感じがして嫌なんだけど,まあ,いわゆる癒し系ですな。たまにこういう曲をかけながら仕事したりすると,リラックスできていいかもしれない。少し環境系入り気味だったりするんで,BGMとしてはなかなか適しているんじゃないかとおもう。


Blinn Model

2001-10-14

夕方起床,夜出社。先週と同じことを書いてるな,とおもいつつ,実際そうだからしょうがないとおもう。今年の年越しは職場で迎えることになりそうだな。春には暇になってるといいけど……。


僕の使っている環境が貧弱なせいもあって(最高スペックが GeForce2MX ), per-pixel 方面にはさすがに限界を感じつつある。そんなわけで,ちょっと時代を逆行して,前世代向けのレンダリング手法をおさらいしてみようとおもった。


とりあえずやってみようとおもったのが, Torrance-Sparrow モデルを安上がりに実装する,っていうネタ。参考にするのは,以下の資料。

http://www.siggraph.org/education/materials/HyperGraph/illum...

http://www.cs.ubc.ca/~heidrich/Papers/index.html

Torrance-Sparrow モデルとは言っても,実際には Jim Blinn の手法を利用する。 Torrance-Sparrow の式には,指数関数(ガウス分布)や逆余弦が含まれてたりして,なにかと複雑なんだけど, Jim Blinn 御大はそれを比較的簡単な式で近似する手法を考案した。これが一般に Blinn モデルと呼ばれているものらしい。

これを前計算で2Dテクスチャに固めこむ,ってのは Heidrich 先生のネタだ(ネタってのも失礼だけど)。 Torrance-Sparrow モデルは,おおまかに分解すると

拡散関数           D( cos(d) )
フレネル係数       F( cos(t) )
ジオメトリ減衰係数 G( cos(a), cos(b) )

の3つの関数があって,これらの積によって構成されている。だから, D*F を1枚の2Dテクスチャに, G をもう1枚の2Dテクスチャに固めこんでやって,マルチテクスチャで合成すればいい,って仕組みだ。

ただ,この場合,テクスチャ座標となるのは各ベクトルのなす余弦(内積)なんだけど,余弦値ってのは頂点間で線形にはなっていない。特にスペキュラの出るあたりでは弧を描いているはずで,これを平らに線形補間してしまうとスペキュラが潰れてしまうはずだ。


そこで,とりあえず Heidrich 先生の方法を組んでみたあとに,キューブマップを使った方法ってのも試してみて,それらを比較してみたいとおもっている。キューブマップも基本的には線形補間だけど,補間されるのは余弦を取るまえのベクトルになるわけで,余弦値を補間するよりかは理想に近いかたちになるとおもうのだ。少なくとも,スペキュラが潰れるようなことはなくなるとおもう。

ただ,前回のテストプログラムでわかったように,キューブマップによる法線の補間ってのは,思いのほか特性が良くないみたいだから,グラデーションのゆがみは依然出ることになるとおもう。


お気楽かつめんどくさ

2001-10-15

011015.png

まずは,拡散関数Dとフレネル係数Fを固めこんだ2Dテクスチャを作ってみる。前回同様, Python + PIL でちゃきちゃきっと作成。リストにがんがんピクセルを詰め込んでセーブするだけで png とかできちゃうから,お気楽だよなあ,とおもった。

で,とりあえずトーラスに張り付けてみようとおもったんだけど,これがなかなか思いどおりにいってくれない。 Heidrich 先生の paper では,テクスチャ座標として

(s,t,r,q) = (nx,ny,nz,1)

ってのを使っていて,これは GL_NORMAL_MAP_ARB を使えば楽勝かなー,とかおもってたんだけど,どうやら GL_TEXTURE_NORMAL_MAP_ARB で生成されるのは (nx,ny,nz,0) であって,つまり微妙に違うらしい。違いは微妙なんだけど,致命的にだめだなあ,こりゃ。ぬぬ,自分で法線立ててテクスチャ座標を作ってやんないとだめそうだ。うー,めんどくさ。


ちなみに, PS2 ばっか触ってると,テクスチャ座標の q ってパースコレクトに使われるから下手にいじれないんじゃないの,とかおもっちゃうんだけど, OpenGL 的にはパースコレクトってのはラスタライザの処理に閉じ込められているようで,この段階ではどう使ってもいいらしい。便利だなあ……。


そんなわけでやっとこさトーラスを生成して,いざ張り付け。法線を回転させるのに逆転置行列が必要かも,とかおもってどきっとしたけど,回転行列しか使ってないから,このさい必要ないや。あぶないあぶない。


んなこって,まだぜんぜん素材がそろってないものの,とりあえず張り付けてみた結果が上の図。左から,16*24分割トーラスでのフォンモデルのバーテクス版(つまり OpenGL 標準の照明効果),その次が同じトーラスでの仮 Torrance-Sparrow モデルの2Dテクスチャ版。その右2つは分割数を32*48に上げたもの。

まだ半分くらいしか実装してないわけで,フォンモデルと違うのは拡散関数がガウス分布になっていることぐらいなんだけど,これだけでもわりといけてるかなあ,とかおもってしまった。こうしてみると,フォンモデルってスペキュラがきついんだなあ。


積分してむにゃむにゃ

2001-10-16

次はジオメトリ減衰式Gの実装。これは,物体の表面に存在する微小な溝によって光線がさえぎられる現象を考慮したものらしい。 HyperGraph に載っているやつは,溝がV字型であると仮定した場合の式だそうで,3つの余弦を使ってこの割り合いを求めている。

今回の実装では,関数の値を2Dテクスチャに固めこむ方法をとっているんで,パラメータは2つなのが理想だ。 Heidrich によれば, Smith が余弦2つからこれを求める式をあみ出しているらしい。こっちは小平面がガウス分布にしたがって分散していることを仮定として導き出しているそうで,もとのバージョンのアッパーコンパチみたいなもんのようだ。

で,あてずっぽうに資料を探してみたんだけど,なかなか見つかんない。気を取り直して Heidrich の Thesis を見なおしてみると,この式がそのまんま載っていた。む,灯台もと暗し。

ついでにその周辺を見なおしてみたんだけど,それによると, Schlick がこの式の簡単な近似を求めているとある。せっかくだからサーチしてみると,意外と簡単に見つけることができた。うーん,名前がめずらしいとサーチしやすいなあ……。

paper を見てみると,たしかにこっちの方が計算は簡単そう。どうせそんな高尚な目的じゃないんだから,こっちを使わせていただこう。ところで, Smith の式にもあったんだけど,式中にある erfc って関数がよくわかんない。 error function のことらしいんだけど……。なんだそれ。

これもさっそくサーチ。いやあ, google がなかったら,こういう調べもんももっと大変になってることだろうに,とおもいつつ。んで,どうやら, erfc ってのは相補誤差関数のことで,分散が0.5のガウス分布を積分してむにゃむにゃ……,したものらしい。そういえばそんなのも習ったような習ってないような。統計の教科書にはよだれの跡ができてたからなあ。

そんなわけで,めんどくさいんで近似式を使わせていただく。楽ちんですなあ。ちょっと楽しすぎな気もするけど。

http://www.cs.ubc.ca/~heidrich/Papers/index.html

http://dept-info.labri.u-bordeaux.fr/~schlick/DOC/ewr3.html

http://www5a.biglobe.ne.jp/~tenrou/semiconductor/error_funct...


渋さを味わい楽しむ

2001-10-17

011017.png

んなこって,資料はなんとか揃えられたんで,さっそく実装してみる。とりあえず絵を出してみたいんで,ちょっとぐらいの疑問は無視して,とにかく式をがしがし突っ込んでいく。しかしこんな汚いソースじゃ,どっか間違っててもなかなかわかんないだろうなあ,とかおもいつつ。

ややあってテクスチャを生成する部分は完成。係数とかかなりいいかげんだけど,まあなんとかなんべ。次は3Dと合成の部分だ。

合成にはマルチテクスチャを使う。まず D*F を固めたテクスチャをデカルで張り付けて,次に G/cosB を固めたテクスチャを乗算で重ね張りする。最後に, OpenGL の標準の照明を使った拡散光を加算する。この部分には TEX_ENV_COMBINE とダミーのテクスチャを使う。本来ならテクスチャカラーが加算されてしまうところを, TEX_ENV_COMBINE でもってプライマリカラーと入れ換えてしまうのだ。ダミーテクスチャを使うところがちょっと無駄っぽいけど, ARB 拡張で実装しようとおもうと,どうしてもこうなってしまう。マルチパスでやる方法もあるけど,それよりかはずっと高速だろう。

nVidia 拡張があれば Register Combiner とかでもっとダイレクトに対応できるんだけどね。それにくらべると, ARB 拡張はずいぶん地味だ。でも, OpenGL の堅実さってのは,こういう渋めの思想からちゃくちゃくと積み上げられたものなんで,あなどれたもんでもない。 nVidia みたいなのは,どっちかっつえば異端ですな。むしろ,この渋さを味わい楽しむのが, OpenGL との正しい付き合いかただろう,とか勝手に決め付けてみたりした。


それからややあり,とりあえず出来あがったのが,上の図。左ふたつは72*48分割トーラスで,いちばん左がラフネスの低いもの,その右がラフネスの高いものだ。右のふたつは分割数を1/2に落としたもので,ラフネスはおなじものを使っている。

左のふたつは分割数が十分に高いんで,ちゃんとスペキュラがでて当然なんだけど,問題は右のふたつだ。実はこれでもわりと分割数の多い方だとおもうんだけど,スペキュラはかなり潰れてしまっている。ラフネスの低いほうはそれなりの質感が出来てるような気もするけど,これに2レイヤーはちょっとコスト高いかな。光源の数だけ合成が必要になるわけだし。


雨の日

2001-10-18

011018.png

今日は雨の日。冬なみの寒さになるってことらしいんで,ちょっとあったかめの格好をして家を出る。駅まで歩くあいだ,安っぽいビニール傘が狭くて苦しくなった。傘ぐらいまともなの買えよ,っておもうんだけど,なかなか普段,傘買おうなんておもい立つことがないんだよね。雨の日ことなんて,すぐに忘れるから。


blender がバージョンアップ。 OpenGL とのコンパチビリティが向上したらしく, Matrox のビデオカードでも問題なく動くようになったとある。そうそう, blender はなぜか Matrox のビデオカードだと動かないんだっけ。僕も職場では Matrox の G400 がささってるマシンを使ってるんで,いままで blender が動かなくてくやしいおもいをしていたのだ。

さっそく落としてインストールしてみたんだけど,絶妙にまったりとした動作に愕然となる。なんじゃこりゃあ。ポップアップの描画が目で見えるよ。うーん,やっぱり Matrox のドライバはまともじゃないとおもう。 LightWave の動作もいまいちあやしかったし……。


そろそろ mlvwm にも飽きてきたんで,別のウィンドウマネージャを物色してみる。んなわけでピックアップしてみたのが, evilwm だ。

http://evilwm.sourceforge.net/

これ以上削ってしまったら,たぶんウィンドウマネージャではなくなってしまうんではないか,ってぐらいの削りっぷりがすばらしい。「装飾はウィンドウ枠1ピクセルのみ」とのことだけど,さっそく0ピクセルにする。うむ,それっぽくなった。どうせ kterm と Electric Eyes ぐらいしか使わないんだから,これでいいのだ。


もはや不可抗力なんじゃ

2001-10-19

仕事がいよいよ佳境に近づいてきた。こういう忙しい時期に限って体調をくずしてしまうってのは,よくありがち。案の定,職場にも風邪をひいてしまったひとがいるみたいだ。しょっちゅうけほけほ聞こえてくる。

僕は,風邪ってのはひくときはひいてしまうもんで,もはや不可抗力なんじゃないかとおもってるんだけど,とりあえずひととおりの用心はしておくことにする。手洗い,うがい,風邪をひいたひとに近づかない,死体を焼く(土葬はダメ),ケツにネギを突っ込む,えーと,あと何よ。


今週の Gamasutra の 特集 "Implementing Crack Protection for SPYRO: Year of the Dragon" を斜め読み。 "Spyro: YOTD" のクラックプロテクションに関する話だ。本文によると, "Spyro 2" のときは1週間足らずでクラックされてしまったのが, "Spyro: YOTD" ではクラックプロテクションの強化によって2ヶ月もたせることができたんだそうだ。がんばってプロテクションかけて,それでもたった2ヶ月ですか,ってなとこなんだけど,ソフトの最終的な売り上げの半数近くは発売から数ヶ月以内に売れるもんなんだそうで,最初の2ヶ月守られたというのはそれなりの意味があるらしい。

はたして北米圏にどんだけの潜在的なクラックユーザがいるんだか,よくわからないけど,こんなふうに真面目に取り組んでるぐらいだから,そうとうな数がいるのかもしれない。東南アジア圏での違法コピーの蔓延っぷりはよく耳にするけど,日本では,それほど深刻な話は聞いたことがない。

しかし,たとえ少数でもクラックされている現状を認識しながら対処せずにいると,それを暗黙の容認と解釈されかねないってこともある。クラック行為を拒否する意思表示としても,プロテクションってのは必要なのかもなあ,とかおもった。

ところで,この記事を読んでいると,なんとなく,古きよき国産PC時代のころの,コピープロテクションのことを思い出す。 Gamasutra のくだんの記事には,凝ったプロテクションはかえってクラッカーの楽しみとなってしまう危険性がある,とか,プロテクションを即座に作動させてしまうとクラッカーにヒントを与えてしまうことになるので,ならべくわかりにくい効果を仕掛けておくといい,とか,いろいろ書かれているんだけど,こういうのって,当時,僕も実際に身をもって体験したことのあることばかりだ(もちろん,そのときはクラックする側だったんだけど)。だからどうってわけでもないんだけど,なんだか,とても懐かしい気分になった。


パン屋まで

2001-10-20

011020.png

昼,机の下から這い出して,顔を洗い,昼食を取ろうと近くのパン屋まで道を歩いていく。なんだか今日はとてもいい陽気で,春の日のようなやわらかな日差しにつつまれて,なにげに気分もあたたかになってくる。毎日こんな調子だといいんだけど,きっと忙しくてあくせくしているうちに,とっとと冬になって,雪とか降り出したりしちゃうんだろうなあ,とおもった。


先日組んでみた2Dテクスチャによる blinn モデルの実装を,キューブマップに拡張してみる。キューブマップは,単純に使えば,2つのベクトルを変数に持つ関数の固めこみに使える。 blinn のモデルでは,

D(N,H)
G(E,N)
G'(L,N) / (L,N)

の3つに割ると都合が良さそうだ。フレネル係数については,「平行光源および平行透視」って近似のもとでは全ピクセルで同一の値になるから,ベースカラーとして組み込むことにする。

とまあ簡単にできそうな感じだったんだけど,ちょっとした落とし穴があった。 OpenGL (や多くのAPI)では,カラー値ってのは [0,1] の値でしかない。上の3つの式のうち, D と G'/(L,N) はかなり広い値域を持つので,そのままテクスチャに固めこむと潰れてしまう。

これを避けるには,値に 0.25 とかスケールをかけておいて,合成後に4倍とかすればなんとかなるんだけど, OpenGL のαブレンディングでは1以上の値を設定することができないので,拡大方向にスケールをかけようとおもったら,ちょいと苦労することになる。

glBlendFunc(GL_DST_ALPHA,GL_ONE)

って感じでやっと2倍。4倍しようとおもったら,これをもう一度繰り返さないと……。

texture environment の中では GL_ALPHA_SCALE の指定によって,αを2倍もしくは4倍にスケールできるんで,こういった処理もだいぶ楽になる。しかし,うちの GeForce2MX はテクスチャユニットが2つまでなんで,上の3つの式を合成するには, texture environment のなかにはぎりぎりおさまらなくて,どうしてもマルチパスになってしまうのだ。


そんなわけで,いろいろ試行錯誤した結果,とりあえず妥協してみたのが上の図。ここでは

           pass 0               pass2   pass3     pass4
[(G) * (G'/(L,N)*0.25) * 2.0] *   D   *   2   +  Diffuse
 tex0       tex1        scale

ってしているんだけど,こんなので4パスはどう考えても無駄過ぎ。それに,パス0の時点で,ほとんど濃淡のない画像になってるんで,ほとんど関数Dだけでハイライトが決まっているって状態。こいつはどうにも無駄過ぎる……。

テクスチャユニットが4つあれば,それなりにうまくまとめることができるとおもうんだけど,そもそも G や G' までキューブマップにする必要性ってのはあまりないのかもしれない。ハイライトを特徴的にしているのは,やはり D の存在なので,こいつだけキューブマップにして,あとは前回の2Dテクスチャの方法を使うのがいいかも,ってとこだ。これだったら2テクスチャでもうまくまとめることができそうだ。


月見のやつ

2001-10-21

今週も日曜は夜出動パターン。マックで月見のやつを買って職場につく。ところで,この月見のやつの月見の部分って,やけに正確なかたちに焼けてるんだけど,どうやって焼いてるんだろう,といつもおもう。

僕が考えるに,まず卵を白身と黄身に分離して,シリンダー形の容器でもって白身の柱を作り,その芯をくり抜いて黄身を流し込み,固めて金太郎飴状態の月見ができたところで,スライサーにかけてあのひらべったい月見を作っているのではないかと。まあもしくは,月見形の卵を産む鶏を遺伝子合成してるんだろうな。


AKIBA PC Hotline! によると, RADEON 8500 と GeForce3 Ti の販売が始まっているようだ。どちらもそれなりに安い。これは買いかもなあ。どちらの会社も OpenGL ドライバの品質は高水準をキープしているようなんで,この際どちらでもいいかなあ,とおもう。

Delphi3D の OpenGL Hardware Registry を見るかぎりでは,どちらも欲しい機能はほぼ満たしているんで,あとは派閥の問題かな。将来的には ATI の EXT_VERTEX_SHADER の方が有利になりそうな気がするけど……,どうかな。

http://www.watch.impress.co.jp/akiba/hotline/20011020/radeon...

http://www.delphi3d.net/hardware/listreports.php


スタックに積まれた仕事

2001-10-22

011022.png

忙しい……。息つく隙もなく仕事してるってのは珍しいことかもしれない。それだけふだんダラけてるってことなんですけどもな。

でも実は,いつもみたいに悩みながらプログラミングしているよりも,いまみたいに単純に作業をこなしている方が楽だったりするかもしれない。何も考えずに,スタックに積まれた仕事を POP, POP, POP ……。そんなわけで,せめて来週には一息つけるといいな,とおもった。


先日作った中途半端な Torrance-Sparrow のアレを,てきとうにネコに張り付けてあそんでみる。ネコの素材は 3D Cafe から拾ってきたもの。フリーの3D素材集サイトなんだけど,いまいち権利関係のあやしい素材がたくさん置いてある。質はあんま良くないけど,テストプログラムに使う程度だったらこれでもいいだろう。

http://www.3dcafe.com/

ネコのモデルをダウンロードして, LightWave を介してテキストで吐き出させ, Python でもって Python ソースに変換する。これで cat.py の完成。ティーポットやトーラスだけじゃ飽きるから,これからはネコも使っていこう……。でも,いざレンダリングしてみると,おもったよりもローポリで,いまいち使いにくいかもなあ,とおもった。

将来的には,ここのフローに blender を噛ませたいとおもっている。 blender で編集して, python スクリプトでデータを吐き出させて, GTS を使って加工変換,ストリップ化,って感じで……。そういえば, GTS も,まだあんま調べてない。どうやら GLib を使っているらしいので,まず GLib から試してみようとおもっていたのだ。僕は,速度重視のツールはもっぱら C で作ることが多いので, GLib をレパートリーに加えとくと,それなりに役に立つんじゃないかとおもっているのだ。

http://gts.sourceforge.net/

http://www.gtk.org/


屈強なこれたち

2001-10-23

忙しい,忙しい……。まさに忙しさ満開。未実装の仕様書とバグ報告の山に囲まれた僕たちは,先を争うように新しいコードをコミットし続け,リポジトリには分刻みのリビジョンコードが刻まれていく。それと, make の連打攻撃を受ける Linux サーバたち。普段は屈強なこれたちも,今日みたいな日はさすがに重ったるい動きになってくる。ツイストペア経由で人意を受け,怒涛のような勢いで100V電流を熱と電磁波に変換しつづけている。熱力学的に見ればこいつらも単なる熱変換機なんだけど,僕らはむしろこれをたくさんのお金に変換しようとしている。それは成功するかどうかわからない。でもたとえそれが成功したとしても,それは今こいつが熱を大気中に延々と放出し続けているのと同じくらい,どうでもいいことなのかもしれない。どうでもいいことなのかもしれないけど,そうするしかないんだから,そうなんだよ,とおもったりした。


PS2 と HHK

2001-10-24

今日も今日とて,ぽちぽちとコーディング。がしがしと打鍵する手を休め,端末として使っている PS2 Linux のキーボードをふと覗き込んでみると,キートップの刻印がはがれ始めているのに気がつく。もうぼろぼろだ。まだ数ヶ月しか使ってないのに。

PS2 の純正のキーボード&マウスは,おおよそ安っぽさの目立つ製品だ。キーボードはくだんのとおりだし,マウスも接触ローラー式のだめっぽいやつだ。いちおう色とデザインは統一されているんで,セットにするとそれなりに格好はつくんだけど,単体で見ると,ただの脱力感あふるる製品でしかない。ゲーム機だからってこういうところをおろそかにしちゃうのは,まずいとおもうんだけど……。たとえコスト的な理由だあるとしてもだ。

僕は PC ではもっぱらハッピーハッキングを使ってるんだけど,こいつはそれなりの値段がするだけあって,かなりまともな作りをしている。初代 HHK の方はかれこれ2年ぐらい使ってるけど,刻印がはがれることも,バネがヘタることも,いまだ気配もない。基本的なコンセプトの時点でいろいろ考えることはあるものの,純粋に製品の品質を評価するならば,十分に合格点に達する出来だとおもう。

http://www.pfu.co.jp/hhkeyboard/


あと,黒いキーボードはゴミやホコリが目立つのが嫌だなあとおもった。プログラマはキーボードの上でものを食うから,キーのあいだはいつもゴミだらけなんじゃよ……。


2001-10-25

うー,忙しい。今日,明日が峠っぽい。なんとか今週を乗り切れば少しは楽になるとおもうんだけど……。

あんまり忙しいんで見逃してたんだけど,セガの PS2 ソフト第一弾こと "Rez" が,いつの間にか出てたらしい。このゲームは,ちょっとかっこつけすぎっていうか,内容が濃すぎてカジュアルなユーザには着いてけないんじゃないかなあ,って気がしないでもないけど,開発コスト安そうだし,ぜんぜんOKなのかな。

まあとりあえず,いちどやってみたいです。時間ないけど。


フォース

2001-10-26

朝日を見つめながら寝袋に身を沈めるのが定型になりつつある今日この頃。ファーストフードは友達です。そしてモスバーガーは,やっぱりファーストフードじゃないよな,と確認した。


「バーチャロンフォース」がやっと稼動開始らしい。ずいぶん前から話はあったような気がするんだけど。初代「バーチャロン」と「オラトリオ・タングラム」は,人差し指の付け根にタコができるぐらいプレイしたんだけど,なんかもうさすがについてけないです,最近は。

「フォース」は, NPR を意識しているのか,静止画像の見た目はかなりのっぺりした感じがする。あいかわらず不透明エフェクトが多いような気がするんだけど,もはやこれは「味」と割り切ってしまっているんだろうか,とおもった。 MODEL2, MODEL3 でやってたころは,ハードウェアが半透明に弱いってこともあって,やむをえず不透明系のエフェクトを模索してたんだとおもうけど, NAOMI (NAOMI2?) にもなって同じことをやっているってのは,たぶん作為的なものがあるんだろうとおもう。


前世代( PS1 とか)では,ラスタライザ側の制限もあって,加算系のエフェクトが多用されていたんだけど,最近では,さすがにアルファブレンディング系のエフェクトが増えてきた。しかし,アルファブレンディングではZソートが必要なんで,やはりちょっとコスト高な印象がある。よっぽど制限されたゲーム(三国無双みたいなのとか)では,まだ加算エフェクトの出番が多いとおもう。

次回はぜひとも,パーティクルエンジンをVUに閉じ込めてしまいたいなあ,とかおもってたんだけど,Zソートのことを考えると,なかなか頭が痛い。点パーティクルとかだったらソートしなくてもぜんぜんいいんだけど,煙とかみたいな大きなスプライトを使うやつでは,やはりソーティングがないと違和感が出てしまうとおもう。もちろん,シーン中の半透明物との相関も考えなきゃいけないわけで……。あーやっぱり半透明はめんどくさいなあ,とおもった。


肩こり

2001-10-27

うーん,いままで1日ごとに1泊ペースを保っていたんだけど,ついに2泊する日が来てしまった。絶妙なタイミングで終電を逃してしまったのだ。締め切り間際は時間的拘束がきびしくなるんで,たとえ仕事量的にはたいしたことなくても,乱れた生活になりやすい。

まあ,そんなわけで夜中も仕事。朝帰って家で寝ようとおもったんだけど,時間通りに起きれる自信がなかったので,会社で昼まで寝たのちに,風呂のために帰宅する。んで,着替えたらすぐ出社。こういうときに,家が中途半端な距離にあるのが,とても恨めしくなる。

それほど根をつめているわけでもないんだけど,なぜか肩が痛くなってきた。肩マッサージ機欲しいなあ。あと,足ツボマッサージ機なんかもいいかもしれない。ああ,もう,おやじくさくてかなわんわ。どうしてくれる。


indent

2001-10-28

最近,異様に忙しくなっていた仕事に,ひとつの区切りがついた。長く続いた拘束から開放され,朝の電車で家に帰る。これでやっと一息つける……。まあ,またじきに忙しくなるのはわかりきっているんだけど。


職場のひとに,自動生成されたコードが読みにくいと指摘された。オブジェクトの挙動制御とかって,普通にのっぺりと C で書いてると定型的な処理が多くなるんで, python で作った簡単な生成プログラムを使ってソースを吐かせているんだけど,この生成コードは人が見ることを想定していないんで,かなり汚い出力になっているのだ。

んじゃあってわけで, GNU の indent というソフトを試してみる。 C のソースファイルを整形するフィルタだ。前から名前は聞いたことがあったんだけど,使ってみるのは初めてだったりする。


とりあえず,適当なコードを書きくだしてみる。

#include <stdio.h>

/* main procedure */
int main( int argc, char**argv )
{
    int i, sum = 0;

    puts( "Hello world!" );

    /* for each argument */
    for ( i=0 ; i<argc ; i++ )
    {
        puts( argv[i] );
        sum += i;
    }

    printf( "sum=%d¥n", sum );

    return 0;
}

特にこだわりはないんだけど,なんとなくいつもこんな感じで書いている。んで, indent に GNU 式の整形をさせてみると,こんな感じになる。

#include <stdio.h>

/* main procedure */
int
main (int argc, char **argv)
{
  int i, sum = 0;

  puts ("Hello world!");

  /* for each argument */
  for (i = 0; i < argc; i++)
    {
      puts (argv[i]);
      sum += i;
    }

  printf ("sum=%d¥n", sum);

  return 0;
}

うーん。 emacs とか使ってる人には馴染みあるのかもしれないけど,ふたんから素でこう書いてるひとはなかなか珍しいんじゃないかとおもう。中カッコが中途半端にインデントされているところとか,かなり独特な気がする。これには,それなりの理由があるらしいんだけど。

んで,次は K&R 方式。つまり正統派ってことになるのかな。

#include <stdio.h>

/* main procedure */
int main(int argc, char **argv)
{
    int i, sum = 0;

    puts("Hello world!");

    /* for each argument */
    for (i = 0; i < argc; i++) {
        puts(argv[i]);
        sum += i;
    }

    printf("sum=%d¥n", sum);

    return 0;
}

こんな感じで書くひとは,わりと多く見かけるような気がする。密度が高いんで,それなりにさっぱりして見える。

最後はバークレー方式。 BSD のソースで使われていたものらしい。

#include <stdio.h>

/*
 * main procedure
 */
int
main(int argc, char **argv)
{
    int             i,
                    sum = 0;

    puts("Hello world!");

    /*
     * for each argument
     */
    for (i = 0; i < argc; i++) {
        puts(argv[i]);
        sum += i;
    }

    printf("sum=%d¥n", sum);

    return 0;
}

コメントまで整形されてしまった。変数宣言がタブされていたりとか,全体的に間延びしているような印象がある。


まあこのさい,書式なんてどれでもいいかなとおもうんだけど,何もルールがないと書き方に迷ってしまうことがある。そういったときに,既存の書式や,機械変換に頼るっていうのはいい方法かもしれない。そこであえて車輪の再発明をする必要もないだろう,ってことで。


glib

2001-10-29

011029.png

ひさしぶりにゆったりした朝。昨日まではあんなに殺気立っていた職場が,ひっそりと静まり返っている。オフィスのご近所さまであるところの某チームは,数年間に渡って続いたプロジェクトについに終止符を打ち,しばしの間の休息に入っているようだ。そんなわけで,職場はいつになくとても静か。ゆっくりとまずいコーヒーを飲みながら,最近の ign の記事は insider 向けばっかでうざったるいなあ,とかおもったりしていた朝だった。


やっとこさ, glib に手を出してみることにする。よさげなチュートリアルが見つかったからだ。

http://www-6.ibm.com/jp/developerworks/linux/000811/j_glib.h...

http://www-6.ibm.com/jp/developerworks/linux/001020/j_glib2....

とっかかりはそんな難しくなさそう。んなわけで,練習がてら, GScanner を使って VideoScape 形式のオブジェクトファイルを python ソースに変換するプログラムを組んでみる。


使ってみた感じ,おおざっぱな雰囲気は, C++ でいうところの STL に似ているかなあ,とおもった。リスト構造やハッシュ,文字列操作など,基本的なデータ構造と関数がひととおり揃っている。 STL と比べて優れている点があるわけでもないんだけど,まあ, C++ 嫌いなひと(僕を含む)にはいい逃げ道なんじゃないかとおもう。


3D Cafe で適当な DXF を拾ってきて, blender に食わせ, VideoScape 形式で吐き出したあとに,さきほどのプログラムで python ソースに変換する。んで, pygl で出してみたのが,上の絵。べつになんの変哲もないけど……。

ところで,このモデルは3万ポリぐらいあるんだけど,こんだけのポリ数になると, pygl ではディスプレイリストを作るだけでも数十秒かかってしまう。さすがに pygl にも限界を感じるところだ。そろそろなんとかしないと効率悪いよなあ,とおもった。


glib for Win32

2001-10-30

glib の使いかたはなんとなく分かった気がするので,さっそく GTS を試してみることにした。

http://gts.sourceforge.net/

まずは glib のインストールからだ。 GNOME ベースの Linux なら何もしなくていいんだけど, Windows の場合は glib for Win32 をインストールしておかなきゃいけない。 glib for Win32 は gimp for Win32 のページで手に入る。

http://user.sgic.fi/~tml/gimp/win32/

GTK+ は使わないんで glib と iconv だけでいい。

アーカイブを展開してから,

glib-1.3.dll
gmodule-1.3.dll
gthread-1.3.dll
iconv-1.3.dll

を( cygwin 環境の) /usr/local/bin に手動でコピーする。

続いて,

glib-1.3.a
gmodule-1.3.a
gthread-1.3.a

を /usr/local/lib にコピー。

次に, /usr/local/lib に glib/include を掘って, glib のヘッダファイルを全部そこへ突っ込む。

最後に glib-config っていう,コンパイラの設定を自動化するスクリプトを用意してやんなきゃいけないんだけど,これは glib for win32 のアーカイブには含まれていないようだ。ソースの方を落とせば入ってるのかもしれないけど,めんどくさいので, Linux マシンからスクリプトを拾ってきて,適当に書き換えたもので済ませてしまった。まあ, Windows の方は,動けばいいや,ぐらいの心構えなので,これで良しとすることに。

これで glib のセットアップは不完全ながらも一応終了。あとは GTS のソースを落としてきて "./configure; make; make install" するだけだ。


んで,さっそく,独立三角形群をストリップ化するプログラムを組んでみたんだけど……いまいちうまくいかない。

gts_surface_read( surf, stdin );
strip_list = gts_surface_strip( surf );

これで strip_list にストリップ列が得られるはずで,実際,そこまではうまくいってるみたいなんだけど,いざ GL に流し込んでみると,繋がりの変なストリップになってしまっている。

gts_surface_strip の解説をみてみると,

a list of triangle strips containing all the triangles of s.
A triangle strip is itself a list of successive triangles
having one edge in common.

とある。どうも,得られるのは単純なストリップではなくて,ファンとストリップが混在したようなものになっているようだ。


ファンとストリップが混在している場合,頂点スキップの機能( PS2 で言うところの「描画キック無し」かな)があれば簡単に対応することができるんだけど, OpenGL にはスキップの機能がない。むりやり繋げちゃうって手もあるけど,ノイズになりそうな気がするから,無難にストリップを切っていったほうがいいのかもしれない。


triangle strip

2001-10-31

011031.png

なんだか知らないけど,昨日の夜から微妙に胃腸の調子が悪い。職場でそのことを話してみると,わりと多くのひとが同じような症状を訴えていた。うーん,今年の風邪は腹に来るってことなんだろうか。それ以前に,風邪をひいてる自覚がほとんどないんだけどなあ。


昨日に引き続き, GTS で独立三角形のストリップ化をこころみる。とりあえず,ファンになっているところを無理やり切断して出力するようにしてみたんだけど,どうにも無駄が多い。上の図の,左の方が GTS の出力するストリップそのもので,右が加工を加えたもの。ひと目でわかるように,右の方がだいぶ破片が多い。左のストリップは3000頂点で構成されているんだけど,これを加工する過程で655回の切断が発生して,右のストリップでは4310頂点になってしまっている。

まだぜんぜん適当に作ってるんで,だいぶ改善できるところがあるはずだ。切断の検知や,頂点の送りなおしの部分とか,かなり何も考えずに作ってあるんで。


ストリップでおもい出したのが, Hoppe 先生の "Optimization of mesh locality for transparent vertex caching" 。ただ単に繋げられるだけ繋いどくんじゃなくて,頂点キャッシュの構造を考慮して,局所性のあるストリップを作るようにするといいんじゃないの,って内容のようだ。

http://research.microsoft.com/~hoppe/tvc.pdf

聞いた話によれば,頂点キャッシュに乗っている頂点を参照した場合,頂点オペレーションのほとんどがスキップされるんで,かなり速くなる,ってことになっているらしい。だから,こういうのはわりと効果あるのかもしれない。

本気で作るんだったら,ここまでやるのかもしれないけど,趣味としてはちょっとおおげさな気もするんで,今回はパス。とりあえず, GTS でできる範囲で済ませてしまおう,とおもった。