gspFast3D.htm
9.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">gspFast3D(3P) </font><BR>
</B>
<P>
<B>関数名<BR>
</B><blockquote>
<P>
gspFast3D, gspFast3D.dram, gspFast3D.fifo, gspF3DNoN, gspF3DNoN.dram, gspF3DNoN.fifo
<P>
→ ハイクオリティ3DポリゴンジオメトリRSPマイクロコード
<BR>
</blockquote>
<P>
<B>説明<BR>
</B>
<blockquote>
<P>
これは最適化、完全機能、3DポリゴンジオメトリRSPマイクロコードです。
<P>
これらは3Dクリッピング、ライティング、テクスチャ座標生成、フォグ、マトリクススタックなどをサポートしています。
<BR>
<P>
dramバージョンのマイクロコードは、RDPではなく、メモリバッファ(RDRAM)に出力(RDPディスプレイリスト)を転送する指示を行います。
<P>
fifoバージョンのマイクロコードは、メモリバッファ(RDRAM)をFIFOとして使用し、RDPにRDPディスプレイリストを転送します。
<p>
<b>gspFast3D</b>、<b>gspFast3D.dram</b>、<b>gspFast3D.fifo</b>バージョンのマイクロコードは、<b>gspF3DNoN</b>、<b>gspF3DNoN.dram</b>、<b>gspF3DNoN.fifo</b>バージョンに(それぞれ)等価です。これらの異なる点は、前者の3つのバージョンがNear Clippingプレーンでクリッピングを行うのに対し、後者の3つのバージョンはeyepointでクリッピングを行うということだけです。(<a href=#NearClipping>Near Clippingに関する注意</a>を参照してください。)
<p>
全ての処理はハイクオリティのイメージを作成するには十分実用的な精度で行われます。
</blockquote>
<b>
GBI
</b>
<p>
<blockquote>
以下のGBIコマンドはこのマイクロコードではサポートされません。
<pre><font size=4>
gSPLine3D
</pre></font>
全ての<a href="../gsp/gSPLine3D.htm">gSPLine3D(3P)</a>コマンドは、noopとして解釈され、何も影響しません。
</blockquote>
<b>
パフォーマンス
</b>
<blockquote>
このマイクロコードが生成するトライアングルのタイプは、高速から低速に並べると、以下のようになります。
<pre>
<font size=4>
Filled Flat Shaded(プリミティブカラーをDPで適切にセットする必要があります。)
Gouraud Shaded
Gouraud Shaded, Z-buffered
Gouraud Shaded, Textured
Gouraud Shaded, Textured, Z-bufferd
</font>
</pre>
トライアングルのアトリビュート計算は非常にベクトル化されていますので、他のアトリビュートの生成を行うとしたら、グローシェーディングアトリビュートの生成に必要な負荷はほとんど無視できます。
<p>
頂点変換とライティング計算は非常にベクトル化されていますので、一度に可能な限り多くの頂点をロードするのが最も良い方法です。頂点は2つで1グループとして処理されますので、偶数数のサイズをロードするのがより効果的です。
<p>
もしライティングを行い、いくつかの頂点がクリッピングされている場合、クリッピングとライティングは最も最近使用されたアルゴリズムを使ってマイクロコードのオーバーレイを実行します。ライティングは頂点をロードするときに処理され、クリッピングはトライアングルを描画するときに処理されるので、このマイクロコードの分割は受け入れられます。しかしながら、少数のトライアングルを描画するような、2〜3個の頂点だけを一度にロードするディスプレイリストは、マイクロコードを交換するオーバーヘッドを効率よく分割しません。
<p>
RCPはハイクオリティのテクスチャリングプリミティブを描画するためにデザインされています。可能なところで、ジオメトリを追加するよりも複雑なビジュアルを達成するためにテクスチャマッピングを使うべきです。
<p>
dramとfifoバージョンのマイクロコードを呼び出す上で、いくつかの相違点があります。
<p>
<b>gspFast3D:</b>
<p>
<blockquote>
このタスクに続くいくつかのタスクのフラグフィールドはOS_TASK_DP_WAITにセットしなければなりません。もしこのマイクロコードを使用する1つ以上のタスクが同じフレーム内に呼び出された場合、最後のタスクはそのディスプレイリスト内に<a href="../gsp/gSPFullSync.htm">gSPFullSync</a>を含まなければなりません。このマイクロコードはRDPへ全てのアウトプットを送ります。このマイクロコードを使用する場合はoutput_buff及びoutput_buff_sizeを指定する必要はありません。(タスクヘッダのこれらのフィールドには0を記述してください。)
</blockquote>
<p>
<b>gspFast3D.dram:</b>
<p>
<blockquote>
このマイクロコードを使用するタスクは<b>gspFast3D</b>あるいは<b>gspFast3D.fifo</b>に続く場合に限り、OS_TASK_DP_WAITフラグをセットする必要があります。このマイクロコードはデータをRDPではなく、RDRAM内のバッファに送ります。そのためCPUはRDPに送られるバッファを作成しなければなりません。バッファはタスクヘッダのoutput_buffで指し示されます。これはタスクによって生成されうる最大サイズのRDPディスプレイリストよりも大きいバッファを指さなければなりません。ジオメトリがクリッピングされるときにはRDPディスプレイリストが大きくなることを忘れないでください。そのためには余分な領域を確保しておいてください。バッファが全てのRDPディスプレイリストを格納するほど十分に大きくない場合、他のメモリ領域にオーバーライトしてしまいます!RSPが終了したとき、<a href="../os/osDpSetNextBuffer.htm">osDpSetNextBuffer(3P)</a>コマンドを使用してRSPに次のバッファを送ることが出来ます。(<a href="../os/osDpSetNextBuffer.htm">osDpSetNextBuffer(3P)</a>の為に必要な)バッファ内のデータの長さは、タスクヘッダ内にrdp_output_lenによって指し示されるアドレスに書かれます。ディスプレイリストがRDPに送られているときに、RSPは(output_buffが異なる)他のdramマイクロコードやオーディオタスクを実行することが出来ます。RDPに送られるディスプレイリストに<a href="../gdp/gDPFullSync.htm">gDPFullSync(3P)</a>が含まれていない場合は、(他のRSPタスクから他のバッファへの)他のRDPディスプレイリストを他の<a href="../os/osDpSetNextBuffer.htm">osDpSetNextBuffer</a>コマンドを使って送ることが出来ます。しかしながら、ディスプレイリストに<a href="../gdp/gDPFullSync.htm">gDPFullSync(3P)</a>が含まれている場合は、ディスプレイリストが終了するまで<a href="../os/osDpSetNextBuffer.htm">osDpSetNextBuffer</a>を使って他のRDPディスプレイリストを送ったり、<b>gspFast3D</b>や<b>gspFast3D.fifo</b>タスクを開始したりしないでください。
</blockquote>
<p>
<b>gspFast3D.fifo:</b>
<p>
<blockquote>
このマイクロコードを使用するタスクは<b>gspFast3D</b>タスクや<a href="../os/osDpSetNextBuffer.htm">osDpSetNextBuffer</a>コマンドに続くときに限りOS_TASK_DP_WAITフラグをセットしなければなりません。このマイクロコードはRDPへのRDPディスプレイリストの転送を監視します。それはタスクヘッダ内でoutput_bufによって示されるバッファを使用します。このバッファはキャッシュアラインされていなければなりません。output_buff_sizeはバッファの最後のバイトに続くバイトへのポインタでなければなりません。バッファは大きいほどRSPとRDPとの間のインターフェイスはより実用的になります。fifoマイクロコードをそれぞれ使用している複数のタスクを並べている場合は、フレーム内の最後のタスクにのみ<a href="../gdp/gDPFullSync.htm">gDPFullSync(3P)</a>を入れておいてください。fifoマイクロコードを使用した複数のタスクを連続する場合、全てのタスクについて同じoutput_buffバッファを使用してください。(それぞれのタスクについて別々のバッファを使用することもできますが、全てのタスクについて1つの大きなバッファを使用する方がより効率的です。)
</blockquote>
<p>
<a name=NearClipping></a><b>NEAR CLIPPINGに関する注意</b>
<p>
<blockquote>
Near Clippingはビューアの後ろあるいはビューアとNear Clippingプレーンの間のジオメトリを取り除きます。現実ではオブジェクトが視点に近づいたときに消えると言うことはありませんので、N64上でそういうことが起こらないようにすることは重要です。一つの方法としては、nearプレーンを視点に非常に近い位置にする(<a href="../gu/guPerspective.htm">guPerspective(3P)</a>コールでnear値を小さくする。)という方法があります。これはいつもうまく行くわけではありません。なぜなら、Z精度とテクスチャマッピングの精度はnear/far比が小さくなるほど悪くなるからです。別の解決方法としてはNear Clippingを行わない<b>gspF3DNoN</b>マイクロコード(あるいはそのdram、fifoバージョン)を使用すると言うことがあげられます。ビューアの後ろにあるオブジェクトはそれでもクリッピングされ、nearプレーンよりも遠くのオブジェクトは見えています。しかし、nearプレーンとビューアの間のオブジェクトも見えています。こうすることで視点とnearプレーンの間でジオメトリが消えてしまうこと無しにnear値を増やすことが出来ます。Zバッファリングは視点とnearプレーンとの間のエリアでは機能しません。その結果、nearプレーンとビューアの間のオブジェクトはお互いを正確には隠しません。例えば、アステロイドタイプのゲームで、1つのアステロイドがnearプレーンよりも視点に近づくと、それは正確に描画されます。(nearプレーンよりも遠くのオブジェクトは隠れます。)しかし、2つのアステロイドの両方ともがnearプレーンよりも近づいた場合は、それぞれ正確に隠すことは出来ません。
</blockquote>
<p>
<b>デフォルトRDPステート</b>
<p>
<blockquote>
グラフィクスタスクが最初にスタートされる時はいつも、RDPステートのいくつかはデフォルトステートにイニシャライズされます。残りのステートは以前の値が残ります。yieldからリスタートした後、RDPステートはyield時にセットされたステートにリストアされます。以下がデフォルトのRDPセッティングです。
<pre><font size=4>
gsDPSetAlphaCompare(G_AC_NONE)
gsDPSetDepthSource(G_ZS_PIXEL)
gsDPSetRenderMode(RM_NOOP, RM_NOOP2)
gsDPSetAlphaDither(G_AD_DISABLE)
gsDPSetColorDither(G_CD_DISABLE)
gsDPSetCombineKey(G_CK_NONE)
gsDPSetTextureConvert(G_TC_FILT)
gsDPSetTextureFilter(G_TF_POINT)
gsDPSetTextureLUT(G_TT_NONE)
gsDPSetTextureLOD(G_TL_NONE)
gsDPSetTextureDetail(G_TD_CLAMP)
gsDPSetTexturePersp(G_TP_PERSP)
gsDPSetCycleType(G_CYC_1CYCLE)
gsDPPipelineMode(G_PM_NPRIMITIVE)
</pre></font>
</blockquote>
<p>
<b>バグ</b>
<p>
<blockquote>
特にありません。
</blockquote>
<p>
<b>参照</b>
<p>
<blockquote>
<a href="../ucode/gspLine3D.htm">gspLine3D(3P)</a>、<a href="../ucode/gspTurbo3D.htm">gspTurbo3D(3P)</a>、<a href="../os/osSpTaskStart.htm">osSpTaskStart(3P)</a>
</blockquote>
</blockquote>
</BODY>
</HTML>