質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

0回答

7357閲覧

プレイステーションでポリゴンに隙間が空くのはなぜか

ikadzuchi

総合スコア3047

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

2グッド

4クリップ

投稿2018/09/15 17:46

編集2019/02/02 16:54

ポリゴンのラスタライザを書いていて気になったのですが、
初代プレイステーションにおいてしばしばポリゴンとポリゴンの間にわずかな隙間が空く状況が発生したようです。
これはなぜ発生するのでしょうか。
また、プレイステーションのラスタライズのアルゴリズムについての資料はありませんか?

プレイステーションの画面描画に関わるシステムは、こちらの資料などで調べたところ次のようになっているようです。

  • CPU: 普通のMIPS、浮動小数点演算なし
  • GTE: Geometry Transformation Engine; 16bit固定小数点数の座標演算に特化したコプロセッサ
  • GPU: 整数の画面座標で2次元の3角形(または2つ繋げた4角形)を描画する

ここから、一般的なポリゴン描画ルーチンは次のようであると考えられます。

  1. CPUが(GTEを使ってか使わずか)モデルの座標変換行列を計算する。
  2. 行列をGTEにセットする。
  3. モデル中のあるポリゴンの頂点座標をメモリから読み、GTEに渡す。
  4. GTEに回転・射影変換を指示する。
  5. 結果を読みGPUに渡すためのメモリに書き込む。
  6. 同モデル中の別のポリゴンの頂点座標について、3から繰り返す
  7. あるモデルについて処理を終えたら、次のモデルについて、1から繰り返す

この流れで、

  • 隣り合うポリゴンで共有される頂点の座標は、GTEにおいてポリゴンごとに計算されるので同じ頂点が複数回計算されますが、計算に使われる行列が途中で変更されなければ、毎回の計算で同じ入力に対して異なる出力になるとは思えません。

(行列が途中で変更される理由は無いと思うのですが、後述の情報で変更されるかのような記述があり不審です)

  • GPUに隣り合うポリゴンの頂点座標として同じ値が渡った場合、ラスタライズされたとき隙間が開くとは思えません。

(ラスタライズのアルゴリズムが分からないのでここは怪しいところです)

  • あとはそもそも入力データがポリゴンごとに頂点位置が異なっている可能性ですが、これはこれで考えにくいです。

(どのようなモデリングをしたらそのようなデータができる?・後処理でわずかに異なる頂点を一致させるのは簡単では?・ミスなのだからデバッグで発見して修正しないのか?・頂点座標をポリゴンごとに持つのはデータの無駄では?)

というわけで、いくつか不審な点はあるもののポリゴンに隙間が空く現象が起こる明確な理由が分かりません。

何か情報がないかと検索してみましたが有用な情報は得られませんでした。

I mean, how do you have a hole between two adjacent triangles, integer or not?

https://boards.fireden.net/v/thread/402698553/
→自分と同様の疑問(意味のある回答は無し)。

頂点計算の精度が十分では無かったので隙間が出来る

https://srad.jp/comment/2722716

GTEの演算誤差(当時の半導体プロセスの制約から浮動小数点演算の実装は困難であり、高速化のために整数演算を用いている)の影響で、ポリゴンの間にPS特有の「継ぎ目」ができる。

https://ja.wikipedia.org/wiki/PlayStation_(ゲーム機)

It is caused by errors in rounding numbers due to minimal accuracy in the PSX's hardware polygon generator .

http://www.shinforce.com/saturn/information/3D-Capabilities.htm
→整数精度のせいだとするよくある説明。整数であろうとなかろうと、同じ座標を共有するポリゴン間に隙間が空くとは思えない。

polygonal surfaces seem to wobble around, showing gaps between polygons

http://www.futuretech.blinkenlights.nl/tex.html
→ポリゴンの頂点位置のぶれと隙間を同一視している文章。ぶれる理由は隙間が空く理由にはならない。精度を理由とする説明はこれと同様の論理か。

