2006年04月05日

セガサターン、VDP1半透明機能の検証

wikipediaでセガサターンのVDP1(描画プロセッサ)が半透明描画できるかどうかが議論対象となったので、検証してみました。

結論から言うと半透明描画機能は存在していました。ですが描画結果がまともではないので、実質使い物にならないというのが結論です。
VDP1半透明検証映像 (wmvファイル)

上の映像はGame Basic for SEGASATURN (以下GBSS)を用いて、3枚の半透明ポリゴンを重ねて描画したものです。描画順序が、
 1.右の赤正方形
 2.緑の長方形
 3.左の赤正方形
となっています。右の正方形は最初に描画するため不透明扱いで、次に描画する緑の長方形との半透明合成により隠れている部分も見えています。また左の正方形は長方形を描画した後に半透明合成したものです。
つまり、右は緑の長方形の半透明描画を表し、左は赤の動く正方形の半透明描画を表しています。

これより、静止した長方形による半透明合成は正常な描画ができ、動いている正方形による半透明合成はおかしな現象が起きている事がわかります。特に左の正方形が視線方向に縦になっているときなどほとんど不透明のようになっています。

これは流出したVDP1のマニュアルに書かれている半透明の合成方法により説明可能な現象と言えます。動いている正方形は2次元的に見たら正方形ではなく、歪んだひし形として描画されます。その時にどうやら描画アルゴリズムの制約で所々同じピクセルを複数回上書きしてしまうようです。不透明であれば何回描画しても(無駄ですが)不具合にはなりませんが、半透明だと同じ箇所に描画すればするほど透明度が下がります(つまりガラスを何枚も重ねて見ると透明度が下がるのと同じ)。複数回描画する場所と1回しか描画しない場所にムラがあると、そのムラがそのままスジのような現象として見えるというわけです。
しかしちゃんとした四角(緑の長方形)は全てのピクセルが1回しか描画されないため正常な半透明となっています。

ちなみにこの半透明、異常に重いです。上の映像にあるポリゴンの4倍の大きさで描いたら、ガクガクになりました。

--------今回の検証に用いたプログラム(GBSS)、※行番号がなく改行されている箇所は前の行からの連続です
100 'SEGA SATURN TRANSLARENCY VERIFICATION PROGRAM
110 SCREEN 0
120 TCOL = RGB(31,0,0)
130 GOSUB 1000
140 TEX1$ = STRW$(32*32*2,PCEL$)
150 SETTEX 0,32,32,32768,TEX1$
160 TCOL = RGB(0,31,0)
170 GOSUB 1000
180 TEX2$ = STRW$(32*32*2,PCEL$)
190 SETTEX 1,32,32,32768,TEX2$
200 '
210 SETVERTEX 0,4,(-32,-32,0),(32,-32,0),(32,32,0),(-32,32,0)
220 SETPOLYGON 0,1,0,,(0,1,2,3)
230 SETATR 0,1,(0,1,3,0,0,3)
240 SETVERTEX 1,4,(-64,-32,0),(64,-32,0),(64,32,0),(-64,32,0)
250 SETPOLYGON 1,1,1,,(0,1,2,3)
260 SETATR 1,1,(0,1,3,1,0,3)
300 '
310 OBJTYPE 1,4
320 OBJATR 1,0,0
330 OBJPOS 1,-50,0,1
340 OBJTURN 1,.002,-.004
350 OBJTYPE 2,4
360 OBJATR 2,1,1
370 OBJPOS 2,0,0,2
380 'OBJTURN 2,.002,-.004
390 OBJTYPE 3,4
400 OBJATR 3,0,0
410 OBJPOS 3,50,0,3
420 OBJTURN 3,.004,-.002
500 '
510 END
800 '
1000 TCOL = TCOL OR &H8000
1010 PCEL$ = HEX$(TCOL)
1020 PCEL$ = RIGHT$(PCEL$,4)
1030 PCEL$ = HEXBIN$(PCEL$)
1050 RETURN

chess_ at 21:45│Comments(0)TrackBack(0)ハード検証 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