English
FAQSBLプログラミング関連
■  | 進む
FAQ/SBLプログラミング関連

VDP



ポリゴンとスクロールを合わせ込みたい。

Q)
SBLライブラリを使用して、ポリゴンと回転スクロール画面を3次元で同期 させて表示させたいのですが、SPR関数の視点パラメータをSCLのパラメータに 変換させる方法はないのでしょうか。

A)
SBLで確かにSCLとSPRを同一空間で扱うことは、SGLと比べて手間がかかります。
以下のような方法で行えば大まかですが合わせられると思いますので、 行ってみてください。

(1) 視点と中心点の設定
SPRの視点と中心点の距離がデフォルトで256ドット(1という単位に なっています)になっていますが、SCLの場合400ドットになっています。
この位置をSCL関数(SPRよりもよいと思います)を使用して合わせます。

デフォルト値として、
視点位置(X=画面横サイズ/2、Y=画面縦サイズ/2、Z=400)
中心点 (X=画面横サイズ/2、Y=画面縦サイズ/2、Z=0)
に設定しています。

このZ方向の差を256にすれば、中心としては合うと思います。

(2) 角度と移動について
SPRとSCLの違いとして、回転方向や移動方法が逆になることです。
SPRで回転した角度の逆数をSCLに渡してください。
ただし、ここで 微調整が必要な場合がありますので、アプリ側で移動等で対応してください。


視点と参照点間の距離、視点と投影面との距離の設定がよく解りません。

Q)
スプライトとスクロール画面の同期方法を試してみた結果、回転については 同期がとれたのですが、視点と参照点間の距離、視点と投影面との距離の設定が よく解りませんでした。視点と参照点の距離を変える場合は、RBGをZ方向に 移動させるのですか、それともスケールを変化させるのでしょうか?

詳しく教えてください。例えばスプライト関数で視点と参照点間の距離が2.0の場合 の設定値はどのようになるのでしょうか?

A)
スクリーン(投影面)への透視変換時のX、Y各々1.0に対するスクリーンの ピクセル数をデフォルト値で256に設定しています。
このデフォルト値はSPR_3SetPixelCount関数で変更することが可能です。
この値がスクロールの視点座標と中心点までの距離を256になるように設定 します。2.0という値がどのような形で設定しているかわかりませんが、この 距離と比例した形で設定すると思われます。


RBGを傾け過ぎるとクリッピングされてしまう。

Q)
SCLライブラリのRBGを使って3次元回転を行っているのですが、BGを 傾けすぎるとZクリッピングされてしまいます。これは、どのような条件で クリッピングされてしまうのですか。また、Zクリップさせない方法は無いので しょうか。

A)
Zクリッピングされてしまうとの事ですが、このような内容をおっしゃっている のでしょうか?

X軸回転で後方に倒し込むと画面と垂直になるかならないかのところで一瞬 画面上から消えてさらに倒し込むと裏面がみえるようになる。ことでしょうか?

視点と回転面の中心点と平行になった場合にこの現象が起こります。 この対応策としては、視点と回転面の角度を常にチェックして 平行になる場合に、ソフト側で処理するようにすることをお進めします。


NBG0面を32k色、2WORDで使うと反転セルは正しく表示されない。

Q)
NBG0面を32k色、2WORDで使うと反転しないセルは正しく表示されるのに対し、 反転されるセルが正しく表示されません。

A)
反転というのは左右反転でしょうか?(上下反転と左右反転があります。) 左右反転の場合は、VDP2の仕様で16色,256色以外は使用できません。
この内容についてはSEGASATURN Developer's Infomation STN-37に記載されて いますのでご確認ください。


SCL_SP2のみに掛けたい半透明がSCL_SP6も掛かってしまう。

Q)
以下のような優先順位の設定を行い、SCL_SP2のスプライトのみをBGに対して カラー演算を行いたいのですが、SCL_SP6も半透明になってしまいます カラー演算の割合を1つのスプライトのみに指定する事はできないのでしょうか?

A)
スプライトタイプがプライオリティ用ビットが2ビットしかないタイプを選んで いませんか?

関数SCL_SetSpriteModeでもしタイプ0,3,4,8〜Fを設定しているか,何も 設定していない場合(0)の3ビット目が無視されるため起こりえます。


グーロシェーディングを掛けた際スプライトがちらつく。