プレステに特有の「ポリゴンの間に隙間ができる」という問題は、頂点の共有などを行っていないことに起因します。

https://www.wizforest.com/OldGood/saturn/polygon.html
→実際、頂点の共有は(ハードウェア的には)行われておらずポリゴンごとに3頂点を渡す形になりそうである。しかし共有を行わないと頂点の位置が変わる理由は分からない。

Yes, there were ways to avoid it (shared vertex calculations)
because each vertex was positioned with different transformation matrices

https://news.ycombinator.com/item?id=14013735
→異なる変換行列を使うためという説。これが最も理由として成り立っているが、異なる変換行列が使われる理由が分からない。

I have to say that it's much improved than the initial release. There're no "seams" everywhere in the ground anymore
"Vertex Caching" isn't necessary for this game anymore, but it does "close" some openings between polygons that still happen in some parts.

https://www.ngemu.com/threads/pcsxr-pgxp.186369/page-29
→エミュレータの話で、元隙間が空いていたソフトについて、頂点キャッシュは隙間を閉じる効果があるようだ。やはり頂点の共有がポイントになっていそうである。

the PSX doesn't render the rightmost pixel or bottom row of the triangle
and the way the triangle is rendered (in one or two passes, and the direction of each pass, i.e. top->bottom, bottom->top) depends on the shape of the left edge of the triangle

http://www.psxdev.net/forum/viewtopic.php?t=627
→レンダリングアルゴリズムについて。右端と下辺を描かないのは普通。左端の辺の形状によって向きが変わるというのは他で聞かない内容で、何かに影響するかもしれない。より詳しいアルゴリズムが知りたいが見つからない。これについても情報が欲しい。


回答はいつまでも求めていますが、それはそうと自分でデバッグしてみようかとよくポリゴンが割れているゲームを買ってエミュレータでデバッグを試みはじめました。
何かわかれば報告するつもりです。

bochan2, tokkun01👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/10/30 07:53

隙間問題がどのようなものか分からないのですが、ポリゴンの問題ではなくテクスチャの問題だったりしないでしょうか?(隣接するテクスチャとか、テクスチャの端とかでゴミが表示されてるとか)
ikadzuchi

2019/10/30 13:08

> どのようなものか分からない 改めて探すとあまりいい資料が見つかりませんでしたが、とりあえずこちらの「ハイパーラリー」で頻繁にポリゴンの境に線が見えます。 https://www.youtube.com/watch?v=M9mj2Xlj9Lc&t=57s > ポリゴンの問題ではなくテクスチャの問題だったり なるほどその可能性もありますね。
hares

2019/12/11 09:01 編集

https://www.youtube.com/watch?v=M9mj2Xlj9Lc&t=57s こちら、動画を拝見させて頂いたのですが、コースの作りとしては、数十メートル単位でモデルが分割されており(フラスタム外の不要なポリゴンをGTEに流す前にカリングするため)、分割されたコースの繋ぎ目は同一座標の頂点を共有していないため、射影変換時にわずかながら誤差が乗っているように見えます。 ikadzuchiさんご自身が既に調べてられていますが、同じ行列で同じ頂点を変換していれば、変換結果は必ず一致します。そのため隙間が空くことはありえないと考えます。 なので、隙間があく理由は、今回のようなコースの作りで同じ頂点が共有されていないからだと思われますが。例えば、単一のジオメトリーで構成されているキャラクターなどで隙間があいている物は今までありましたでしょうか?
ikadzuchi

2019/12/12 00:31

なるほど分割によるものですか。だいぶ納得がいきます。座標変換の精度が低いプレステだけで起こる理由にもなりそうです。 気になる点としては、座標が揃うように分割することはできないのか(隙間の空かないソフトもあるようなのでできそうだが)、できるならなぜ隙間の空くソフトでは揃っていないのかですね。ちょっと考えてみます。 単一のジオメトリーで構成されているキャラクターなどでは見たことが無い気がしますが、 最近隙間の件を知り調べ始めて動画や画像を探しているだけですのであまり多くのソフトは見ていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問