Как я могу скопировать части изображения из буфера в текстуру для рендеринга?

Я искал простое решение, но ничего не нашел. В настоящее время я загружаю текстуру из файла и отрисовываю ее в буфер, используя C ++ 2012 Express DirectX9. Но я хочу скопировать части буфера и использовать часть, скопированную в качестве текстуры, вместо загруженной текстуры.

Я хочу иметь возможность копировать / выбирать, как сделал бы редактор карт.

РЕДАКТИРОВАТЬ: проблема решает 🙂 Это были просто глупые ошибки.

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 !!!

РЕДАКТИРОВАТЬ:

Хорошо, я только что ознакомился с тоном вашего кода, и я думаю, что лучшим решением было бы использовать ультрафиолетовые координаты вместо копирования подмножеств текстуры палитры. Вы должны рассчитать соответствующие 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 возможными текстурами ячеек. Каждая текстура 32 х 32. Так tex_w = tex_h = 32;, width = 4 * tex_w; а также height = 3 * tex_h;, Предположим, вы хотите вычислить координаты ультрафиолета для плитки, которая должна быть текстурирована с изображением во втором ряду и третьем столбце палитры. затем 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}).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]