Q)
SPR_2NormSpr()やSPR_2Polygon()等を使用した際にグーローシェーディング 指定を行なうと,その部分が明滅する現象が発生します。エミュレータで停止 して見ると,フレームバッファ片面は正しく描画されていますが,もう一方の 面はグーロー指定の部分だけがどこから参照したのか不明な色コード単色で 塗り潰された状態となっています。考えられる原因として何が挙げられるで しょうか?

A)

ということが考えられます。
VDP1ライブラリはコマンドテーブルを2つに分割して持っているので、 フレームチェンジごとに必ずSPR_2NormSpr関数を呼ぶ必要があります。
このような症状の場合、一度だけ登録して、あとは変更がないので関数 を呼び出さないというやりかたが原因の場合が多いです。
できましたら、コマンドテーブルの中身を比較して、

  1. 正しく表示できない方のグーローへのアドレスは正しいか
  2. そのグーローのアドレスに正しくテーブルがセットされているか

の確認をお願いします。

SPR_2SetChar、SPR_2ClrCharで繰返し定義/削除を繰り返すとハングアップする。

Q)
SBLのSPR2ライブラリィにおいてSPR_2SetCharとSPR_2ClrCharでスプライトの 定義、削除を繰り返しているとハングアップする現象がありました。

SPR_2SetCharにチェックルーチンを入れて調べて見ましたら、allocBlockで まだ確保出来るメモリがあるのにNULLポインタが返って来ているようです。
また、毎回ライブラリィを変更するのも何なので、次回のバージョンアップより SPR_2SetCharでスプライトを確保出来ないようならエラーを返す様に返すよう にして頂けないでしょうか。

A)
以下のように変更してみてください。

static Vaddr    allocBlock( Uint16 size ){
NullBlock    *memblk = nullBlockTop;
NullBlock    *prev = NULL;
NullBlock    *second_best = NULL;
NullBlock    *prev_second_best = NULL;
Vaddr        p = ( Vaddr )NULL;
while( memblk != NULL ){
  if( memblk->size == size )
    break;
  if( memblk->size > size ){
     if(( second_best == NULL )
     ||(( second_best != NULL )
     &&( memblk->size < second_best->size ))){
       second_best      = memblk;
       prev_second_best = prev;
     }
  }
  prev   = memblk;
  memblk = memblk->next;
}
if( memblk == NULL ){
  memblk = second_best;
  prev   = prev_second_best;
} 
if( memblk != NULL ){
  Uint32    blocksize;     
  memblk->size -= size;
  blocksize     = ( Uint32 )memblk->size*32;
  p = ( Vaddr )(( Uint32 )memblk + blocksize - ( Uint32 )VRAM );
  if(( memblk->size == 0 )&&( prev != NULL ))
    prev->next = memblk->next;
  }
  return    p;
}


パレット形式でスプライトを表示したい。

Q)
スプライト表示のパレットの設定はどうやるのでしょうか?

A)
パレット番号をUint16 color に設定する際には、下位ビットにオフセットを 与える必要があります。
オフセットの量は、使用するパレット(表示するスプライト)の色数によって 変化し、

となります.(オフセット部分は全て0にしてください)

(例)256色のスプライトで2番目のパレットを使用する場合
SPR_2NormSpr() 関数に与える第4引数、Uint16 colorを、0x0100 として ください。

なお、 Uint16 colorは、実際のハードウェア的なVDP1の動作では、コマンド テーブル中のCMDCOLR(カラー制御ワード)に相当します。
CMDCOLR(カラー制御ワード)は、スクロール面とのプライオリティの指定 を行う際にも使用いたします。

詳しくは、

参照
VDP1ユーザーズマニュアル 「6.4 CMDCOLR(カラー制御ワード)
VDP2ユーザーズマニュアル 「9.1スプライトデータ
VDP2ユーザーズマニュアル 「9.2プライオリティとカラー演算
を、ご参照ください。


スプライトにプライオリティを設定したい。

Q)
スプライトにプライオリティを設定したい。

A)
スプライトのプライオリティの値は最大で8通り設定できます。
以下に設定方法をご説明しますので、ハードウェアマニュアル 「VDP1VDP2ユーザーズマニュアル」と併せてご参照ください。

1.スプライトタイプの設定
void SCL_SetSpriteMode(Uint8 type,Uint8 colMode,Uint8 winMode)

→『プログラムライブラリ VDP2ライブラリユーザーズマニュアル』参照 を使用して、スプライトタイプを設定してください。
(SBLのデフォルトはタイプ0です)

