0

簡単な解決策を探し回っていますが、何も見つかりませんでした。現在、ファイルからテクスチャをロードし、C++ 2012 Express DirectX9 を使用してバッファにレンダリングしています。しかし、私がやりたいことは、バッファの一部をコピーし、読み込まれたテクスチャの代わりにコピーされた部分をテクスチャとして使用できるようにすることです。

マップエディタのようにコピー/選択できるようにしたいです。

編集: 問題は解決します:)それはただのばかげた間違いでした。

4

1 に答える 1

0

この関数を使用できますStretchRectドキュメントを参照)。

ソースバッファのサブセットをデスティネーションバッファ全体(この場合は新しいテクスチャのバッファ)にコピーする必要があります。このようなもの:

LPDIRECT3DTEXTURE9 pTexSrc,     // source texture
                   pTexDst;     // new texture (a subset of the source texture)

// create the textures
// ...

LPDIRECT3DSURFACE9 pSrc, pDst;

pTexSrc->GetSurfaceLevel(0, &pSrc);
pTexDst->GetSurfaceLevel(0, &pDst);

RECT rect;   // (x0, y0, x1, y1) - coordinates of the subset to copy
rect.left = x0;
rect.right = x1;
rect.top = y0;
rect.bottom = y1;

pd3dDevice->StretchRect(pSrc, &rect, pDst, NULL, D3DTEXF_NONE);
// the last parameter could be also D3DTEXF_POINT or D3DTEXF_LINEAR

pSrc->Release();
pDst->Release(); // remember to release the surfaces when done !!!

編集:

OK、コードのトーンを確認しました。パレットテクスチャのサブセットをコピーする代わりに、UV座標を使用するのが最善の解決策だと思います。の特定のタイルに適切なUV座標を計算し、game_class:: game_gui_add_current_graphicそれらをCUSTOMVERTEX構造で使用する必要があります。

float width; // the width of the palette texture
float height; // the height of the palette texture
float tex_x, tex_y; // the coordinates of the upper left corner
                    // of the palette texture's subset to use for
                    // the current tile texturing
float tex_w, tex_h; // the width and height of the above mentioned subset

float u0, u1, v0, v1;
u0 = tex_x / width;
v0 = tex_y / height;
u1 = u0 + tex_w / width;
v1 = v0 + tex_h / height;

// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] = {
{ 0.0f, 32.0f, 1.0f, u0, v1, D3DCOLOR_XRGB(255, 0, 0), },
{ 0.0f, 0.0f, 1.0f, u0, v0, D3DCOLOR_XRGB(255, 0, 0), },
{ 32.0f, 32.0f, 1.0f, u1, v1, D3DCOLOR_XRGB(0, 0, 255), },    
{ 32.0f, 0.0f, 1.0f, u1, v0, D3DCOLOR_XRGB(0, 255, 0), } };

例:パレットは、3行4列で構成され、12個の可能なセルテクスチャがあります。各テクスチャは32x32です。したがってtex_w = tex_h = 32;、、width = 4 * tex_w;およびheight = 3 * tex_h;。パレットの2行目と3列目の画像でテクスチャリングする必要があるタイルのUV座標を計算するとします。次にtex_x = (3-1)*tex_w;tex_y = (2-1)*tex_h;。最後に、上記のコードのようにUVを計算します(この例では、{u0、v0、u1、v1} = {(3-1)/ 4、(2-1)/ 3、3 / 4、 2/3} = {0.5、0.33、0.75、0.66})。

于 2012-12-28T22:57:20.033 に答える