gSPVertex.htm
3.63 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
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<A NAME="_Toc366998495"></A><B><FONT FACE="Arial">gSPVertex(3P)
<BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
gSPVertex, gsSPVertex
<P>
→ オンチップバーテックスキャッシュ内に頂点をロードします。
<BR>
<P>
<B>構文<BR>
</B>
<P>
#include "gbi.h"
<P>
typedef struct {
<P>
short ob[3]; /* x, y, z */
<P>
unsigned short flag;
<P>
short tc[2]; /* テクスチャ座標 */
<P>
unsigned char cn[4]; /* カラー & アルファ */
<P>
} Vtx_t;
<P>
typedef struct {
<P>
short ob[3]; /* x, y, z */
<P>
unsigned short flag;
<P>
short tc[2]; /* テクスチャ座標 */
<P>
signed char n[3]; /* ノーマル */
<P>
unsigned char a; /* アルファ */
<P>
} Vtx_tn;
<P>
typedef union {
<P>
Vtx_t v; /* カラーに対してこれを使用する */
<P>
Vtx_tn n; /* ノーマルに対してこれを使用する */
<P>
long long int force_structure_alignment;
<P>
} Vtx;
<P>
gSPVertex(Gfx *gdl, Vtx *v, unsigned int n, unsigned int v0)
<P>
gsSPVertex(Vtx *v, unsigned int n, unsigned int v0)<BR>
<P>
<B>パラメータ<BR>
</B>
<P>
<B>*gbl</B> グラフィクスディスプレイリストポインタ
<P>
<B>v</B> バーテックスリストポインタ(セグメントアドレス)
<P>
<B>n</B> verticesの数
<P>
<B>v0</B> バーテックスバッファにおけるインデックスv0(0~15)でバーテックスをロード
します。<BR>
<P>
<B>説明<BR>
</B>
<P>
このコマンドは、ポリゴンを生成するコマンドであるgSP1Triangle(3P)によって使用される頂点をRSP内の内部バーテックスバッファにロードします。このバーテックスキャッシュは16のバーテックスまで格納し、バーテックスのローディングはキャッシュ中のどのエントリ(インデックス)からでも開始することができます。バーテックス座標(x,y,z)は符号付き2の補数16bit整数でコード化されます。テクスチャ座標(s,t)はs10.5形式でコード化されます。バーテックスはカラーあるいは法線(シェーディング用)のどちらかを持っています。これらの値はそれぞれ8bitです。カラー及びアルファ値はそれぞれ符号無し8bit値(0~255)として取り扱われます。法線は符号付き8bit値(-128~127)として取り扱われます。そのため、使用する共用体の適切なメンバー(.v.
or .n.)は、カラーあるいは法線のどちらを使用しているかに依存します。
<P>
法線座標範囲は-1.0から1.0までです。つまり-1.0値は-128で、1.0値は128で表現します。しかしながら符号付き8bitの精度ですので、正確には正の最大値は127となり、1.0値を正確に表すことはできません。そのため、0.992が最大の正の数となります。(目的を考えますと、十分であると思われます。)
<P>
Vtxストラクチャのフラグ値flagは現在は意味を持ちません。
<P>
(x,y,z)は4×4プロジェクション及びモデルビューマトリクスで変換されます。(s,t)は、gSPTexture(3P)で定義されたスケールを使用して変換されます。
<BR>
<P>
<B>例<BR>
</B>
<P>
バーテックスキャッシュエントリ2,3,4をロードするためには以下のように記述してください。
<P>
gSPVertex(glistp++, v, 3, 2);<BR>
<br>
<p>
<b>注意</b><br>
<p>
RSPジオメトリ変換エンジンはバーテックスリスト、トライアングルリストアーキテクチャを使用するので、非常に強力です。一つのシンプルなトライアングルコマンドは最大のパフォーマンスを持っています。
<p>
<hr size=1>
<img src="../Images/f3dex.gif">
<p>
<blink><b>F3DEXマイクロコード群で追加、変更された機能</b></blink>
<p>
<pre><font size=4>
gSPVertex(Gfx *pkt, Vtx *v, u32 n, u32 v0)
gsSPVertex( Vtx *v, u32 n, u32 v0)
</font></pre>
<p>
<blockquote>
頂点キャッシュのサイズの変更により、n及びv0の値の範囲が変更になりました。ただし、一度にロードできる頂点の数は32以下ですので、それ以上の頂点をロードするには2回以上に分ける必要があります。
<p>
<img src="V_cache_size.gif">
<p>
(*)33頂点以上ロードしたいときは、<b>gSPVertex<b>を複数回使用すること。
</blockquote>
</BODY>
</HTML>