コマンドラインから、niff2gfx -h と実行すると、次のように表示されます。NIFF to N64 GBI format convertor. version 1.3.6 supported format revisions: NIFF 1.0 usage: niff2gfx [option] infile outfile infile ... NIFF format file. outfile ... N64 Displaylist C source file. option: -q quiet mode. -verbose verbose mode. -header fname, -d fname set output header filename. -label str set label string.(label string = str) -scale fval set convert scale.(scale = (float)fval) -niffinfo fname NIFF information onto file fname. -nocomdef common define,typedef block no output. -regmask val prevent RDP register assignment. -vtxshare val vertex share on set minimum match length. -vtxcache val vertex cache size(default 32). -vtxload val vertex cache load limit(default 32). -strictflat flat normal output to 3 vertices at all times. -noalignpad prevent alignment of 8-byte order no padding. -outobj name output object by name.(default: all objects) -outmask val prevent output dataclass assignment. -nogeomclr geometry mode no clear. -preview val preview type value.(default: 0x1c) -binary, -b output gfx in binary file. -rotorder val default rotation order.(default: 0x010203) -vtxseg val Vtx segment number.(default: 5) -imgseg val image data segment number.(default: 6) -tlutseg val TLUT data segment number.(default: 7) -nomodify disable modify vertex. -strictcidx CIDX pixel/bits follow 'tex_type'. -noreduct CIDX no color reduction. -nullanim output null animation data. -?, -h help @fname indirect option file.
-header fname set output header filename.
-label str set label string.(label string = str)
-scale fval set convert scale.(svale = (float)fval)
N64では頂点値は符合付き16ビット整数として、Vtx テーブルに
記述されるため、元になるモデルデータによっては、数値の丸めによって 元の形状が壊されてしまう場合があります。そのとき指定してください。
デフォルトでは20倍に設定されています。
-niffinfo fname NIFF infomation on to file fname.
-nocomdef common define,typedef block no output.
複数のコンバートファイルを1つのコンパイル環境などで利用する場合などに便利です。
-regmask val prevent RDP register assignment.
bit0 ... CycleMode設定を抑制します。
bit1 ... RenderMode設定を抑制します。
bit2 ... ColorCombinerMode設定を抑制します。
bit3 ... Primitive color register への設定を抑制します。
bit4 ... Environment color register への設定を抑制します。
bit5 ... オブジェクトの先頭に来るレジスタ設定を抑制します。
-vtxshare val vertex shar on set minimum match length.
niff2gfx では、コンバート時、RCPでの頂点計算のパフォーマンスを向上させるため、出来るだけ頂点バッファを連続して転送させるようにします。
そのため、頂点テーブルには、同じ頂点情報が複数出力されます。 そのとき、既に出力した頂点バッファを見て、同じ連続する部分を使い回す評価を行うようにします。
たとえば、これから10頂点を頂点テーブルとして出力しようとする場合、 通常このまま10個のVtx を出力しますが、-vtxshare 5 としておくと、 過去に遡ってこの10頂点のうち、5頂点まで連続している部分があれば、 過去の頂点バッファを利用して、頂点の転送命令(gsSPVertex)を発行します。 このとき、頂点の転送命令が2つに増えていることにご注意下さい。
-vtxcache val vertex cache size(default 32).
gspF3DEX では頂点キャッシュが32個ですが、gspF3DLX.Rej では64、
gspF3DLP では80個まで、頂点キャッシュが増えます。それらのマイクロ コードを利用する場合、このオプションで頂点キャッシュを増やして
コンバートして下さい。デフォルトでは32になっています。
-vtxload val set vertex cache load limit(default 32).
-strictflat flat normal output to 3 vertices at all times.
マイクロコードの仕様では、フラットシェーディング時、3頂点のうち、
法線を表す頂点は1つでいいのですが、反射マッピングなどのST値 自動生成は、3頂点それぞれ別個におこなわれます。
そのため、フラットシェードで反射マッピングを行う場合、法線を 厳密に3頂点に設定する必要があります。このオプションは これらの設定を有効にします。
-noalignpad prevent alignment of 8-byte order no padding.
-outobj name output object by name.(default: all objects)
-outmask val prevent output dataclass assignment.
bit0(0x001) ... ヘッダ各ビットが1の状態の時、そのデータクラスは出力が「抑制」されます。 また、bit4 が1の場合、bit5,6は、常に1扱いとなります。
bit1(0x002) ... TLUT
bit2(0x004) ... ビットマップパターン
bit3(0x008) ... デフォーム関係データ
bit4(0x010) ... シェープ
bit5(0x020) ... 頂点リスト(Vtx 構造体配列)
bit6(0x040) ... ディスプレイリスト(Gfx 構造体配列)
bit7(0x080) ... オブジェクト構造体
bit8(0x100) ... アニメーション構造体
bit9(0x200) ... シーン構造体
-nogeomclr geometry mode no clear.
-binary, -b output gfx in binary file.
-preview val preview type value.(default: 0)
-rotorder val default rotation order.(default: 0x010203)
-vtxseg val Vtx segment number.(default: 5)
-imgseg val image data segment number.(default: 6)
-tlutseg val TLUT data segment number.(default: 7)
-nomodify disable modify vertex.
-strictcidx CIDX pixel/bits follow 'tex_type'.
-noreduct CIDX no color reduction.
-nullanim output null animation data.
@fname indirect option file.
-?, -h help
(例1) command line: % niff2gfx @ind cube.niff mdl_a.c "ind" file: -header a.h -strictflat converter parsing...: % niff2gfx -header a.h -strictflat cube.niff mdl_a.c (例2) command line: % niff2gfx @ind "ind" file: # option -header model.h -regmask 0x5 # no CycleMode & CC mode # input file cube.niff # output file model.c converter parsing...: % niff2gfx -header model.h -regmask 0x5 cube.niff model.c (例3) command line: % niff2gfx @opt @file "opt" file: # option -header model.h -regmask 0x5 # no CycleMode & CC mode "file" file: cube.niff model.c converter parsing...: (例2)と同じ
まず、イメージで使用されている色を16ビット(RGBA5551)にリダクションを
行い、その色で使用回数の多い順にソートして8ビットなら前から256色、4ビットなら
16色をパレットに設定しています。 αは1ビットしか有効になりませんので元のデータが0で透明、
0以外で不透明としています。
このパレットの色の中にに一致するものがない場合、RGBそれぞれの成分の差の自乗の和が最も小さいものを選択しています。
-noreduct を指定した場合は色数が多いとコンバートを中止します。
リソースの使用規則:
コンバータは、NIFFデータを解析して、幾つかのRDPレジスタを 使用します。PrimColor に、RDPのレジスタの Prim Color レジスタを、TriColor に、 Environment Color レジスタを、それぞれ割り当てて、カラーの変更は レジスタに割り付けられます。
カラーコンバイナモードの決定:
カラーコンバイナのモードは、 mat_shade_type の MAT_SHADE_LIGHT_* と、mat_color_type0 の以下のビットによって決定されます。MAT_CC_NIFF_VTX = 0x00000001 MAT_CC_NIFF_TRI = 0x00000002 MAT_CC_NIFF_PRIM = 0x00000004 MAT_CC_NIFF_TEX0 = 0x00000008 MAT_CC_NIFF_TEX1 = 0x00000010 MAT_CC_NIFF_TRI_ALPHA = 0x00020000 MAT_CC_NIFF_PRIM_ALPHA = 0x00040000 MAT_CC_NIFF_TEX0_ALPHA = 0x00080000以下のビットは、参照されません。MAT_CC_NIFF_VTX_ALPHA = 0x00010000 MAT_CC_NIFF_TEX1_ALPHA = 0x00100000それぞれビットアサインされているため、さまざまなモードが考えられます。 それは、以下のように決定されます。まず、カラーコンバイナ式ですが、以下のような計算式として評価します。
(Wch - Xch) * Ych + ZchWch, Xch, Ych, Zch は仮想カラーチャンネルで、これらは mat_color_type0 の 他のビットによって決定されます。まず、MAT_CC_NIFF_VTX, _TEX0_ALPHA, _PRIM_ALPHA,_TRI_ALPHA,_VTX_ALPHA によって、Ych が決定されます。
VTX_A TRI_A PRIM_A TEX0_A VTX Ych 0 0 0 0 0 Shade color(※) 0 0 0 0 1 Vertex color 0 0 0 1 * Texel0 alpha 0 0 1 * * Primitive alpha 0 1 * * * Env alpha 1 * * * 0 Shade alpha 1 * * * 1 Vertex alpha 上記 (*) の部分は不定値です。要するに、_VTX_ALPHA,_TRI_ALPHA,_PRIM_ALPHA, _TEX0_ALPHA,_VTX の順に評価され、上記のいずれかのモードに設定されます。
Shade color はライティングの設定とモデルのシェードから、SPが計算で 割り出すカラー値をあらわします。
Vertex color は、GeometryMode の設定で、G_LIGHTING を off としたとき、 Vtx 構造体の法線部分を利用したカラー値を抽出したものです。
(※)Ych が Shade Colorで、mat_shade_type の MAT_SHADE_LIGHT_* の 設定が、LOCAL, GLOBAL 共に0(照明が無効)の時、カラーコンバイナ式は、 以下の様に変更されます。
(1.0 - Xch) * Wch + Zch尚、2サイクルモードの時の 2サイクル目に対しては、この特殊ルールは 適用されません。Wch, Xch, Zch は、MAT_CC_NIFF_TRI/_PRIM/_TEX0/_TEX1 によって、決定されます。
TRI T1/PRIM TEX0 Wch Xch Zch 0 0 0 1.0 0.0 0.0 0 0 1 Tex0 0.0 0.0 0 1 0 T1/Prim 0.0 0.0 0 1 1 Tex0 T1/Prim T1/Prim 1 0 0 Env 0.0 0.0 1 0 1 Tex0 Env Env 1 1 0 T1/Prim Env Env 1 1 1 Tex0 T1/Prim Env Tex0 は、Texel0 カラーを示します。
Prim は、Primitive Color Register を示します。
Env は、Environment Color Register を示します。
T1/Prim は、TEXEL1/PRIMITIVE のどちらかで、 以下の様な規則によって 決定されます。
TEXEL1 PRIM T1/Prim 内容 0 0 0 ---- 0 1 1 Prim 1 * 1 TEXEL1 1サイクルモードの場合、以上の設定が、パイプライン2にも適用されます。
2サイクルモード時は、以上同様の評価を、mat_color_type1 に対して行ない、出力値の、
Shade color が Combine color に、 Shade Alpha が Combine Alpha に、
それぞれ置き換えられて出力されます。アルファコンバイナモードの決定:
アルファコンバイナモードは、 mat_alpha_type0 の以下のビットによって 決定されます。MAT_CC_NIFF_VTX_ALPHA = 0x00010000 MAT_CC_NIFF_TRI_ALPHA = 0x00020000 MAT_CC_NIFF_PRIM_ALPHA = 0x00040000 MAT_CC_NIFF_TEX0_ALPHA = 0x00080000 MAT_CC_NIFF_TEX1_ALPHA = 0x00100000以下のビットは、参照されません。MAT_CC_NIFF_VTX = 0x00000001 MAT_CC_NIFF_TRI = 0x00000002 MAT_CC_NIFF_PRIM = 0x00000004 MAT_CC_NIFF_TEX0 = 0x00000008 MAT_CC_NIFF_TEX1 = 0x00000010アルファコンバイナ式も、カラーコンバイナ式と同様に定義されます。(Wch - Xch) * Ych + ZchWch, Xch, Ych, Zch の各チャンネルは、上記の有効な5つのフラグによって、以下のような法則で決定されます。
VTX_A TRI_A T1/PRIM TEX0_A Wch Xch Ych Zch 0 0 0 0 0.0 0.0 0.0 1.0 0 0 0 1 0.0 0.0 0.0 Tex0 0 0 1 0 0.0 0.0 0.0 T1/Prim 0 0 1 1 Tex0 0.0 T1/Prim 0.0 0 1 0 0 0.0 0.0 Env 0.0 0 1 0 1 Tex0 0.0 Env 0.0 0 1 1 0 T1/Prim 0.0 Env 0.0 0 1 1 1 Tex0 Env T1/Prim Env 1 0 0 0 0.0 0.0 0.0 Shade 1 0 0 1 Shade 0.0 Tex0 0.0 1 0 1 0 Shade 0.0 T1/Prim 0.0 1 0 1 1 Shade T1/Prim Tex0 T1/Prim 1 1 0 0 Shade 0.0 Env 0.0 1 1 0 1 Shade Env Tex0 Env 1 1 1 0 Shade Env T1/Prim Env 1 1 1 1 Shade T1/Prim Tex0 Env VTX_ALPHA が、ShadeColor の制御フラグになっています。
T1/Prim は、TEXEL1/PRIMITIVE のどちらかで、 以下の様な規則によって 決定されます。
TEXEL1_A PRIM_A T1/Prim 内容 0 0 0 ---- 0 1 1 Prim 1 * 1 TEXEL1 1サイクルモードの場合、以上の設定が、パイプライン2にも適用されます。
2サイクルモード時は、以上同様の評価を、mat_color_type1 に対して行ない、 出力値の、 Shade Alpha が Combine Alpha に、置き換えられて出力されます。
ex.)
TMEMに収まらない64x32 のテクスチャを、バイリニア補間が有効なままで正方形のポリゴンに張り付けようとした場合、中央で2分割して32x32 の2つの四角ポリゴンとして張ろうと考えます。左側の四角ポリゴンで0ピクセル目から31ピクセル目までを、隣り合うポリゴンで32ピクセルから63ピクセルまでを描こうと考えるわけですが、この時左側の31ピクセル目から32ピクセル目へのバイリニア補間が必要なため、テクスチャとしては、33x33ピクセルをロードしなければなりません。 コンバータでは、そこまでを評価に入れますが、そのテクスチャタイルが4KのTMEMに収まるかまでは評価しません。
よって、「TMEMにピッタリ収まる」つもりで用意すると、時にテクスチャのパターンが崩れてしまう場合があります。