2

たとえば、50x50 ピクセルなど、より大きなクワッドで小さな 2x2 ピクセル テクスチャを繰り返したいと考えています。

頂点を設定 -

float X = 100, Y = 100, Width = 50, Height = 50;
float TextureLeft = 0, TextureTop = 0, TextureRight = 25, TextureBottom = 25;

Vertices[0].x = X;
Vertices[0].y = Y + Height;
Vertices[0].z = 0;
Vertices[0].rhw = 1;
Vertices[0].tu = TextureLeft;
Vertices[0].tv = TextureBottom;

Vertices[1].x = X;
Vertices[1].y = Y;
Vertices[1].z = 0;
Vertices[1].rhw = 1;
Vertices[1].tu = TextureLeft;
Vertices[1].tv = TextureTop;

Vertices[2].x = X + Width;
Vertices[2].y = Y;
Vertices[2].z = 0;
Vertices[2].rhw = 1;
Vertices[2].tu = TextureRight;
Vertices[2].tv = TextureTop;

Vertices[3].x = X;
Vertices[3].y = Y + Height;
Vertices[3].z = 0;
Vertices[3].rhw = 1;
Vertices[3].tu = TextureLeft;
Vertices[3].tv = TextureBottom;

Vertices[4].x = X + Width;
Vertices[4].y = Y;
Vertices[4].z = 0;
Vertices[4].rhw = 1;
Vertices[4].tu = TextureRight;
Vertices[4].tv = TextureTop;

Vertices[5].x = X + Width;
Vertices[5].y = Y + Height;
Vertices[5].z = 0;
Vertices[5].rhw = 1;
Vertices[5].tu = TextureRight;
Vertices[5].tv = TextureBottom;

描く -

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 6);

問題は、三角形間のエッジの「グリッチ」です。おそらく頂点座標が間違っているためであり、クワッド境界の「グリッチ」も原因です。

元のテクスチャ - http://i.imgur.com/tNqYePs.png

結果 - http://i.imgur.com/sgUZvqE.png

4

2 に答える 2

1

DrawPrimitive を呼び出す前に、この記事のようにテクスチャ ラッピングをセットアップする必要があります。

// For the textures other than the first one use "D3DVERTEXTEXTURESAMPLER0+index"
YourDevice->SetSamplerState(D3DVERTEXTEXTURESAMPLER0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
YourDevice->SetSamplerState(D3DVERTEXTEXTURESAMPLER0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

対角線のグリッチをなくすには、2 つの三角形の代わりに単一のクワッドを使用できます。

ここではエッジの問題を考えます。各テクスチャ座標に小さなオフセットを追加する必要があります。「小」は、正規化されたピクセルの半分を意味します。テクスチャの解像度が 512x512 の場合、各 u/v 座標に (0.5/512.0) を追加します。

于 2013-06-03T09:50:53.130 に答える