PS1風ゲームを作るための3つのレベル

asobu
13 min readMay 1, 2020

--

(English version available here: https://medium.com/@asobu/the-3-difficulty-levels-for-developing-a-ps1-like-game-3508f24410c7)

asobuのコアメンバーの一條です。asobuでは、日本のインディーゲームクリエイターの皆さんへasobuの活動とコミュニティを紹介する役割をしています。

もちろん私もゲーム開発者でして、今はNintendo Switch向けのロボットバトルゲーム『デモリッション ロボッツ K.K.』を開発しています。GDC2020で展示…予定だったのですが、あえなく中止となったため、なにかオンラインの展示イベントは無いかな…と別の機会を探しているところです。

今回はこのゲームの話ではなくて、私が過去に開発した『Back in 1995』についてのお話です。

『Back in 1995』

https://backin1995.com/

このゲームは、「PlayStationに代表されるポリゴン黎明期のビジュアルにもピクセルアートと同等の価値があるのではないか」という仮説をもとに、2015年にコンセプトビデオを発表、2016年4月にゲームとしてSteamにて発売したタイトルです。

現在、制作発表から5周年を記念した50%オフセールを実施しています。

最近ようやく「PS1風表現」が世界中のインディーデベロッパーの間で流行りだしてきた雰囲気を感じますので、私個人的に「よくできている」PS1風ゲームは何なのか、というお話をします。

これから話すテクニックのすべての条件を満たさなければPS1風ゲームではない、と言いたいわけではありません。様々な方法があるPS1風表現において、こだわりたいポイントはディベロッパーに委ねられているべきです。ここでは3段階の難易度レベルに分けて紹介します。

レベル1:ハード性能の上限を再現する

最低限やらなくてはいけないのは、PS1のハードウェアスペックの確認です。

Sony PlayStation仕様

  • CPU: R3000A 33Mz
  • GPU: 2D処理用GPU + Geometric Transfer Engine (GTE)
  • RAM: EDO DRAM 2MB
  • VRAM: SGRAM 1MB
  • Sound LSI(PCM音源): Sound Processing Unit (SPU)
  • Media: 倍速CD-ROMドライブ

PS1のポリゴン処理能力は、36万ポリゴン/秒であるといわれています。そのため、30FPSのゲームならば1フレームに12,000ポリゴン。他の処理も大量にありますから、1画面内に収まる総ポリゴン数は1万ポリゴンあたりに納めなくてはならない、ということでです。

また、GPUが送出できる画面解像度は256 x 224 から 640 x 224(インターレースモード)でした。Back in 1995では画面の見栄えや情報量から、320 x 224を設定しています。ゲーム開発環境によっては、低解像度の画面を拡大表示することが難しい場合もあります。Unityでは、Render Textureという描画結果をテクスチャに貼り付ける機能を使って処理しています。

解像度はもちろんフォントにも影響します。低解像度でもよく読めるフォント、12ptから14ptのフォントが望ましいです。『Back in 1995』は日本語も含むため、「東雲フォント」を使用しています。

加えて、CD-ROMからのローディング待ちをわざとステージの切り替えタイミングなどに入れると効果的です。数MBのデータを読み込むことなどは、現代のPCやコンソールにおいては数フレームも使いません。しかし、ロードはストレスのもとにもなるのでヤリスギは注意です。「Back in 1995」では、4秒程度のフェイクロードを挟んでいます。

まとめると、次の通りです。

  • 画面解像度を256 x 224 から 640 x 224に設定する
  • キャラは500から1000ポリゴンで作成する
  • 1画面に1万ポリゴン以内のデータ量とする
  • フォントを低解像度のビットマップフォントにする
  • フェイクロード画面を挿入する。できればディスクがぐるぐるまわるやつ!

レベル2:ハードウェアの癖を再現する

PS1のハードウェア構成のうち、ビジュアルに最も特徴的な影響を与えるのが「GTE」と呼ばれるベクトル演算専用のLSIです。これはベクトルを固定小数点演算することが特徴で、計算精度が落ちる代わりに(当時としては)大量のポリゴンを処理できました。
これがPS1特有の「ポリゴンのゆらぎ」を生みます。

また、GTEにはテクスチャのパースペクティブコレクション機能がないことも重要なポイントです。パースペクティブコレクションは。ポリゴンにテクスチャーを貼る際に、視点からの距離を加味してテクスチャーを拡縮する機能です。PS1はこの機能が省かれていたため、テクスチャーに対して独特の「歪み」が出ていたわけです。

これら2点のGTEの特徴を表現するには、シェーダーを活用することが近道です。ゲームエンジンを使っているなら、Unity, UE4向けにPS1風をテーマにしたシェーダーが公開または販売されています。

広く使われているUnity用のシェーダーはUnity Technologies JapanのKeijiro Takahashiさんに用意していただいた「Retro 3D」です。Unite 2015 TokyoでPS1風の表現を相談したところその場でシェーダーについて教えていただき、後日本人がパッケージにまとめてくれました。

Retro 3D
https://github.com/keijiro/Retro3D

このシェーダーを使ったデモを下記のURLで公開しています。マウスでつかんで動かせます。(これは、伝説的なPS1タイトルのパロディです!皆さんはわかりますか?)
http://takaakiichijo.github.io/90sPoly/Mikan.html

また、ごく最近公開されたプロジェクトとして、Unityの新しいレンダーパイプライン「URP(Universal Render Pipline)」で利用できるPS1風シェーダーが登場しました。
https://github.com/Kodrin/URP-PSX

Unreal Engine 4向けには、「Oldskooler」というアセットが販売されています。
https://4loup.itch.io/oldskooler

これらのプラグインを導入することが、見た目への大きな改良につながります。

さらに難易度が高いグラフィックス表現としては、「Zソートの再現」です。これをやっているPS1風ゲームはまだないのでは、と思っています。

現在のゲーム開発環境では「デプスバッファ」という、描画する画素に奥行きに関する情報を持たせ、重なり合う画素は手前のものだけを描画する機能があります。しかしPS1にはその機能が無かったため、「Zソート」というポリゴン単位で前後関係を判定する手法が取り入れられていました。これは交差するポリゴンを正しく描画できないため、本来は奥に描画されるべき面が手前に描かれてしまうことが多く発生しました。これはゲームエンジンや描画処理に大きく手を入れないと成し遂げられないため、実現は難しいと考え『Back in 1995』では見送りました。

さて、3Dの次は2Dです。PS1のデータメディアであったCD-ROM(ブラックディスク)の容量は700MBでした。大量の画像が必要なゲームの場合は、ファイルサイズを抑える工夫が必要でした。そのため、フルカラーではなく、色数を15ビットカラー(32768色)で収録するゲームが多くあったそうです。

しかし色数を抑えると、色と色の境目が模様になって目立ってしまう「マッハバンド(バンディング)」現象がが発生します。当時の技術として、このマッハバンドを抑制するためにディザリングという手法を用いています(実は、この手法は現代のモバイルゲームにおいても転送量削減のために広く使われています)。

ディザリングは「意図的に加えられたノイズ」という意味ですが、マッハバンドの起きるポイントで細かい点のノイズを加えることで中間の色を表現し、人間の目からは滑らかに見えるようにする加工のことです。

加えて、PS1が搭載する半透明処理は、「加算」と「αブレンド(α値固定)」です。半透明処理は加算半透明を使用すると絵がそれらしくなります。

さいごに、サウンドにもこだわりましょう。PS1のサウンドLSI「Sound Processing Unit」は次の仕様です。

  • 音源:16bit ADPCM
  • メモリ:512KB
  • サンプリング周波数:44.1kHz
  • 同時発音数:ステレオ、24チャンネル

ここから導かれるのは、同時に鳴る音は24本以下になっているべきでしょう。また、圧縮音声の設定を16bit ADPCMにすることが効果的です。ただし、PS1はCD-DAからのストリーミング再生であればCDクオリティの楽曲を再生することができましたので、「BGMはCDからのストリーミング再生」という設定にしてしまうこともおおいにありです。

サウンドについてはSPUの内蔵音源を吸いだして鳴らす、という手法もあるのですが法的にNGです。やる場合はあくまで参考として、最終音データは合法的な音源を使用したものにしましょう。

まとめると、次の通りです。

  • PS1風描画のシェーダーを用意して使用する
  • 加算半透明を使う
  • テクスチャの色を15ビットカラー32768色に設定し、ディザリング処理をする
  • 効果音の品質を16bit ADPCMに設定する
  • 同時に再生できる音を24本以下にする

レベル3:限界までこだわる

昨今は様々なPS1風タイトルが出ていますが、その中でもまだチャレンジされていない部分があります。それは、PS1のJpegデコーダーMotion Decoder(MDEC)を使った「Motion JPEG風ムービー」です。Motion JPEGは、320x240ドット時で秒間30フレーム、640x240ドットでは秒間15フレームの動画を再生できました。

Jpeg圧縮で劣化したかのような画像を作るためのシェーダーは以下のものがありますが、ゲーム開発環境でどのように利用できるかは不明です。

DCT quantization shader
https://github.com/FMS-Cat/dct-shader

これはおそらく、まだだれもやっていません。ムービーそのものも1995~2000年代当時の世相を反映したCGクオリティであればもっともよいでしょう。

ゲームハードウェア側の再現だけではなく、「どのような環境でプレイされていたか」も表現してしまうアプローチがあります。まずはブラウン管モニタの再現です。さまざまなUnity用エフェクトが出ていますが、『Back in 1995』で使っているのは次のものです。
http://wordpress.notargs.com/blog/blog/2016/01/09/unity3d%e3%83%96%e3%83%a9%e3%82%a6%e3%83%b3%e7%ae%a1%e9%a2%a8%e3%82%b7%e3%82%a7%e3%83%bc%e3%83%80%e3%83%bc%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%9f/

加えて、New Nintendo 3DS版の『Back in 199564』では下画面をつかって、「調子が悪いカートリッジ式のゲーム機でゲームを遊ぶ」という体験を加えました。

上画面をテレビモニタに模しており、ときおりゲームが止まった時に、RGBプラグの抜き差しや本体のリセットなどを行う必要があります。

類似の発想で、「学校で、携帯ゲーム機を先生にバレないように遊ぶ」コンセプトのVRゲーム、『Pixel Ripped 1989』というゲームもありました。

ゲーム内の表現だけではなく、PS1というハードウェアがあった時代背景を反映した仕掛けを作ることで、プレイヤーの中に眠った少年を呼び覚ますことができるかもしれません。

まとめると、次の通りです。

  • Motion JPEGの再現をやってみる
  • CRTモニター表現を使う
  • 「ゲームをプレイする」という90年代の環境を再現する

おわりに:逆思い出補正

さて、PS1の特徴をベースにした「PS1風ゲーム」の制作手順について紹介しましたが、なにも正確に再現することが最善とは限りません。『Back in 1995』では、PS1のゲームよりも大幅にFPSを落として(18~22FPS)カクついた映像を作っています。これは本来やりすぎです。しかし、「昔のゲームはこんな感じだった」という感覚を呼び覚ますための仕掛けとして導入しました。私はこれを「逆思い出補正」と呼んでいます。

PS1風表現に何ら制限はありませんし、超高解像度でローポリの世界を崩れたポリゴンのキャラクターが歩き回るゲームがあってもいいかもしれません。ピクセルアートと同じく、PS1風も「ただ懐かしいだけ」ではない、新しい表現手法の1ジャンルとして確立するなら嬉しいです。このガイドを見たクリエイターの中から、多様な作品が出ることを楽しみにしています。

Back in 1995公式サイト
https://backin1995.com/

--

--

asobu

asobuは渋谷にある独立系ゲームクリエイターのためのコミュニティーハブとワーキングスペース。 asobu is a community hub and working space for indie game creators in Japan. https://asobu.dev/