gSPTextureRectangle.htm
6.49 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
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<A NAME="_Toc366998493"></A><B><FONT FACE="Arial">gSPTextureRectangle(3P)</FONT><FONT FACE="MS Pゴシック">
<BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
gSPTextureRectangle, gsSPTextureRectangle, gSPTextureRectangleFlip,
gsSPTextureRectangleFlip, gSPScisTextureRectangle
<P>
→ スクリーン座標でテクスチャ長方形をレンダリングします。(スプライト)
<BR>
<P>
<B>構文<BR>
</B>
<P>
#include "gbi.h"
<P>
gSPTextureRectangle(Gfx *gdl,
<P>
unsigned int ulx,
<P>
unsigned int uly,
<P>
unsigned int lrx,
<P>
unsigned int lry,
<P>
int tile, int s, int t,
<P>
int dsdx, int dtdy)
<P>
gsSPTextureRectangle(unsigned int ulx,
<P>
unsigned int uly,
<P>
unsigned int lrx,
<P>
unsigned int lry,
<P>
int tile, int s, int t,
<P>
int dsdx, int dtdy)
<P>
gSPTextureRectangleFlip(Gfx *gdl,
<P>
unsigned int ulx,
<P>
unsigned int uly,
<P>
unsigned int lrx,
<P>
unsigned int lry,
<P>
int tile, int s, int t,
<P>
int dsdx, int dtdy)
<P>
gsSPTextureRectangleFlip(unsigned int ulx,
<P>
unsigned int uly,
<P>
unsigned int lrx,
<P>
unsigned int lry,
<P>
int tile, int s, int t,
<P>
int dsdx, int dtdy)
<P>
gSPScisTextureRectangle(Gfx *gdl,
<P>
unsigned int ulx,
<P>
unsigned int uly,
<P>
unsigned int lrx,
<P>
unsigned int lry,
<P>
int tile, int s, int t,
<P>
int dsdx, int dtdy)<BR>
<P>
<B>パラメータ <BR>
</B>
<P>
<B>*gdl</B> グラフィックディスプレイリストポインタ
<P>
<B>ulx, uly</B>
<P>
長方形の左上スクリーン座標。それぞれ、固定小数点10.2フォーマット(整数
部10bit,小数部2bit)。これらは、負の可能性のある<b>gSPScisTextureRectangle(3P)</b>
以外では、正の数です。
<P>
<B>lrx, lry</B>
<P>
長方形の右下スクリーン座標。それぞれ,固定小数点10.2フォーマット。こ
れらは、負の可能性のある<b>gSPScisTextureRectangle(3P)</b>以外では、正の数です。
<P>
<B>tile</B>
<P>
テクスチャタイルナンバー。RDPの8つのテクスチャタイル記述子のうちの1
つを選択します。
<P>
<B>s, t</B>
<P>
長方形の左上角のテクスチャ座標(S10.5フォーマット)。
<P>
<B>dsdx, dtdy</B>
<P>
x, yの変化毎のs, tの変化(S5.10フォーマット)。<BR>
<P>
<B>説明<BR>
</B>
<P>
このコマンドはテクスチャリングされた2D長方形を描きます。別のコマンド<a href="../gdp/gDPFillRectangle.htm">gDPFillRectangle(3P)</a>は単一カラーで長方形を塗りつぶすために使用します。描かれた長方形は、コピーモードで指定された座標を含んでいます。1サイクルモードや2サイクルモードでは,長方形は適切にアンチエイリアシングを行うために底辺と右端のエッジを除いて描画されます。例えば、ulx=(0<<2),
lrx=(19<<2)はコピーモードでは20ピクセルの縦列を塗りつぶしますが、1サイクルモードや2サイクルモードでは19列しか描画しません。
<BR>
<P>
<b>gSPTextureRectangleFlip(3P)</b>コマンドは、y方向にs座標を変化させ、x方向にt座標を変化させるためにテクスチャをフリップします。
<BR>
<P>
<B>注意<BR>
</B>
<P>
スクリーン座標(0,0)は左上角を意味します。<BR>
<P>
x, yそれぞれに対して整数部10bitと小数部2bitの精度があります。したがって、1024の2乗よりも大きいフレームバッファをアドレス指定することはできません。
<BR>
<P>
コピーモードでテクスチャレクタングルを使用しているときは,x,
y座標の2つの小数ビットは無視されます。なぜなら、コピーモードではテクセルとピクセルが1対1対応しているからです。また、コピーモードではdsdxを(4
<< 10)に設定してください。これは、コピーモードでは4つの水平に隣接したテクセルが毎クロックコピーされるからです。コピーされたイメージをt方向に拡大できる間(dtdy
< (1<<10))は、dtdyはピクセル毎に1テクスチャを貼るように設定されます(1<<10)。コピーモードにおける適切なテクスチャタイプについては、N64プログラミングマニュアルのテクスチャマッピングの章の制約事項を参照してください。テクセルが正しく貼られることを保証するために,テクスチャレクタングルをレンダリングするときにテクスチャパースペクティブは<a href="../gDPSetTexturePersp.htm">gDPSetTexturePersp(3P)</a>コマンドを使用してはずしておかなければなりません。
<BR>
<P>
サイクルタイプがG_CYC_COPYにセットされている場合は、レンダリングモードはZバッファにセットされてはいけません。
<BR>
<P>
また、サイクルタイプがG_CYC_COPYにセットされている場合は、シザーレクタングルはレクタングルをシザリングしません。(4ピクセルの倍数でシザリングされます。)したがって、G_CYC_COPYモードでレンダリングするときはシザリングレクタングルは塗りつぶされるレクタングルと同じかそれ以上の大きさでなければなりません。
<BR>
<P>
1サイクルモード(G_CYC_1CYCLE)あるいは2サイクルモード(G_CYC_2CYCLE)でレンダリングするとき、シザリング長方形は正しく長方形をシザリングします。しかしながら、マクロは<b>gSPScisTextureRectangle(3P)</b>マクロを例外として,負の引数をとりません。長方形の角がスクリーントップの左あるいは上(負の値)にある場合は、<b>gSPScisTextureRectangle(3P)</b>マクロを使用してください。このマクロは動的にのみ使用できます。スタティックなバージョン(例えば<b>gsSPScisTextureRectangle</b>)はありません。
<BR>
<P>
<B>パフォーマンス <BR>
</B>
<P>
長方形レンダリングに関しては特殊な制限があります。完全にスクリーンを塗りつぶすプリミティブはRDPでレンダリングする際に非常に時間がかかります。長方形プリミティブは非常にコンパクト(複雑な形状のポリゴンプリミティブと異なり、1あるいは2*64bit
wordです。)なので、非常に長いレンダリング時間のかかる一連のプリミティブをRDPのFIFOを使って塗りつぶすことが可能です。それらのプリミティブをレンダリングするのでRDPが使用されている間、RSPとCPUは垂直リトレイス時に(オーディオのような)より優先順位の高いプロセスのためにRDPを停止させたり割り込ませたりすることができません。これは長方形の時のみ起こり得ます。スクリーン一杯を塗りつぶす三角形はCPUやRSPを閉め出すほどの大きなFIFOに適合しません。
<BR>
<P>
実際は、オーディオの処理を1/60秒ごとに行うような標準的なフレームスケジューリングアルゴリズムの場合は、8あるいは9以上の連続したフルスクリーン長方形プリミティブはRDPに送るべきではありません。スクリーン一杯ではない長方形あるいは、連続しない長方形コマンド(間にいくつかの他のコマンドやNOOPが入っているもの)は問題ありませんし、フレームレンダリング時間全体を考えると1/60秒を越えませんし、また/あるいはスケジューリングアルゴリズムは(yieldの様に)このケースをハンドリングすることができます。この状況は比較的不自然で、回避できるものなので、RDPの非同期割込の利点を活用するために受け入れることができると判断されます。
<BR>
<P>
<B>参照 <BR>
</B>
<P>
<a href="../gdp/gDPFillRectangle.htm">gDPFillRectangle(3P)</a>, <a href="../gdp/gDPSetScissor.htm">gDPSetScissor(3P)</a>, <a href="../gDPSetTexturePersp.htm">gDPSetTexturePersp(3P)</a>
<BR>
<BR>
</BODY>
</HTML>