gspF3DEX.htm
7.2 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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<html>
<title>F3DEXマイクロコードmanマニュアル</title>
</body>
<p>
<img src="../Images/f3dex.gif">
<p>
<B><FONT FACE="Arial">gspF3DEX(3P) </font><BR>
</B>
<P>
<B>関数名<BR>
</B><blockquote>
<P>
gspF3DEX.fifo, gspF3DEX.NoN.fifo, gspF3DLX.fifo, gspF3DLX.NoN.fifo, gspF3DLX.Rej.fifo, gspF3DLP.Rej.fifo, gspL3DEX.fifo<P>
→ 新規マイクロコード群
<BR>
</blockquote>
<P>
<B>説明<BR>
</B>
<blockquote>
<b>gspF3DEX.fifo.o, gspF3DEX.NoN.fifo.o:</b>
<p>
<blockquote>
<a href="../ucode/gspFast3D.htm">Fast3Dマイクロコード</a>をベースに 頂点キャッシュを 32 に増やし,2Triangles 命令を実装したものです. また DL のリンク数は 10 段から 18
段に増えています.
<p>
<b>gspF3DEX.fifo.o</b> は Near クリップ付で <b>gspF3DEX.NoN.fifo.o</b> は Nearクリップ無しのバージョンです.
</blockquote>
<p>
<b>gspF3DLX.fifo.o, gspF3DLX.NoN.fifo.o:</b>
<p>
<blockquote>
<b>F3DEX</b>におけるサブピクセル計算を簡略化することで, 速度を上げたものです. このためテクスチャ使用時に, 少ししわなどが出る場合があります.
<p>
<b>F3DLX</b>のGBIは<b>F3DEX</b>と互換です. また <b>F3DLX</b> の追加機能として Clipping の ON/OFF を制御できます. クリッピング OFF の時にはパフォーマンスが少し向上します. 詳しくは NewFunctions.jp をお読みください.
<p>
<b>gspF3DLX.fifo.o</b> は Near クリップ付で <b>gspF3DLX.NoN.fifo.o</b> は Near
クリップ無しのバージョンです.
</blockquote>
<p>
<b>gspF3DLX.Rej.fifo.o, gspF3DLP.Rej.fifo.o:</b>
<p>
<blockquote>
通常のマイクロコードにおけるクリップ処理を止め, その代りとしてリジェクト処理を実装したマイクロコードです.
<p>
ここでいうリジェクト処理とは, 「画面の外側の一定範囲内に 3 頂点
が入っている 3 角形のみを描画し, 1 頂点でも外に出ている場合はその3角形全体の描画を行なわない」というものです.
<p>
この範囲のことをリジェクトボックスと呼びます. リジェクトボックスは, 条件によって異なりますが, X,Y 方向について言えば, 画面サイズが 320x240 の場合, 初期状態では, 以下の図の様に画面のおおよそ 2 倍分の範囲となります.
<p>
この範囲は <a href="../gsp/gSPClipRatio.htm">g*SPClipRatio</a> で変更することができます. 値としては FRUSTRATIO_2 から FRUSTRATIO_6 を指定できます.
<p>
また Z 方向(画面の奥行き方向)については, Far プレーンでリジェクトされます. Near プレーンではリジェクトされません.
<pre>
-160 480
-120 +--------------------------+
| | ___FRUSTRATIO_2 の時の
| 0 320 |/ リジェクトボックス
| 0 +------------+ |
| | | |
| | | |
| | 画面 | |
| | | |
| | | |
| 240+------------+ |
| |
| |
360 +--------------------------+
</pre>
<p>
大きな 3 角形を表示するときに, リジェクト処理のため, 画面に出るべき 3 角形であってもその 1 頂点が外に出ているために描画されないことがあります.この場合は, その 3 角形をより小さな 3 角形に分割して, 不自然な「ポリゴン欠け」が起こらないようにする必要があります.
<p>
<b>F3DLX.Rej</b>, <b>F3DLP.Rej</b> ではこのリジェクト処理を採用することによって
2 Triangles 命令の処理速度を上げることができました.そのため, DL の生成時にはなるべく <a href="../gsp/gSP2Triangles.htm">g*SP2Triangles</a> を使用するようにしてください.
<p>
<b>gspF3DLX.Rej.fifo.o</b> はテクスチャ補正ありのバージョンで,<b>gspF3DLP.Rej.fifo.o</b> はテクスチャ補正なしのバージョンです.<b>F3DLP.Rej</b> の方が <b>F3DLX.Rej</b> よりも僅かに早くなっています. SP の処理はこれによって軽くなりますが, DP の処理自体には変化がないので DP がSP の処理についてこない場合が多くなります. こうしたときには <a href="../gdp/gDPSetRenderMode.hmt">render mode</a> を RA モード(G_RM_RA_ZB_OPA_SURF)等にすることを検討する必要もあるでしょう.
<p>
またこのマイクロコードでは <a href="../gsp/gSPSetGeometryMode.htm">G_CULL_BOTH</a> をサポートしていません.
</blockquote>
<p>
<b>gspL3DEX.fifo.o:</b>
<blockquote>
<a href="../ucode/gspLine3D.htm">Line3D</a> マイクロコードの 32 頂点対応版です.また F3DEX 系マイクロコードの <a href="../gsp/gSP1Triangle.htm">1Triangle</a>, <a href="../gsp/gSP2Triangles.htm">2Triangles</a>, <a href="../gsp/gSP1Quadrangle.htm">1Quadrangle</a> をワイアフレームで表示します.
</blockquote>
</blockquote>
<p>
<b>ヘッダファイル:</b>
<p>
<blockquote>
<pre><font size=4>
headers-2.0e/*.h U64 Dev 2.0e 用のヘッダファイル
headers-2.0f/*.h U64 Dev 2.0f 用のヘッダファイル
headers-2.0g/*.h U64 Dev 2.0g 用のヘッダファイル
</font></pre>
<p>
お使いの開発環境に応じたファイルを /usr/include/PR に移してお使い下さい.
</blockquote>
<p>
<b>GBI の互換性について:</b>
<p>
</blockquote>
パッケージ内のマイクロコードの GBI (Graphics Binary Interface) と従
来の<a href="../ucode/gspFast3D.htm">Fast3D マイクロコード</a>との GBI にはバイナリレベルにおいての互換性がありません.
<p>
ただし gbi.h によって, これらの違いを吸収するように作成してあります.
同じ DL でもコンパイルオプションでそれぞれに適した GBI に振り分けられ
るようになっています.
<p>
具体的には gbi.h を include する前 (通常は ultra64.h を include すれ
ば gbi.h も include されます) にキーワード "F3DEX_GBI" を定義しておく
ことで, 本パッケージのマイクロコードに対応した GBI を出力します.
<p>
例えば, DL をファイル static_ex.c に記述したときには,
<p>
<pre><font size=4>
static_ex.c:
|
|#define F3DEX_GBI
|#include <ultra64.h>
|
</font></pre>
<p>
のように, ultra64.h の include の前に #define F3DEX_GBI を追加してく
ださい.
<p>
<b>F3DEX</b>, <b>F3DLX</b>, <b>F3DLX.Rej</b>, <b>F3DLP.Rej</b> のマイクロコード間は全て GBI バイナリレベル互換となっています. よって, DL をそれぞれに使い回すことが可能となりました. ただし, 前項で述べたようなリジェクト処理のために同じ命令でも微妙に動作が異なっていますので同じ DL でも同じ画面
が描画されるとは限らないので注意は必要です.
</blockquote>
<p>
<b>OS のパッチ:</b>
<p>
<blckquote>
ディレクトリ os_patches/ 下には, <a href="../gsp/gSPLoadUcode.htm">g*SPLoadUcode</a> のための OS のパッチがあります. 以下の様にしてパッチをあててください.
<p>
<pre><font size=4>
% cd os_patches
% make
</font></pre>
これで os_patches/ ディレクトリ下にパッチのあたった libultra.a,
libultra_rom.a, libultra_d.a が作成されます. これらを /usr/lib に移してお使
い下さい.
</blockquote>
<p>
<b>F3DEX(.NoN), F3DLX(.NoN), F3DLX.Rej, F3DLP.Rej, L3DEXで追加、変更された関数</b>
<p>
<blockquote>
<ul>
<li><a href="../gsp/gSPVertex.htm">gSPVertex(3P)</a><br>
<li><a href="../gsp/gSP2Triangles.htm">gSP2Triangles(3P)</a><br>
<li><a href="../gsp/gSP1Quadrangle.htm">gSP1Quadrangle(3P)</a><br>
<li><a href="../gsp/gSPSetGeometryMode.htm">gSPSetGeometryMode(3P)</a><br>
<li><a href="../gsp/gSPCullDisplayList.htm">gSPCullDisplayList(3P)</a><br>
<li><a href="../gsp/gSPClipRatio.htm">gSPClipRatio(3P)</a><br>
<li><a href="../gsp/gSPModifyVertex.htm">gSPModifVertex(3P)</a><br>
<li><a href="../gsp/gSPBranchLessZ.htm">gSPBranchLessZ(3P)</a><br>
<li><a href="../gsp/gSPBranchLessZrg.htm">gSPBranchLessZrg(3P)</a><br>
<li><a href="../gsp/gSPLoadUcode.htm">gSPLoadUcode(3P)</a><br>
<li><a href="../gsp/gSPLoadUcodeL.htm">gSPLoadUcodeL(3P)</a><br>
</ul>
</blockquote>
</body>
</hmtl>