「 スプライトタイプとは?」
VDP1が描画したフレームバッファのデータを、VDP2が受け取る際の データフォーマットで、16BITから構成されます。(ハイレゾ時は8BIT) スプライトタイプの種類によって、

  • 使用できる発色数
  • プライオリティに設定できる数
  • シャドウ機能の選択ビット
  • カラー演算の割合指定に使用できる数

等が変化します。
使用したい機能に合わせてスプライトタイプを選択してください。
(注意:スプライトタイプの設定は、カラーバンク形式(=パレット形式)の スプライトデータにのみ有効です.RGB形式のスプライトデータに対しては、 上記の機能ビットは全て、0であるとみなされますのでご注意ください。)

詳細→VDP2マニュアル 第9章「スプライトデータ」 例としてスプライトタイプ5の場合、VDP2マニュアルの図9.1 から解るよう にプライオリティ用ビットが3ビットありますので(図中のPR0〜PR2)、 '8通りのプライオリティレジスタ'を指定することが可能です。

直接プライオリティの値を指定するわけではないのでご注意ください。

2.スプライトプライオリティナンバーレジスタの設定方法
次の関数を用いて設定してください。

void SCL_SetPriority(Uint32 surface , Uint8 priority)
機能 : 各画面のプライオリティナンバーを設定します。
surface :SCL_SP0,...SCL_SP7, SCL_NBG0, SCL_NBG1, SCL_NBG2, SCL_NBG3, SCL_RBG0, SCL_RBG1, SCL_EXBG
priority: 0〜7の値を指定します(0が指定された面は表示されません)。

「スプライトプライオリティナンバーレジスタとは?」
スプライトのプライオリティを決定するレジスタです。
全部で0〜7の8個のレジスタがあります。(SCL_SP0,...,SCL_SP7 に対応) VDP1フレームバッファ上のプライオリティ用ビットによって参照されます。
実際のプライオリティナンバーはこのレジスタに設定します。

3. プライオリティビットの設定方法
スプライト描画時にプライオリティビットを設定するには、カラーコードの ワードデータ中に設定することで行います。

ポリゴンの場合:
テクスチャテーブルSprTexture構造体中の Uint16 color
→プログラムライブラリユーザーズガイド2 VDP2ライブラリ参照

スプライトの場合:
SPR_2SetChar関数の第3引数 Uint16 color
  又は、
各スプライト描画関数中の、 Uint16 color

に、プライオリティビットを設定することで処理が行われます。
ビット位置は、使用するスプライトタイプによって変化します。
VDP2マニュアルの図9.1 を参照し、どのビットがプライオリティビットかを ご確認ください。

例:スプライトタイプ5を使用している場合
  • プライオリティレジスタ4
  • 256色パレットの2番目を指定

この場合に、設定する値は次のようになります。
0100000100000000 = 0x4100
 ||| |||
 ||| +++----------パレット1番を指定
 +++--------------プライオリティレジスタ4を指定

注意:
スプライトの描画はVDP1のコマンドテーブルの登録順(Zソート順)に 行われます。
(プライオリティビットの設定内容とは関係なく処理されます。) スプライトのフレームバッファは1面しかありませんので、先に 描画されたデータは、後から書かれたデータによって上書きされます。
プライオリティが高いスプライトの上にプライオリティが低い スプライトを上書きした場合、BGとの前後関係が見た目上おかしい 表示になります。

VDP2マニュアルの図9.1 を参照し、どのビットがプライオリティビットかを ご確認ください。


SCL_AllocColRam関数で256色以上のカラー確保が出来ない。

Q)
SCL_AllocColRam(SCL_SPR, 512, OFF)を行うと、0が返ってきます。
256色以上のカラーデータを確保しようとするとエラーが帰ってくるようですが どういう事なのでしょうか。

A)
この関数内では、カラーオフセットアドレスを各画面単位に設定しており、 この設定を中心に考えられたために256色を越えたデータ領域を確保がうまく管理 できなくなっています。

一番最初は、512色以上取得することができますが、一度登録すると256色以上 確保できません。

対処方法としては、256色を越えたデータ領域の確保する場合は、 確保の最後に256色として関数をコールして、独自に管理するようにしてください。
通常は256色以上のカラーデータを使用するのはスプライトだと思いますので、 スプライトのカラーの確保を最後に行うようにしてください。


■  | 進む
FAQSBLプログラミング関連
Copyright SEGA ENTERPRISES, LTD,. 1997