DrawPrimitiveUpを減らすために(2)〜ポリゴンの描き方〜

あらすじ:ポリゴンで2D。


ポリゴンつうても大したことはなく、ポリゴンの各頂点の情報(座標とか)を設定し、それをビデオメモリに流し込めば適当にやってくれます。頂点データの形式には色々あるらしいのですが、大抵のサンプルではTLVERTEXとかいうのを使ってます。データ形式はこんな感じです。

struct tagTLVERTEX 
{ 
 float x,y,z;  ///頂点座標
 float rhw;  //同次座標ベクトル 
 D3DCOLOR color; //頂点の色 
 float u,v;  //uv座標(テクスチャの座標)
} TLVERTEX;
  • x,y,zはお馴染み直交座標。2Dを考えてるので、zは常に1.0を入れておけばいいすね。
  • rhwは同次座標ベクトルとか云うのですが、よく知らん*1。とりあえず1.0を入れておけばいいようだ。
  • colorは色っすね。ARGB*2で指定してやります。基本は、0xffffffff(不透明「白」)でしょうけど、アルファ値を変更してやれば半透明とかできる。
  • u,vは貼り付けるテクスチャの座標を0〜1.0で指定してやる。これをつかえば、テクスチャの一部分だけを使うこともできる。

こいつを使って、

{
  TLVERTEX vertex[3] = // 頂点の配列
  {
    { 0,   0,   1,1,0xffffffff,0,0 },
    { 100, 0,   1,1,0xffffffff,0,0 },
    { 50,  100, 1,1,0xffffffff,0,0 }
  };

  D3DDevice->DrawPrimitiveUp( D3DPT_TRIANGLELIST, 1, vertex, sizeof(TLVERTEX) );  // 頂点をビデオメモリに転送
}

とやってやれば、画面に三角形が表示されます。DrawPrimitiveUp()の引数なんですが、1個目が、「ポリゴンをどう指定するか」で、まあ、三角を送る時はD3DPT_TRIANGLELISTを使うとでも思ってください。2個目がポリゴンの数、ここでは1つ。3個目が転送する頂点のバッファ。4個目が頂点データのサイズ(「TLVERTEXを使うよ〜」と云っている)

テクスチャを表示したい場合はあらかじめテクスチャを設定してやっておけば、DrawPrimitiveUp()をした時に適当に張ってくれる。
ただし、テクスチャを張るなら4角形にしてやりたいところですが、ポリゴンは三角しか使えません*3。ので、三角を2枚合わせて四角にしてあげます。

{
  TLVERTEX vertex[6] = // 頂点の配列
  {
    {   0,   0, 1,1,0xffffffff,0,0 },  // 左上
    { 100,   0, 1,1,0xffffffff,1,0 },  // 右上
    { 100, 100, 1,1,0xffffffff,1,1 },  // 右下

    { 100, 100, 1,1,0xffffffff,1,1 },  // 右下
    {   0, 100, 1,1,0xffffffff,0,1 },  // 左下
    {   0,   0, 1,1,0xffffffff,0,0 }   // 左上
  };

  D3DDevice->SetTexture( 0, pTexture );

  D3DDevice->DrawPrimitiveUp( D3DPT_TRIANGLELIST, 2, vertex, sizeof(TLVERTEX) );  // 頂点をビデオメモリに転送
}

頂点を三角2枚分指定してます。注目して欲しいのは、uvと頂点座標を対応させているところで、こいつをやってあげると、うまい具合にテクスチャが表示されます。で、SetTexture()してあげて(1つ目の引数は気にしない。2つ目がテクスチャのポインタ)、DrawPrimitiveUp()。今度は三角2個なので、ポリゴン数に「2」を指定してます。

これでめでたく、テクスチャが表示されました。

*1:変換行列を使用するのに使うんだそうな。

*2:alpha(透過色), red, green, brue

*3:三角だと3点決めれば一意の平面が得られるとか利点があるため