如何将缓冲区中的部分图像复制到要渲染的纹理中?

时间:2012-12-28 22:35:05

标签: c++ directx directx-9

我一直在寻找一个简单的解决方案,但我没有找到任何东西。目前我正在从文件加载纹理并使用C ++ 2012 Express DirectX9将其渲染到缓冲区中。但我想要做的是能够复制部分缓冲区,并使用复制的部分作为纹理,而不是加载的纹理。

我希望能像地图编辑一样复制/选择。

编辑:问题解决:)这只是愚蠢的错误。

1 个答案:

答案 0 :(得分:0)

您可以使用StretchRect功能(see documentation)。

您应该将源缓冲区的子集复制到整个目标缓冲区(在您的情况下是新纹理的缓冲区)。像这样:

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 x 32.所以tex_w = tex_h = 32;width = 4 * tex_w;height = 3 * tex_h;。假设您要计算瓷砖的uv坐标,该瓷砖应使用调色板的第二行和第三列中的图像进行纹理化。然后是tex_x = (3-1)*tex_w;tex_y = (2-1)*tex_h;。最后,你像上面的代码一样计算UVs(在这个例子中你会得到{u0,v0,u1,v1} = {(3-1)/ 4,(2-1)/ 3,3 / 4, 2/3} = {0.5,0.33,0.75,0.66})。