|
ただ、ここに来て、コアゲーマーや開発関係者の間で「Xbox 360タイトルのほとんどが720pを満たしていない」とか、「PS3も多くのゲームが本当のハイデフにはならないかもしれない」という、やや後ろ向きの見解がポツポツと出始めている。今回は次世代ゲーム機とハイビジョン(ハイデフ)の関係について考えてみたい。
■ ハイビジョン(ハイデフ)の基礎知識
これまで長らく「標準的なテレビ解像度」として利用されてきた縦方向480本(伝送数は525本。以下同)の走査線の解像度をSD(Standard Definition)と呼んでおり、これに対して720本(750)、1,080本(1,125)の映像をHD(High Definition)と呼ぶ。Xbox 360で強く訴求されていたハイデフはここから来ている。
日本では世界に先駆けてNHKがBSアナログハイビジョン放送を'89年より実施しており、これがきっかけとなり高解像度テレビをハイビジョンとする呼び方が広まった。なお、海外では基本的には「ハイビジョン」という呼び名は通じず、「High Definition」という呼び方が一般的であり、略すときは「HD」あるいは「High-Def(ハイデフ)」とする。舶来ものであるXbox 360が「ハイビジョン」ではなく「ハイデフ」の方を連呼したのはこのあたりが理由になっているのだ。
■ ゲーム機では出力解像度とレンダリング解像度は一致しなくてもいい テレビ解像度を言い表わすときには縦解像度の数値のみで言い表わすのは、もともとテレビがブラウン管を基本として考えられていたことと関係が深い。ブラウン管では1本の電子ビームで描き出す水平方向の走査線を上から下に向かって描くことから、この走査線の本数で解像度を表わす。なお、ブラウン管テレビでは表示管面に列んだRGBの蛍光体の数が、実際に表示しようとする映像解像度と一致していないことも多かった。さらにテレビでは、映像信号全域を表示せずに画面外に若干はみ出るような形で表示させるオーバースキャン方式で表示するのを基本としている。この表示映像とオーバースキャンされてはみ出させる量の割合も、実は明確に定まっておらず、極端な話、メーカー間で微妙に異なっていたりもした。
ところが、最近ではテレビといえば液晶方式やプラズマ方式を指すことが多く、これらは明確な表示画素を持った映像機器で、特に「固定画素系」と呼ばれる。固定画素系の映像機器は実体のある画素が明確に配列されているため、明瞭な表示解像度仕様を持つ。そのことから入力画像を欠落なく表示させたいというPCディスプレイ用途にはおあつらえ向きの方式だった。 なお、固定画素系が一般化してからは、「720pは1,280×720ドット、1080i、1080pは1,920×1,080ドット」という認識が強くなってきており、逆に例えば「720p対応のディスプレイ」といえば「1,280×720ドット以上の解像度がある」という認識がなされるようになってきている。
微妙な立ち位置にあるのはゲーム機の映像だ。ゲーム機のリアルタイム映像は何かを適当な解像度で撮影したものではなく、基本的にはCGなわけで、PC画面と同じく、明確な解像度仕様に基づいて作り出されたフレームだ。
逆に、もともとオーバースキャンされる事がわかりきっているならばオーバースキャンされて最終的に表示される部分だけをレンダリングして、スキャンアウトにより表示されない部分はレンダリングをさぼるという手もあるだろう。
■ Xbox 360は720p出力だけど720pでレンダリングされていない? 以上を踏まえた上で、本題に入っていきたい。Xbox 360の“ハイデフ”ゲーム映像は「720pのハイビジョン映像」ということになっている。 720pというキーワードだけを聞くと多くのユーザーは「じゃあ、Xbox 360のゲームは1,280×720ドットでレンダリングされているんだね」と思うかもしれないが、実際にはその通りのタイトルもあるし、それ未満の解像度のタイトルもある。 なお、マイクロソフトの立場としては、今でも「Xbox 360のゲームタイトルは1,280×720ドットのMSAA(マルチサンプル・アンチエイリアシング)付きの画面でレンダリングすること」を推奨しているという。 ところが、「凝ったグラフィックス表現をやろうとすると、この奨励事項を守っていてはどうしてもパフォーマンスが足りない局面が出てきてしまう。どうにかしてくれ」という開発者達の訴えが増え、これに応える形でマイクロソフト側としては譲歩して「やむを得ない場合は仕方なし」というエクスキューズを付け加えたのである。
こうしたことから、もしかするとこれからのレンダリング解像度は1,280×720ドット未満のタイトルが主流となるかもしれない。おそらくこのあたりの断片情報から「Xbox 360のハイデフは720pじゃない」という解釈(≒誤解?)が生まれたと推察される。しかし、Xbox 360のGPUは最新鋭のGPUのはずだ。パフォーマンスが足りないというのはどういうことなのか。次は何がボトルネックになっているのかを詳しく見ていく。
■ Xbox 360 GPUはシェーダモンスターではあるがメモリ帯域モンスターではない
しかし、Xbox 360システムにはゲーム機ならではの弱点がある。それはメインメモリとビデオメモリを共有しているUMA構造(Unified Memory Architecture)だ。UMAでは、CPUによるプログラム実行の際のメモリアクセスと、GPUが描画する際のメモリアクセスによって、メモリ帯域を奪い合ってしまう。
ちなみに22.4GB/secというメモリ帯域は、現行のPC向けGPUでいうと丁度ATI RADEON X1600 XTやNVIDIAのGeForce 7600 GT程度。つまり、現行のメインストリームクラスのGPUと同程度に過ぎない。なお、ハイエンドクラスGPUのメモリ帯域はだいたい50GB/sec(RADEON X1900 XTXで49.6GB/sec、GeForce 7900 GTXで51.2GB/sec)なので、Xbox 360ではその半分以下の帯域ということになる。 シェーダが17基(VS5+PS12)しかないRADEON X1600 XTやGeForce 7600 GTと比較するのはナンセンスだという意見も出てきそうだが、シェーダパフォーマンスはあくまで単位時間あたりに1ピクセルに対してどれくらいの量の陰影処理が施せるかということを表しているに過ぎない。 「単位時間あたりに何ピクセル描画できるか」は、すなわち「単位時間あたりに何バイトをメモリに書き込めるか」という議論とほぼ等価なのでメモリ帯域の方に直接関係してくる。高解像度のフレームを単位時間あたりにより多く出力するためには広帯域なメモリ帯域が必要になってくるのである。その意味では単位時間あたりにピクセルを打ち込める数はXbox 360 GPUとRADEON X1600 XTは大差ないといえるわけだ。 なお、Xbox 360の公称フィルレートは160億テクセル(サンプル)毎秒というとてつもない値になっているが、これは後述するEDRAM側のピクセルプロセッサが4xMSAAを実行したときの理論帯域であり、GPUコアそのもののフィルレートはその1/4である40億テクセル毎秒となる。これは丁度GeForce 7600 GTと同程度だ。 仮に720pを1,280×720ドットとして60fpsを維持しようとすると、1/60秒の間に最低でも1,280×720ドットの約100万ピクセル分のデータをメモリに書き込めなければならない。実際には動的なテクスチャ生成などを行なったりしてマルチパスレンダリングを組み合わせるのが今や当たり前なので、レンダリングを完遂するには、この数倍から十数倍の量のデータをメモリに書き込めるポテンシャルが必要になる。 初代Xboxでは400MHzデータレートのDDR SDRAMを64MB搭載しており、これがやはり128ビットバスでノースブリッジと接続されていた。メモリ帯域にして6.4GB/sec。この時ターゲットにしていた解像度は640×480ドット程度のSD解像度だったので約30万ピクセル程度。Xbox 360でターゲットとしている1,280×720ドットの100万画素ではその3倍のメモリ帯域が必要になる計算になる。Xbox 360のメモリ帯域は22.4GB/secだから3.5倍はあることになる。 しかし、この3.5倍の帯域分のうち3.0倍分は、高解像度化されて描画するピクセルが増加した分で消費されてしまうと仮定すれば、ヘッドルームは0.5倍分しかない。Xboxより高度なシェーダを動かして、多段テクスチャ参照を行なうことになるXbox 360世代では、これはあまりにも心許ない。
このメモリ帯域が足りない根本の原因となっているのは、GPU内のメモリコントローラがGDDR3 SDRAMと128ビット接続になってしまっている点だ。現在ATIもNVIDIAもハイエンドクラスのGPUは2004年から256ビット接続だ。コストに関わってくる部分なので単純な話ではないにせよ、Xbox 360も256ビットメモリバスを採用していれば、もうちょっと余裕ができたかもしれない。
■ メモリ帯域不足をEDRAMが救う……?
このEDRAMにはZ処理(深度情報処理)、α処理(透明度合成処理)、ステンシル処理(切り抜き処理)、4点サンプルまでのマルチサンプルアンチエイリアス処理(4xMSAA処理)を行なうことのできるピクセルプロセッサが192個、内包されている。さらに4枚までのMRT(Multi-Render Target:同時レンダリング)に対応しており、Z値(深度)とステンシルの更新までを同時に行なえる。公表情報によれば1サイクル当たりカラー&Z値を8ピクセル、Z値のみならば16ピクセルの書き込み性能があるという。このEDRAMは、一般的なGPUにおけるROPユニットとビデオメモリを一体化したような機能ブロックであり、ある意味サブGPU的なポテンシャルを持っているといえる。
このEDRAMの採用により、一番メモリ帯域を食うはずのレンダリング結果のメモリへの出力に際しては、512MBの共有メモリのメモリ帯域をほとんど使わずに処理できることになった。では、問題解決かというと、完璧でもなかった。ある視点から言えば、このEDRAMがXbox 360のグラフィックスサブシステムの取り扱い自体をややこしいものにしたといってもいいかもしれない。
■ 10MBのEDRAMじゃ足りない~分割レンダリングの提供 基本的にこのEDRAMはレンダーターゲット(レンダリングするためのバッファ)として活用されるが、容量が10MBしかない。問題はここだ。 例えば1,280×720ドット解像度でレンダリングするとする。αRGBがFP16の64ビットHDRレンダリングを行なうのだとすると、1,280×720×8=7,372,800バイト(64ビットは8バイト)の容量が必要になる。約7MBで10MBに収まっている。 ところが、実際のレンダリング工程にはZ値(深度)を記録しておくZバッファも必要になる。Zバッファを32ビット(4バイト)で確保するならば、さらに1,280×720×4=3,686,400バイトで、新たに約3.5MBが必要になり、トータルで約10.5MBとなり、ぎりぎり10MBに収まらない。
これだと、1,280×720×4=3,686,400バイト、Zバッファと合わせても7,372,800バイト、約7MBで10MB以下になるではないか。と思いきや、前述したようにマイクロソフトでは2xMSAAを奨励しているので、これが2倍で利いてきて約14MBが必要になり、結局10MBに収まらない。八方ふさがりだ。では、どうするのか?
例えば、上記の1,280×720ドットの32ビットバッファで2xMSAAのケースでは、14MBが必要になるが、このフレームの左7MB分をまずEDRAM上でレンダリングし、この結果を512MBの共有メモリへ書き戻し、続いて右半分7MBのレンダリングも行なうといった感じになる。ただ、これでEDRAMの容量不足は解決かというと、残念ながらそういうことでもない。
■ 分割レンダリングの落とし穴~もっとあれば良かったEDRAM
視点からの距離が遠いと自動的にジオメトリ量を削減するLOD処理をゲーム側で実装していればまだしも、そうでない場合、奥行き方向の奥に行けば行くほど頂点量が増え、この重複処理が負荷として重くのしかかってくる。大量のキャラクタが同時に登場する「真・三國無双」や「NINETY-NINE NIGHTS(N3)」のような群集を扱うゲームでもこの分割レンダリングによる重複処理はきつそうだ。
また、被写界深度のシミュレーションや疑似表面下散乱、疑似光散乱シミュレーションのような、レンダリングしたフレームのZバッファ側のの内容を再利用するような特殊効果では、この分割レンダリングのたびに前のレンダリングに用いたZバッファがクリアされてしまうため、これを防ぐためにMRTを活用して深度値を別に用意した共有メモリ側のバッファに退避しておく工夫が必要になる。これはZ値の二度書きに相当し、メモリ帯域を余計に消費することになる。一括レンダリングであれば、この二度書きは不要なので、これは分割レンダリング使用時の弊害といえる。
そもそもEDRAMの容量が10MBというのはなぜなのだろうか? 16MBあったらマイクロソフト奨励モードで分割が不要になるし、欲を言えば32MBあれば、マルチパスレンダリングを行なう際においても共有メモリへの書き戻しを低減できて楽になったことだろう。 10MBの理由。これには諸説あるようだが、マイクロソフトの打ち出した製造コスト、消費電力、チップサイズ、性能といった複数の要求仕様に対して、Xbox 360 GPUのEDRAM製造側との折り合いをつけた結果ではないだろうか。
ただ、Xbox 360 GPUではテクスチャは512MBの共有メモリに配置しておく仕組みなので、仮にEDRAMの容量や分割レンダリングを用いる用いないに関わらず、結局、テクスチャ参照の際には、共有メモリ帯域を食うことになる。今世代はただの画像テクスチャ(デカールテクスチャ)の適用以外に、法線マップによるバンプマッピング、シャドウマップ技法による影生成の際などなどテクスチャ参照頻度が高い。Xbox 360のグラフィックスプログラミングでは、EDRAMの上手な活用、そして最終的にはメモリ帯域消費のチューニングが鍵を握りそうなのである。その開発には、XboxやPS3とは違った苦労がつきまといそうだ。
■ こうなったら最後の手段、解像度変換だ! 結局、Xbox 360では「1,280×720ドットで2xMSAA」はなかなか守りにくい決め事になってしまったので、マイクロソフトは低解像度でのレンダリングも許容することになった。しかし、低解像度でレンダリングして720p出力できるのか。
Xbox 360はテレビゲーム機なので、任意の解像度でレンダリングしたフレームを720pや1080iといったハイビジョン映像モードで出力する能力が与えられているのだ。もっと具体的に言えば1,280×720ドット未満の解像度のフレームを720pとして出力することはできるのだ。もちろん逆に480pや480iといったSD映像モードでの出力も可能だ。 多少の縦横解像度の組み合わせの制限はあるものの、Xbox 360のGPUでは任意の解像度を設定してレンダリングすることがハードウェア的に可能となっている。極端な話、320×240ドットのレンダリングも可能であり、これを720pとして出力することもできるのである。 これまであまりXbox 360のディスプレイコントローラについても語られることがなかったので、ここで簡単に紹介しておこう。Xbox 360の映像出力を司るディスプレイコントローラは高品位な解像度変換を行なうスケーリング回路を搭載している。それも単なる線形補間回路ではなく、マルチタップFIRフィルタ(Finite Impulse Response Filter)の機能を有しており、垂直、水平のタップ数は非公開とされるものの、フィルタ係数はコンフィギュラブルとなっている。簡単に言えば、一般的な液晶テレビやプラズマテレビの解像度変換回路とほぼ同等性能を備えているといっていい。 いくら高品位とはいえ、映像をデジタルズームで拡大表示したような感じになるので、レンダリング解像度が1,280×720ドットより極端に低いのに720p出力すれば、やはりぼやけたモザイクのようになってしまう。しかし、1,280×720ドット未満であっても、十分高解像度であれば、アンチエイリアス処理までをかけてしまえば、よっぽどのマニアでなければ「ハイビジョン映像」として認識されてしまうだろう。
さらにフルパフォーマンスを得るためには、どうすればいいか。それは分割レンダリングを使わないことだろう。つまりEDRAM 10MBに収まるような解像度でレンダリングするように心がければいい。ただ、1,280×720ドットよりも解像度が低くなるとジャギーは目立つ。せっかく全くパフォーマンス低下のないアンチエイリアス処理が行なえるピクセルプロセッサがEDRAMに搭載されているのでこれを活用しない手はない。
とある開発者は、縦解像度をキッチリ720ドットに合わせて、FP10-32ビットバッファ、880×720ドット、32ビットZバッファ、2xMSAAで9.9MBなんかもいいかもしれないと述べていた。レンダリング解像度の縦横比は4:3でも16:9でもない12:10という変則的なものだが、画角を16:9としてレンダリングすれば、ディスプレイコントローラで16:9の720p出力されたときにもちゃんとつじつまが合うので問題はない。 ある別の開発者は、適当な低解像度でレンダリングし、表示するための720pのフレームを自前のシェーダで作り出すのも1つの手だと主張する。この低解像度フレームを720pフレームに自前のシェーダで変換する際に、カラーのディザリング処理も行なってしまえば副次的な滑らかな色表現が得られるかもしれないし、あるいは7e3からなるFP10の仮数の分解能不足を低減する効果もあるかもしれない。
さらに別の開発者は、とにかくジャギーを低減したいと話す。せっかくEDRAMのピクセルプロセッサが4xMSAAまでパフォーマンス低下がないのだから、これを活用したら面白いという。4xMSAAでFP10-32ビットバッファ、32ビットZバッファとして、分割レンダリングをさせないように10MBに収めるとすると、レンダリング解像度640×480ドットになってしまうが、全くジャギーのない画は確かにこれまでのゲーム機のものとは違った見え方となることだろう。
■ PS3は大丈夫なのか~PS3の方が大変?
ある開発者は「HDRレンダリング前提で考えるとPS3の方が深刻だ」という。PS3はCPU直結のメインメモリを256MB、GPU直結のビデオメモリを256MB搭載した、PCに近いアーキテクチャをとる。しかもCPUがビデオメモリにアクセスできたり、GPUがメインメモリにアクセスできると言ったUMA的な相互乗り入れも可能になっており、UMAとディスクリートのいいとこ取りのようなシステムだ。
ところが、PS3ではFP10-32ビットバッファがサポートされない。PS3のGPU「RSX」では、HDRレンダリングはFP16-64ビットバッファを標準としている。つまり同解像度のHDRレンダリングをやろうとするとXbox 360の2倍の帯域を消費する。メモリ帯域自体はXbox 360と同じなのに消費量が2倍なのだから余裕どころか大ピンチである。 しかもRSXには帯域消費を緩和するEDRAMのような仕組みも持たない。RSXは設計をご存じのようにNVIDIA GeForce 7800 GTX(NV47/G70)と同じくするので、つまりFP16-64ビットバッファのブレンディングには対応するがアンチエイリアスには対応していない。一貫したレンダリングに活用するバッファとしてはやや特殊性が残っている。ゆえに、もしかするとPS3でのHDRレンダリングはXboxやDirectX 8世代で流行したαRGB各8ビット整数の従来の32ビットバッファを用いた疑似HDRレンダリングのほうが主流となる可能性も否定できない。
レンダリング解像度に関してはPS3でも、Xbox 360同様に、解像度の選択は各ゲームタイトル毎に好きなものを選択させ、最終的にディスプレイコントローラで720p、1080i、1080pといった解像度で出力するアプローチをとることだろう。
あるPS3のゲーム開発者は、真顔でこう話す。 「解像度なんかそこそこでいいと思う。PS3のRSXはせっかくのシェーダモンスターなのだから、それよりもめちゃくちゃ高度なシェーダを実行して1ピクセルに多くの情報を反映させて、しかも徹底的にアンチエイリアスをかけた方が絶対リアルに見えるはず。ハイビジョン解像度よりも1ピクセルに込めるリアルの方を重視したい」と。 実際、高解像度レンダリングに必要なメモリ帯域に余裕がないのだから、解像度をそこそこに留めてシェーダサイクルに時間予算を多めに割いた方が結果としてバランスのいい画ができるのかも知れない。
このあたりの「落としどころ」は、Xbox 360にしろ、PS3にしろ、様々なタイトルがリリースされていく中で最適解がいずれ見つかることだろう。
(2006年4月26日) [Reported by トライゼット西川善司]
また、弊誌に掲載された写真、文章の転載、使用に関しましては一切お断わりいたします ウォッチ編集部内GAME Watch担当game-watch@impress.co.jp Copyright (c)2006 Impress Watch Corporation, an Impress Group company. All rights reserved. |
|