gspSprite2D.htm
9.38 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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<HTML>
<HEAD>
<TITLE>gspSprite2D</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.03j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">gspSprite2D(3P)<BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
gspSprite2D,gspSprite2D.dram,gspSprite2D.fifo<IMG SRC="../Images/update.gif">
<P>
→ 高性能2Dスプライトジオメトリマイクロコード<BR>
<P>
<B>説明</B>
<P>
これは、最適化され、全機能を含んだ2Dスプライトジオメトリマイクロコードです。自動細分化をサポートし、<A HREF="../gsp/gSPTextureRectangle.htm">gSPTextureRectangle</A>コマンド中でサポートされている全テクスチャフォーマットのサイズ・タイプの任意のサイズをDRAMのイメージからロードして、RDPに直接おくります。さらに、画像の拡大やX,Y方向の反転も可能です。
<BR>
<P>
<B>使用方法<BR>
</B>
<HR>
<P>
<A NAME="OLE_LINK1"></A><IMG SRC="../Images/update.gif">
<P>
スプライトマイクロコードは新しい4つのコマンドの組み合わせでアクセスします。最初のコマンド、<A HREF="../gu/guSprite2DInit.htm">guSprite2DInit</A>は、ユーザーが指定したスプライト構造体を初期化するのに使います。それから、<A HREF="../gsp/gSPSprite2DBase.htm">gSPSprite2DBase</A>(3P)コマンドでスプライト構造体をマイクロコードに送って、実際の処理をさせます。<A HREF="../gu/guSprite2DInit.htm" >guSprite2DInit</A>(3P)コマンドは単に、アプリケーションがスプライト構造体を直接初期化しなくてもいいように作られた、便利な関数です。
<BR>
<P>
<A HREF="../gsp/gSPSprite2DBase.htm" >gSPSprite2DBase</A>(3P)は、基本的な、あるいは共通のスプライトパラメータを初期化するために用いられます。実際の描画は行われません。
<BR>
<P>
<A HREF="../gsp/gSPSprite2DScaleFlip.htm" >gSPSprite2DScaleFlip</A>(3P)はスプライトに対して、X/Yのスケーリングや、フリッピングパラメータを指定するために使用されます。実際の描画は行われません。
<BR>
<P>
<A HREF="../gsp/gSPSprite2DDraw.htm" >gSPSprite2DDraw</A>(3P)はスプライトをどこに描くか、そのスクリーン座標を指定し、既に<A HREF="../gsp/gSPSprite2DBase.htm" >gSPSprite2DBase</A>(3P)と<A HREF="../gsp/gSPSprite2DScaleFlip.htm" >gSPSprite2DScaleFlip</A>(3P)によって設定されているパラメータを用いて実際の描画をスタートさせます。
<BR>
<P>
スプライトを表示する簡単なコードは次のようになります。<BR>
<BR>
<PRE>
<FONT SIZE=4>#include "gu.h"
#include "gbi.h"
uSprite MySprite;
guSprite2DInit(&MySprite, ImagePointer, TlutPointer,
ImageWidth, RectangleWidth, RectangleHeight,
ImageType, ImageSize,
TextureStartS, TextureStartT);
gSPSprite2DBase(glistp++, OS_K0_TO_PHYSICAL(&MySprite));
gSPSprite2DScaleFlip(glistp++, ScaleX, ScaleY,
FlipTextureX, FlipTextureY);
gSPSprite2DDraw(glistp++, PScreenX, PScreenY)
</FONT>
</PRE>
<P>
以下にこれらのパラメータについて説明します。 <BR>
<PRE>
<FONT SIZE=4>typedef struct {
void *SourceImagePointer;
void *TlutPointer;
short Stride;
short SubImageWidth;
short SubImageHeight;
char SourceImageType;
char SourceImageBitSize;
short SourceImageOffsetS;
short SourceImageOffsetT;
/* 20 bytes for above */
/* padding to bring structure size to 64 bit allignment */;
char dummy[4];
} uSprite_t;
typedef union {
uSprite_t s;
/* Need to make sure this is 64 bit aligned */;
long long int force_structure_allignment[3];
} uSprite;
void guSprite2DInit(uSprite *SpritePointer,
void *SourceImagePointer,
void *TlutPointer,
int Stride,
int SubImageWidth,
int SubImageHeight,
int SourceImageType,
int SourceImageBitSize,
int SourceImageOffsetS,
int SourceImageOffsetT);
</FONT>
</PRE>
<HR>
<P>
<B>パラメータ<BR>
</B>
<P>
<B>SpritePointer</B> パラメータを設定するスプライト構造体のポインタ。
<BR>
<P>
<B>SourceImagePointer</B> 表示する矩形のイメージが含まれるメモリ上のテクスチャイメージのベースポインタ。
<BR>
<P>
<B>TlutPointer</B> CIイメージで用いるカラーインデックスのポインタ。
CIイメージを用いない場合はNULLにする。 <BR>
<P>
<B>Stride</B> メモリ上のベースイメージのテクセルの幅。 <BR>
<P>
<B>SbuImageWidth</B> 表示するイメージのテクセル幅。 <BR>
<P>
<B>SubImageHeight</B> 表示するイメージのテクセル高。 <BR>
<P>
<B>SourceImageType</B> メモリ上のテクスチャイメージのフォーマットを指定します。
G_IM_FMT_RGB,G_IM_FMT_CIのようなハードでサポートされるテクスチャフォーマットがすべて使えます。
<BR>
<P>
<B>SourceImageBitSize</B> 入力イメージのテクセルあたりのビット数。
G_IM_SIZ_32b、G_IM_SIZ_4bのようなハードでサポートされるテクスチャサイズがすべて使えます。
<BR>
<P>
<B>ScaleX</B> 入力画像に対するX軸方向のスケールを、s5.10固定小数点で指定します。
ここを1024にすると1倍になります。 512にすると、入力テクセルは出力スクリーンのピクセルでは2倍に拡大されます。スケールの値は、不自然になるのを防ぐために1024以下にしなければなりません。スケール値は正の値でなければなりません。負のスケールのイメージにするにはFlipTextureX変数を使います。
<BR>
<P>
<B>ScaleY</B> 入力画像に対するY軸方向のスケールを、s5.10固定小数点で指定します。ここを1024にすると1倍になります。512にすると、入力テクセルは出力スクリーンのピクセルでは2倍に拡大されます。スケール値は、イメージが不自然になるのを防ぐために1024以下にしなければなりません。スケール値は正の値でなければなりません。負のスケールのイメージにするにはFlipTextureY変数を使います。
<BR>
<P>
<B>FlipTextureX</B> X方向に対して表示するイメージを反転するかどうかの指定。
<BR>
<P>
<B>FlipTextureY</B> Y方向に対して表示するイメージを反転するかどうかの指定。
<BR>
<P>
<B>SourceImageOffsetS</B> ベースイメージの原点からテクセル列へのオフセット。ベースイメージ内のテクセル表示する矩形領域の開始位置を指定します。
<BR>
<P>
<B>SourceImageOffsetT</B> ベースイメージの原点からテクセル行へのオフセット。ベースイメージ内のテクセル表示する矩形領域の開始位置を指定します。
<BR>
<P>
<B>PScreenX</B> イメージを出力するスクリーン座標のX位置を指定します。原点はスクリーンの左上です。
<BR>
<P>
<B>PScreenY</B> イメージを出力するスクリーン座標のY位置を指定します。原点はスクリーンの左上です。
<BR>
<P>
<B>GBI<BR>
</B>
<P>
次のGBIコマンドは、このマイクロコードではサポートされません。
<P>
<A HREF="../gsp/gSPLine3D.htm" >gSPLine3D</A>(3P),<A HREF="../gsp/gSP1Triangle.htm" >gSP1Triangle</A>(3P)
<BR>
<P>
<B>注意<BR>
</B>
<P>
スプライトマイクロコードは、Zバッファリングを直接サポートしていません。適当なレンダリングモードを設定し、ハードウェアプリミティブデプスレジスタスを使用すると、スプライトマイクロコードの外でZバッファリングが実現できるので必要ないのです。Zバッファリングするコードの一部は、次のようになります。
<BR>
<PRE>
<FONT SIZE=4>gDPSetRenderMode(glistp++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
gDPSetDepthSource(glistp++, G_ZS_PRIM);
gDPSetCombineMode(glistp++, G_CC_DECALRGB, G_CC_DECALRGB);
gDPSetPrimDepth(glistp++, ZBufferValue, 0);
</FONT>
</PRE>
<HR>
<PRE>
<B><IMG SRC="../Images/update.gif"></B>
<FONT SIZE=4>guSprite2DInit(&MySprite, ImagePointer, TlutPointer,
ImageWidth, RectangleWidth, RectangleHeight,
ImageType, ImageSize,
TextureStartS, TextureStartT);
gSPSprite2DBase(glistp++, OS_K0_TO_PHYSICAL(&MySprite));
gSPSprite2DScaleFlip(glistp++, ScaleX, ScaleY,
FlipTextureX, FlipTextureY);
gSPSprite2DDraw(glistp++, PScreenX, PScreenY);
</FONT>
</PRE>
<HR>
<P>
<B>警告、制限、バグ、意見<BR>
</B>
<P>
Y軸に対して単位外の拡縮と反転をしたイメージは、サブピクセルの量により縦方向が滑らかに変換されないかもしれません。これは、決まった量はジャンプするこを示します。解決方法は、縦方向では、単位外の拡大を単位量に変換することです。
<BR>
<P>
スプライトマイクロコードは、イメージを任意に拡大するよう設計されています。また、イメージは、いくつか付随したものと一緒に縮小させることもできます。TextureScaleXとTextureScaleYパラメータはs5.10の固定小数点ですが、正の値に制限されていることに注意してください。したがって、使用可能ば最大値は32767で、これはテクセルとピクセルの比率が31.999に相当します。
<BR>
<P>
Y軸に拡縮されたりサブピクセルスキャンラインに配置されたテクスチャイメージは、ハードウェアテクスチャフィルタユニットによってフィルタリングするよう要求します。このフィルタリングは、フィルタリングが行われるようにするためにテクスチャメモリにロードした画像に少なくとも余分に一列必要です。テクスチャメモリは4KBに限られているので、結果として次のような制限があります。
<BR>
<P>
Y方向に拡縮している32bit矩形領域は、マイクロコードが最大512テクセル幅になるよう調整します。
<BR>
<P>
さらに <BR>
<P>
Y方向でサブピクセル境界の最初に配置され、幅が512テクセルより大きい32bit矩形領域は、整数の走査線の境界になるようにマイクロードが調整します。
<BR>
<P>
また、このフィルタリングの条件は、Y方向にスケールされたイメージを表示するとき、範囲外のテクセルをフィルタリングするのを防ぐためにTの値に1を足す必要があるということに注意してください。
<BR>
<P>
垂直方向に2の累乗でない値に拡大してY軸反転したイメージは、反転していない場合と高さが少し異なります。もし、拡大反転したテクスチャと反転していないテクスチャを含むアニメーションをするなら、Yの拡大値を2の累乗になるように制限してください。
<BR>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="gspLine3D.htm">gspLine3D(3P)</A>, <A HREF="gspTurbo3D.htm">gspTurbo3D(3P)</A>,
<A HREF="gspFast3D.htm">gspFast3D(3P)</A>, <A HREF="../os/osSpTaskStart.htm">osSpTaskStart(3P)</A>
,<BR>
<A HREF="../gsp/gSPSprite2DBase.htm" >gSPSprite2DBase</A>(3P),
<A HREF="../gsp/gSPSprite2DScaleFlip.htm" >gSPSprite2DScaleFlip</A>(3P),
<A HREF="../gsp/gSPSprite2DDraw.htm" >gSPSprite2DDraw</A>(3P)
<BR>
<P>
</BODY>
</HTML>