うえぽんSW局

古いタイプの日記ブログです。気まぐれに更新してます。

2010年06月

DEEP FEAR


 今アメリカのメキシコ湾で海底油田事故が起こっていますが、不謹慎にもそれにちなんで「DEEP FEAR」をプレイしました。初プレイです。
 「DEEP FEAR」の舞台は海面下300mに建てられた海底基地ですが、メキシコ湾の海底油田事故は1500mともっとずっと深いところです。300mでも大変なのに1500mはもっと大変だと想像できます。

 ゲーム内容ですが、当時も散々言われましたが一言でいうとバイオハザードの二番煎じです。(実はバイオハザードはプレイしたことないのでよく分かりませんが)

 さて、ゲームをやるとき「視点」に注意しながらプレイしたのですが、「DEEP FEAR」はゲームにしては珍しい視点で作られていると思いました。
 ここでいう「視点」とはカメラの視点ではなく、小説などでいう視点です。立場といった方が分かりやすいかもしれません。小説の視点には大きく分けて2つあり、特定人物の視点で語られるものと、第三者視点(神視点ともいわれる)で語られるものがあります。特定人物の視点で語られるタイプは、その人物が見たり聞いたりしたことしか語ることができないという制約があるのに対し、第三者視点では好きな所へ視点を移動することができます。それぞれ長所と短所がありますが、詳しいことは小説の書き方サイトや本を見てください(いい暇つぶしになります)。
 で、ゲーム全般における視点はどうかというと、主人公(プレイヤー操作キャラ)の視点で語られることが圧倒的に多いです。プレイヤー=主人公の関係を保つために自然とそうなったのかもしれません。

 「DEEP FEAR」に話を戻すと、これは第三者視点で語られている部分が多々見られます。
 例えば、上官が潜水艦で逃げるシーンがあるのですが、主人公の視点では潜水艦で逃げたのは分かるものの、潜水艦の中で何が起こっているのかまでは分かりません。そしてここでムービーが流れ、潜水艦の中の状況がプレイヤーにだけ明かされます。結果シュレディンガーの猫よろしく上官の生死はプレイヤーだけが認識することになります。
 こうして主人公とプレイヤーの認識にズレが生じるわけですが、ゲーム進行に問題がないので無視されているのかもしれません。ただ、「主人公=プレイヤー」を重視するRPGではまずやらないことだと思います。(もし主人公にも生死を明らかにするなら、潜水艦に設置されたカメラを使って中の状況を映し出すだとか、無線でSOSを発信させるだとか工夫がなされるはず)
 他にもこういう認識がずれるシーンがありますが、ネタバレになるので書きません。

 映画は第三者視点で描かれることが多いですが、もしかしたらこれを見て「映画みたい」という印象を持つかもしれません。
 以上、素人の講釈です。

DEEP FEAR
セガ
1998-07-16



【余談】
 海底油田事故にちなんでプレイしたけど、実は小惑星探査機「はやぶさ」にも関連してた。
 宇宙から何か持ってくるとやばいよ。
このエントリーをはてなブックマークに追加

 「ガウスぼかしフィルタ」を0.3.0にver upしました。
 AviUtl プラグイン フィルタ by うえぽん

 部分的にぼかすのはAviUtlのお部屋の「拡張編集Plugin」のみできるため、「ガウスぼかしフィルタ」の役目はほとんどなくなりかけてましたが、差別化ということでシームレスな感じにぼかせるようにしてみました。

 今までのタイプだとこのように境目がありました。

ガウスぼかし_従来タイプ


 [シームレスな感じにぼかす]をチェックするとこのように境目が目立たなくなります。

ガウスぼかし_シームレス


 これ以外にも頑張って速度アップとかしています。
 ちなみに。逆数の近似値(_mm_rcp_*で得られる値)をニュートン法で高精度化して除算命令の代わりに使うなんてこともしています。除算は遅いので速度アップの可能性がありますが、しかし、そもそも除算をあまり使わないので効果はあまりありませんでした。
 高精度化の方法ですが、A の逆数近似値を X とすると
 X = 2*X - A*X*X
 という計算でできます。
 _mm_rcp_*で得られる近似値の精度が11bit、高精度化で2倍の22bit精度になります。単精度浮動小数点の精度が23bitなので、だいたい同じ結果になります。
このエントリーをはてなブックマークに追加

 要望があったので rgb2yuy2 の BT.709 版を作成しました。
 いつものところにアップしてあります。
 ついでに「内部もBT.709」という色変換プラグインも作って公開してます。
 AviUtl プラグイン フィルタ by うえぽん


 さて、これを作っていて思ったのですが、RGB素材をUVダウンサンプリングしてBT.709で出力する際は、「内部もBT.709」色変換プラグインを用いて行わないと若干劣化してしまいそうです。
 とりあえず、rgb2yuy2(BT.709) の AviUtl内部(YC48) から YUY2 へ変換している部分を見ればなんとなく意味が分かると思います。

// 内部YC48 左(y0, cb0, cr0)、右(y1, cb1, cr1)
// 出力YUY2(Y0, U, Y1, V)

Y0 = ( (219*y0 - 27*cb0       -  48*cr0       + 2048) >> 12 ) + 16;
Y1 = ( (219*y1 - 27*cb1       -  48*cr1       + 2048) >> 12 ) + 16;
U  = ( (        228*(cb0+cb1) +  26*(cr0+cr1) + 4096) >> 13 ) + 128;
V  = ( (         17*(cb0+cb1) + 230*(cr0+cr1) + 4096) >> 13 ) + 128;

 AviUtl内部(YC48)はBT.601ベースになっているので BT.709 のYUY2で出力するには色域を変換する必要があります。変換に際して輝度Y0,Y1を求めるには色差情報も必要になります。で、左右の色差の平均を求めるタイミングが問題になります。
 UVダウンサンプリングフィルタは色変換プラグインの前の AviUtl内部(YC48)のBT.601 ベースで行います。UVダウンサンプリングフィルタは左右のピクセルの色差を同じにします。そうすると色変換時に輝度Y0,Y1を求めるための色差も左右で同じになってしまいます。これによって最終的な輝度情報が少しだけ劣化しまうわけです。

 というわけで、解決方法はないか何かと考えたら、AviUtl内部(YC48)もBT.709ベースにしたらどうかと思いついたわけです。そんなわけで「内部もBT.709」色変換プラグインを作った次第です。

このエントリーをはてなブックマークに追加

 「lua for AviUtl」を修正しました。バージョンは 0.0.10b です。
 AviUtl プラグイン フィルタ by うえぽん

 最近はGPUを使ったAviUtlのプラグインが多いですが、それと一緒にlua for AviUtlを使うとなぜか誤動作していました(GPU使用プラグインを無効にしていても誤動作する)。
 色々調べたところ luaconf.h のこの部分がクラッシュの原因だったようです。注釈にもDirectXと一緒に使うとたまにクラッシュすると書いてあります。

/* the next trick should work on any Pentium, but sometimes clashes
   with a DirectX idiosyncrasy */
#else

union luai_Cast { double l_d; long l_l; };
#define lua_number2int(i,d) \
  { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
#define lua_number2integer(i,n)		lua_number2int(i, n)

#endif

 double型からint型へのキャストを高速に行うトリックのようです。
 このトリックを使わずに普通にキャストするようにしたらクラッシュしなくなりました。

 平方根を高速に求めるものでもこの手のトリックが使われることがありますが、そういうのは誤動作を避けるためにもあまり使わない方が良いかもしれません。

このエントリーをはてなブックマークに追加

↑このページのトップヘ